React动画

前端之家收集整理的这篇文章主要介绍了React动画前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一.React实现动画

1.React通过setState让界面迅速发生变化,但动画的哲学告诉我们,变化要慢,得用一个逐渐变化的过程来过渡,从而帮助用户理解页面.
界面的变化可以分为DOM节点(或组件)的增与减以及DOM节点(或属性)的变化.
其中React提供的ReactCSSTransition能够帮助我们便捷的识别出增加删除的组件,
从而让我们能够专注于更加简单的属性变化的动画.
2.这里统一将缓动函数通过js实现的动画称作js动画,缓动函数由css提供的动画称作css动画.
3.ReactCSSTransition插件就是利用CSS的Transition和animation来实现组件的出场和入场动画.

二.CSS3 transition

1.css3过渡是元素从一种样式逐渐改变为另一种的效果.

  1. .ani2 {
  2. width: 100px;
  3. height: 100px;
  4. border: 1px solid #ccc;
  5. transition: width 1s,transform 1s;
  6. animation: myfirst 3s infinite;
  7. &:hover {
  8. width: 200px;
  9. transform: rotate(360deg);
  10. }
  11. }

三.css3 animation

1.@keyframes用于创建动画,然后捆绑到某个选择器.

  1. @keyframes myfirst {
  2. 0% {
  3. background: #f00;
  4. }
  5. 50% {
  6. background: #0f0;
  7. }
  8. 100% {
  9. background: #ccc;
  10. }
  11. }
  12.  
  13. .ani2 {
  14. width: 100px;
  15. height: 100px;
  16. border: 1px solid #ccc;
  17. transition: width 1s,transform 1s;
  18. animation: myfirst 3s infinite;
  19. &:hover {
  20. width: 200px;
  21. transform: rotate(360deg);
  22. }
  23. }

四.react-addons-css-transition-group插件

1.react-addons-transition-group插件,就是在transition和animation两个css属性上实现的.
2.ReactCSSTransition工作原理
当组件出现时,会在组件添加transitionName-appear,然后下一时刻会给组件添加transitionName-appear-active类,
当组件进场时,给组件添加transitionName-enter类,然后下一时刻会给组件添加transitionName-enter-active类;
当组件出场时,会给组件添加transitionName-leave类,然后下一时刻给组件添加transitionName-leave-active类,
我们则可以在css文件中,通过设置transition,设置我们需要执行的动画.
一般情况下,我们主要使用后两种,并且,只有当组件的出场动画完全执行完以后,组件才会被移除.
2.ReactCSSTransitionGroup组件参数
ReactCSSTransitionGroup其实就是一个组件,他规定了特定的参数,我们通过设置这些特定的参数,将这些参数反应到被其包裹的子组件中.
transitionName:设置动态生成类的自定义前缀.
component:字符串,设置ReactCSSTransition生成包裹子组件的标签,默认时span,我们可以通过这个参数自定义,如div,li
transitionEnter:布尔值,设置是否使用出场动画,默认时true.
transitionEnterTimeout:数值,设置入场动画的执行时间,需要在css中和这里同时设置,否则会提示警告.
transitionLeave:布尔值,默认时true.
transitionLeaveTimeout:数值,设置出场动画的执行时间,否则会提示警告.
3.使用步骤
1.引包

  1. var ReactCSSTransitionGroup = require('react-addons-css-transition-group');

2.将ReactCSSTransition组件添加到render中
ReactCSSTransitionGroup组件需要添加到已经挂载到页面上的dom元素中.

淡入淡出实例

  1. class TodoList extends Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = {
  5. items: ['1111','2222','3333','4444']
  6. };
  7. }
  8. handleAdd = () => {
  9. var newItems = this.state.items.concat([prompt('enter some text')]);
  10. this.setState({
  11. items: newItems
  12. });
  13. }
  14. handleRemove = (i) => {
  15. var newItems = this.state.items.slice();
  16. newItems.splice(i,1);
  17. this.setState({
  18. items: newItems
  19. });
  20. }
  21. render() {
  22. return (
  23. <div>
  24. <button onClick={ this.handleAdd }>Add Item</button>
  25. <ReactCSSTransitionGroup
  26. transitionName="example"
  27. transitionEnterTimeout={ 500 }
  28. transitionLeaveTimeout={ 300 }
  29. >
  30. {
  31. this.state.items.map((item,i) => {
  32. return (
  33. <div key={ i } onClick={ this.handleRemove.bind(this,i) }>
  34. { item }
  35. </div>
  36. )
  37. })
  38. }
  39. </ReactCSSTransitionGroup>
  40. </div>
  41. );
  42. }
  43. }
  44.  
  45. .example-enter {
  46. opacity: 0.01;
  47. }
  48. .example-enter.example-enter-active {
  49. opacity: 1;
  50. transition: opacity 500ms ease-in;
  51. }
  52. .example-leave {
  53. opacity: 1;
  54. }
  55. .example-leave.example-leave-active {
  56. opacity: 0.01;
  57. transition: opacity 300ms ease-in;
  58. }

轮播图实例

  1. class ImageCarousel extends Component {
  2. constructor(props) {
  3. super(props);
  4. this.state = {
  5. a: [
  6. 'https://s1.sonkwo.com/FhXx9C5gqykP4UUJHPKfpS1cexVP','http://7fvk4m.com1.z0.glb.clouddn.com/Fjn9lT9RdzW1dpIJ_7vSrxB4UKNB','http://7fvk4m.com1.z0.glb.clouddn.com/FsDTCVnB9DYkWF-m0p7zNdVfadTg'
  7. ],current: 0
  8. };
  9. }
  10. componentDidMount() {
  11. setInterval(() => {
  12. let current = this.state.current;
  13. current++;
  14. if (current > this.state.a.length - 1) {
  15. current = 0;
  16. }
  17. this.setState({
  18. current
  19. });
  20. },5000);
  21. }
  22. render() {
  23. let { a,current } = this.state;
  24.  
  25. return (
  26. <div className="react-slide">
  27. <ReactCSSTransitionGroup
  28. component={'li'}
  29. transitionName="carousel"
  30. transitionEnterTimeout={ 1000 }
  31. transitionLeaveTimeout={ 1000 }
  32. >
  33. <img src={ a[current] } key={ a[current] } />
  34. </ReactCSSTransitionGroup>
  35. </div>
  36. );
  37. }
  38. }
  39.  
  40. .react-slide {
  41. li {
  42. width: 440px;
  43. height: 260px;
  44. overflow: hidden;
  45. }
  46.  
  47. .carousel-enter {
  48. opacity: 0.01;
  49. }
  50. .carousel-enter.carousel-enter-active {
  51. opacity: 1;
  52. transition: opacity 1s ease-in-out;
  53. }
  54. .carousel-leave {
  55. opacity: 1;
  56. }
  57. .carousel-leave.carousel-leave-active {
  58. opacity: 0.01;
  59. transition: opacity 1s ease-in-out;
  60. }
  61. }

猜你在找的React相关文章