梓彤 發表於 2019-8-8 16:22:00

React之动画实现

<h1 style="text-align: center">React之动画实现</h1>
<h2>一,介绍与需求</h2>
<h3>1.1,介绍</h3>
<p>1,Ant Motion</p>
<p>Ant Motion能够快速在 React 框架中使用动画。在 React 框架下,只需要一段简单的代码就可以实现动画效果</p>
<p>2,SVG&nbsp;</p>
<ul>
<li>SVG 指可伸缩矢量图形 (Scalable Vector Graphics)</li>
<li>SVG 用来定义用于网络的基于矢量的图形</li>
<li>SVG 使用 XML 格式定义图形</li>
<li>SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失</li>
<li>SVG 是万维网联盟的标准</li>
<li>SVG 与诸如 DOM 和 XSL 之类的 W3C 标准是一个整体</li>
</ul>
<h3>1.2,需求</h3>
<p>提高网站的交互效果,提高用户体验。界面动效能加强用户认知且增加活力。</p>
<h2>二,基于Ant Motion的react动画</h2>
<h3>2.1,动画效果</h3>
<p>1,snow掉落效果</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201812/1040068-20181219165254705-1420020713.gif" alt=""></p>
<p>2,聚集与散开</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201812/1040068-20181219165714178-554975988.gif" alt=""></p>
<h3>&nbsp;2.2,动画实现方式</h3>
<p>以掉落效果为例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import Snow from './Snow'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> import './index.less'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">class App extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">constructor() {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    super(...arguments);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   <span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>       show: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">    };
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   onEnd = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">13</span>       show: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">render() {
</span><span style="color: rgba(0, 128, 128, 1)">17</span>   const children = Array(5).fill(1).map((c, i) =&gt;<span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">18</span>       &lt;div key={i} className="addMoneyAnim" style={{ animationDelay: `${-Math.random() * 0.6}s` }} /&gt;
<span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">    ));
</span><span style="color: rgba(0, 128, 128, 1)">20</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">21</span>       &lt;div className="snow-demo-wrapper" &gt;
<span style="color: rgba(0, 128, 128, 1)">22</span>       &lt;div className="snow-demo"&gt;
<span style="color: rgba(0, 128, 128, 1)">23</span>      
<span style="color: rgba(0, 128, 128, 1)">24</span>         &lt;Snow onEnd={<span style="color: rgba(0, 0, 255, 1)">this</span>.onEnd} &gt;
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">            {children}
</span><span style="color: rgba(0, 128, 128, 1)">26</span>         &lt;/Snow&gt;
<span style="color: rgba(0, 128, 128, 1)">27</span>         
<span style="color: rgba(0, 128, 128, 1)">28</span>       &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">29</span>   &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)">    );
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">32</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">33</span>
<span style="color: rgba(0, 128, 128, 1)">34</span> export <span style="color: rgba(0, 0, 255, 1)">default</span> App;</pre>
</div>
<p>组件snow代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span>   import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">2</span>   import TweenOne from 'rc-tween-one'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">3</span>   import BezierPlugin from 'rc-tween-one/lib/plugin/BezierPlugin'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">4</span>   import PropTypes from 'prop-types'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">5</span>   
<span style="color: rgba(0, 128, 128, 1)">6</span>   import './index.less'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">7</span>   
<span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 0, 1)">TweenOne.plugins.push(BezierPlugin);
</span><span style="color: rgba(0, 128, 128, 1)">9</span>   
<span style="color: rgba(0, 128, 128, 1)"> 10</span> <span style="color: rgba(0, 0, 0, 1)">class Snow extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 11</span>   static propTypes =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 12</span> <span style="color: rgba(0, 0, 0, 1)">      children: PropTypes.any,
</span><span style="color: rgba(0, 128, 128, 1)"> 13</span> <span style="color: rgba(0, 0, 0, 1)">      className: PropTypes.string,
</span><span style="color: rgba(0, 128, 128, 1)"> 14</span> <span style="color: rgba(0, 0, 0, 1)">      prefixCls: PropTypes.string,
</span><span style="color: rgba(0, 128, 128, 1)"> 15</span> <span style="color: rgba(0, 0, 0, 1)">      amount: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 16</span> <span style="color: rgba(0, 0, 0, 1)">      repeat: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 17</span> <span style="color: rgba(0, 0, 0, 1)">      ease: PropTypes.string,
</span><span style="color: rgba(0, 128, 128, 1)"> 18</span> <span style="color: rgba(0, 0, 0, 1)">      startArea: PropTypes.object,
</span><span style="color: rgba(0, 128, 128, 1)"> 19</span> <span style="color: rgba(0, 0, 0, 1)">      endArea: PropTypes.object,
</span><span style="color: rgba(0, 128, 128, 1)"> 20</span> <span style="color: rgba(0, 0, 0, 1)">      startDelayRandom: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 21</span> <span style="color: rgba(0, 0, 0, 1)">      basicToDuration: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 22</span> <span style="color: rgba(0, 0, 0, 1)">      randomToDuration: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 23</span> <span style="color: rgba(0, 0, 0, 1)">      rotateRandom: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 24</span> <span style="color: rgba(0, 0, 0, 1)">      bezierSegmentation: PropTypes.number,
</span><span style="color: rgba(0, 128, 128, 1)"> 25</span> <span style="color: rgba(0, 0, 0, 1)">      onEnd: PropTypes.func,
</span><span style="color: rgba(0, 128, 128, 1)"> 26</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>   static defaultProps =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span>       prefixCls: 'snow'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span>       amount: 10<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span>       repeat: 0<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span>       ease: 'linear'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span> <span style="color: rgba(0, 0, 0, 1)">      startArea: {
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span>         x: 0, y: -200, width: '100%', height: 50<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span> <span style="color: rgba(0, 0, 0, 1)">      },
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span> <span style="color: rgba(0, 0, 0, 1)">      endArea: {
</span><span style="color: rgba(0, 128, 128, 1)"> 36</span>         x: -200, y: '100%', width: '120%', height: 100<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span> <span style="color: rgba(0, 0, 0, 1)">      },
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span>       basicToDuration: 1200<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span>       randomToDuration: 800<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span>       startDelayRandom: 800<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span>       rotateRandom: 180<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span>       bezierSegmentation: 2<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span>       onEnd: () =&gt;<span style="color: rgba(0, 0, 0, 1)"> { },
</span><span style="color: rgba(0, 128, 128, 1)"> 44</span> <span style="color: rgba(0, 0, 0, 1)">    };
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span>   
<span style="color: rgba(0, 128, 128, 1)"> 46</span> <span style="color: rgba(0, 0, 0, 1)">    constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span> <span style="color: rgba(0, 0, 0, 1)">      super(props);
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span>         children: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span> <span style="color: rgba(0, 0, 0, 1)">      };
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span> <span style="color: rgba(0, 0, 0, 1)">    componentDidMount() {
</span><span style="color: rgba(0, 128, 128, 1)"> 53</span>       <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setChilrenToState();
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span>   
<span style="color: rgba(0, 128, 128, 1)"> 56</span>   onAnimEnd = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span>       <span style="color: rgba(0, 0, 255, 1)">this</span>.animEnd += 1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span>       <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span>.animEnd &gt;= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.amount) {
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span>         <span style="color: rgba(0, 0, 255, 1)">this</span>.animEnd = 0<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.onEnd) {
</span><span style="color: rgba(0, 128, 128, 1)"> 61</span>         <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.onEnd();
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span>   
<span style="color: rgba(0, 128, 128, 1)"> 66</span> <span style="color: rgba(0, 0, 0, 1)">    setChilrenToState() {
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span>       const children = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getChildrenToRender();
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>       <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span> <span style="color: rgba(0, 0, 0, 1)">      children,
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span> <span style="color: rgba(0, 0, 0, 1)">      });
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span>   
<span style="color: rgba(0, 128, 128, 1)"> 73</span>   getChildrenToRender = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 74</span> <span style="color: rgba(0, 0, 0, 1)">      const {
</span><span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 0, 1)">      bezierSegmentation, basicToDuration, randomToDuration,
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span> <span style="color: rgba(0, 0, 0, 1)">      amount, ease, startDelayRandom, repeat, rotateRandom,
</span><span style="color: rgba(0, 128, 128, 1)"> 77</span>       } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span>       const children = React.Children.toArray(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.children);
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span>       const rect = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.wrapperDom.getBoundingClientRect();
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span>       const startArea = <span style="color: rgba(0, 0, 255, 1)">this</span>.dataToNumber(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.startArea, rect);
</span><span style="color: rgba(0, 128, 128, 1)"> 81</span>       const endArea = <span style="color: rgba(0, 0, 255, 1)">this</span>.dataToNumber(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props.endArea, rect);
</span><span style="color: rgba(0, 128, 128, 1)"> 82</span>       <span style="color: rgba(0, 0, 255, 1)">return</span> Array(amount).fill(1).map((k, i) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 83</span>         const item = children;
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span>         const vars = Array(bezierSegmentation).fill(1).map((c, j) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span>         const hegiht = endArea.y - startArea.y -<span style="color: rgba(0, 0, 0, 1)"> startArea.height;
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span>         const y = (hegiht / bezierSegmentation) * (j + 1<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>         const x = Math.random() *<span style="color: rgba(0, 0, 0, 1)"> (Math.max(startArea.width, endArea.width)
</span><span style="color: rgba(0, 128, 128, 1)"> 88</span>             +<span style="color: rgba(0, 0, 0, 1)"> Math.min(startArea.x, endArea.x));
</span><span style="color: rgba(0, 128, 128, 1)"> 89</span>         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> console.log(hegiht, startArea, endArea, y);</span>
<span style="color: rgba(0, 128, 128, 1)"> 90</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 91</span> <span style="color: rgba(0, 0, 0, 1)">            y,
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span> <span style="color: rgba(0, 0, 0, 1)">            x,
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span> <span style="color: rgba(0, 0, 0, 1)">          };
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span> <span style="color: rgba(0, 0, 0, 1)">      });
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>         const delay = Math.random() *<span style="color: rgba(0, 0, 0, 1)"> startDelayRandom;
</span><span style="color: rgba(0, 128, 128, 1)"> 96</span>         const animation =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 0, 1)">          bezier: {
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>             type: 'soft'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)"> 99</span>             autRotate: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">100</span> <span style="color: rgba(0, 0, 0, 1)">            vars,
</span><span style="color: rgba(0, 128, 128, 1)">101</span> <span style="color: rgba(0, 0, 0, 1)">          },
</span><span style="color: rgba(0, 128, 128, 1)">102</span> <span style="color: rgba(0, 0, 0, 1)">          ease,
</span><span style="color: rgba(0, 128, 128, 1)">103</span> <span style="color: rgba(0, 0, 0, 1)">          repeat,
</span><span style="color: rgba(0, 128, 128, 1)">104</span> <span style="color: rgba(0, 0, 0, 1)">          repeatDelay: delay,
</span><span style="color: rgba(0, 128, 128, 1)">105</span> <span style="color: rgba(0, 0, 0, 1)">          delay,
</span><span style="color: rgba(0, 128, 128, 1)">106</span>         duration: basicToDuration + Math.random() *<span style="color: rgba(0, 0, 0, 1)"> randomToDuration,
</span><span style="color: rgba(0, 128, 128, 1)">107</span>         onComplete: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.onAnimEnd,
</span><span style="color: rgba(0, 128, 128, 1)">108</span> <span style="color: rgba(0, 0, 0, 1)">      };
</span><span style="color: rgba(0, 128, 128, 1)">109</span>         const style =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">110</span>         transform: `translate(${Math.random() * (startArea.width) +<span style="color: rgba(0, 0, 0, 1)"> startArea.x}px, ${
</span><span style="color: rgba(0, 128, 128, 1)">111</span>             Math.random() * (startArea.height) +<span style="color: rgba(0, 0, 0, 1)"> startArea.y
</span><span style="color: rgba(0, 128, 128, 1)">112</span> <span style="color: rgba(0, 0, 0, 1)">          }px)`,
</span><span style="color: rgba(0, 128, 128, 1)">113</span> <span style="color: rgba(0, 0, 0, 1)">      };
</span><span style="color: rgba(0, 128, 128, 1)">114</span>         const child = rotateRandom ?<span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">115</span>         &lt;<span style="color: rgba(0, 0, 0, 1)">TweenOne
</span><span style="color: rgba(0, 128, 128, 1)">116</span>             className="snowRotate"
<span style="color: rgba(0, 128, 128, 1)">117</span>             style={{ transform: `rotate(${Math.random() *<span style="color: rgba(0, 0, 0, 1)"> rotateRandom}deg)` }}
</span><span style="color: rgba(0, 128, 128, 1)">118</span>             animation=<span style="color: rgba(0, 0, 0, 1)">{{
</span><span style="color: rgba(0, 128, 128, 1)">119</span>               rotate: 0<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">120</span>               duration: animation.duration * 4 / 5<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">121</span> <span style="color: rgba(0, 0, 0, 1)">            delay: animation.delay,
</span><span style="color: rgba(0, 128, 128, 1)">122</span> <span style="color: rgba(0, 0, 0, 1)">            repeat: animation.repeat,
</span><span style="color: rgba(0, 128, 128, 1)">123</span> <span style="color: rgba(0, 0, 0, 1)">            }}
</span><span style="color: rgba(0, 128, 128, 1)">124</span>         &gt;
<span style="color: rgba(0, 128, 128, 1)">125</span> <span style="color: rgba(0, 0, 0, 1)">            {item}
</span><span style="color: rgba(0, 128, 128, 1)">126</span>         &lt;/TweenOne&gt;
<span style="color: rgba(0, 128, 128, 1)">127</span> <span style="color: rgba(0, 0, 0, 1)">      ) : item;
</span><span style="color: rgba(0, 128, 128, 1)">128</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">129</span>         &lt;<span style="color: rgba(0, 0, 0, 1)">TweenOne
</span><span style="color: rgba(0, 128, 128, 1)">130</span>             animation=<span style="color: rgba(0, 0, 0, 1)">{animation}
</span><span style="color: rgba(0, 128, 128, 1)">131</span>             style=<span style="color: rgba(0, 0, 0, 1)">{style}
</span><span style="color: rgba(0, 128, 128, 1)">132</span>             key={`${item}-<span style="color: rgba(0, 0, 0, 1)">${i.toString()}`}
</span><span style="color: rgba(0, 128, 128, 1)">133</span>             className="snowChild"
<span style="color: rgba(0, 128, 128, 1)">134</span>         &gt;
<span style="color: rgba(0, 128, 128, 1)">135</span> <span style="color: rgba(0, 0, 0, 1)">            {child}
</span><span style="color: rgba(0, 128, 128, 1)">136</span>         &lt;/TweenOne&gt;
<span style="color: rgba(0, 128, 128, 1)">137</span> <span style="color: rgba(0, 0, 0, 1)">      );
</span><span style="color: rgba(0, 128, 128, 1)">138</span> <span style="color: rgba(0, 0, 0, 1)">      });
</span><span style="color: rgba(0, 128, 128, 1)">139</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">140</span>   dataToNumber = (obj, rect) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">141</span>       const toNumber = (v, full) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">142</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">typeof</span> v === 'number'<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">143</span>         <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> v;
</span><span style="color: rgba(0, 128, 128, 1)">144</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">145</span>         const unit = v.replace(//g, ''<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">146</span>         <span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (unit) {
</span><span style="color: rgba(0, 128, 128, 1)">147</span>         <span style="color: rgba(0, 0, 255, 1)">case</span> '%'<span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">148</span>             <span style="color: rgba(0, 0, 255, 1)">return</span> parseFloat(v) * full / 100<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">149</span>         <span style="color: rgba(0, 0, 255, 1)">case</span> 'em'<span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">150</span>             <span style="color: rgba(0, 0, 255, 1)">return</span> parseFloat(v) * 16<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">151</span>         <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">152</span>             <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">153</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">154</span> <span style="color: rgba(0, 0, 0, 1)">      };
</span><span style="color: rgba(0, 128, 128, 1)">155</span>       <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">156</span> <span style="color: rgba(0, 0, 0, 1)">      x: toNumber(obj.x, rect.width),
</span><span style="color: rgba(0, 128, 128, 1)">157</span> <span style="color: rgba(0, 0, 0, 1)">      y: toNumber(obj.y, rect.height),
</span><span style="color: rgba(0, 128, 128, 1)">158</span> <span style="color: rgba(0, 0, 0, 1)">      width: toNumber(obj.width, rect.width),
</span><span style="color: rgba(0, 128, 128, 1)">159</span> <span style="color: rgba(0, 0, 0, 1)">      height: toNumber(obj.height, rect.height),
</span><span style="color: rgba(0, 128, 128, 1)">160</span> <span style="color: rgba(0, 0, 0, 1)">      };
</span><span style="color: rgba(0, 128, 128, 1)">161</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">162</span>   animEnd = 0<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">163</span> <span style="color: rgba(0, 0, 0, 1)">    render() {
</span><span style="color: rgba(0, 128, 128, 1)">164</span>       const { prefixCls, ...props } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
</span><span style="color: rgba(0, 128, 128, 1)">165</span>       const { children } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.state;
</span><span style="color: rgba(0, 128, 128, 1)">166</span> <span style="color: rgba(0, 0, 0, 1)">      [
</span><span style="color: rgba(0, 128, 128, 1)">167</span>         'amount'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">168</span>         'repeat'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">169</span>         'ease'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">170</span>         'startArea'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">171</span>         'endArea'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">172</span>         'basicToDuration'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">173</span>         'randomToDuration'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">174</span>         'startDelayRandom'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">175</span>         'bezierSegmentation'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">176</span>         'rotateRandom'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">177</span>         'onEnd'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">178</span>       ].forEach(k =&gt; <span style="color: rgba(0, 0, 255, 1)">delete</span><span style="color: rgba(0, 0, 0, 1)"> props);
</span><span style="color: rgba(0, 128, 128, 1)">179</span>       const className = `${prefixCls}${props.className ? ` ${props.className}` : ''<span style="color: rgba(0, 0, 0, 1)">}`;
</span><span style="color: rgba(0, 128, 128, 1)">180</span>       <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">181</span>         &lt;<span style="color: rgba(0, 0, 0, 1)">div
</span><span style="color: rgba(0, 128, 128, 1)">182</span> <span style="color: rgba(0, 0, 0, 1)">          {...props}
</span><span style="color: rgba(0, 128, 128, 1)">183</span>         ref={(c) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">184</span>             <span style="color: rgba(0, 0, 255, 1)">this</span>.wrapperDom =<span style="color: rgba(0, 0, 0, 1)"> c;
</span><span style="color: rgba(0, 128, 128, 1)">185</span> <span style="color: rgba(0, 0, 0, 1)">          }}
</span><span style="color: rgba(0, 128, 128, 1)">186</span>         className=<span style="color: rgba(0, 0, 0, 1)">{className}
</span><span style="color: rgba(0, 128, 128, 1)">187</span>         &gt;
<span style="color: rgba(0, 128, 128, 1)">188</span> <span style="color: rgba(0, 0, 0, 1)">          {children}
</span><span style="color: rgba(0, 128, 128, 1)">189</span>         &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">190</span> <span style="color: rgba(0, 0, 0, 1)">      );
</span><span style="color: rgba(0, 128, 128, 1)">191</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">192</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">193</span>   export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> Snow
</span><span style="color: rgba(0, 128, 128, 1)">194</span>   </pre>
</div>
<p>样式代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> .snow-demo-<span style="color: rgba(0, 0, 0, 1)">wrapper {
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">background: #DFEAFF;
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">overflow: hidden;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)">height: 500px;
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">display: flex;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   align-<span style="color: rgba(0, 0, 0, 1)">items: center;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)">position: relative;
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> .snow-<span style="color: rgba(0, 0, 0, 1)">demo {
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">width: 300px;
</span><span style="color: rgba(0, 128, 128, 1)">12</span>   height: <span style="color: rgba(128, 0, 128, 1)">90</span>%<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">margin: auto;
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">position: relative;
</span><span style="color: rgba(0, 128, 128, 1)">15</span>   background-image: url(https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">gw.alipayobjects.com/zos/rmsportal/dNpuKMDHFEpMGrTxdLVR.jpg);</span>
<span style="color: rgba(0, 128, 128, 1)">16</span>   background-<span style="color: rgba(0, 0, 0, 1)">position: top;
</span><span style="color: rgba(0, 128, 128, 1)">17</span>   background-size: <span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)"> auto;
</span><span style="color: rgba(0, 128, 128, 1)">18</span>   box-shadow: <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> 32px rgba(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0.15</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">.snow {
</span><span style="color: rgba(0, 128, 128, 1)">22</span>   width: <span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">23</span>   height: <span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">25</span>   top: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">overflow: hidden;
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">28</span>
<span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)">.snowChild {
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)">position: absolute;
</span><span style="color: rgba(0, 128, 128, 1)">31</span>   top: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">32</span>   left: <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">34</span>
<span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 0, 1)">.snowRotate {
</span><span style="color: rgba(0, 128, 128, 1)">36</span>   transform-<span style="color: rgba(0, 0, 0, 1)">origin: center center;
</span><span style="color: rgba(0, 128, 128, 1)">37</span> } </pre>
</div>
<h3>&nbsp;2.3,动画分类</h3>
<p style="margin-left: 30px">1,单元素动画rc-tween-one</p>
<div class="cnblogs_code" style="margin-left: 30px">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install rc-tween-one --save</pre>
</div>
<p style="margin-left: 30px">2,css样式动画rc-animate</p>
<div class="cnblogs_code" style="margin-left: 30px">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install rc-animate --save</pre>
</div>
<p style="margin-left: 30px">3,QueueAnim进出场动画</p>
<div class="cnblogs_code" style="margin-left: 30px">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install rc-queue-anim --save</pre>
</div>
<p style="margin-left: 30px">4,TextyAnim文字动画</p>
<div class="cnblogs_code" style="margin-left: 30px">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install rc-texty --save</pre>
</div>
<p style="margin-left: 30px">5,ScrollAnim页面滚动动画</p>
<div class="cnblogs_code" style="margin-left: 30px">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install rc-scroll-anim --save</pre>
</div>
<p style="margin-left: 30px">6,Banner动画</p>
<div class="cnblogs_code" style="margin-left: 30px">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> cnpm install rc-banner-anim --save</pre>
</div>
<p style="margin-left: 30px">详细动画实例可查看官网</p>
<h2>三,基于svg的react动画</h2>
<h3>3.1,动画效果</h3>
<p>鼠标移入动画执行,鼠标移出动画停止</p>
<p>1,纵队动画</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201812/1040068-20181219161046766-1542391730.gif" alt=""></p>
<p>2,俄罗斯方块</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201812/1040068-20181219161536165-788379612.gif" alt=""></p>
<p>3,坐标动画</p>
<p><img src="https://img2018.cnblogs.com/blog/1040068/201812/1040068-20181219161730928-2047126497.gif" alt=""></p>
<p>&nbsp;</p>
<h3>3.2,动画实现方式</h3>
<p><strong>以纵队动画为例如下代码:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import Column from '../technology/Column';<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">实现动画的svg组件</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class ReactAnimation extends React.Component {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">constructor(props) {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    super(props);
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   <span style="color: rgba(0, 0, 255, 1)">this</span>.state =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span>       hover: <span style="color: rgba(0, 0, 255, 1)">null</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否有鼠标的移入</span>
<span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">    };
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">11</span>
<span style="color: rgba(0, 128, 128, 1)">12</span>   onMouseEnter = (hover) =&gt; {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">鼠标移入</span>
<span style="color: rgba(0, 128, 128, 1)">13</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">      hover,
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">17</span>   onMouseLeave = () =&gt; {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">鼠标移出</span>
<span style="color: rgba(0, 128, 128, 1)">18</span>   <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setState({
</span><span style="color: rgba(0, 128, 128, 1)">19</span>       hover: <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">};
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">render() {
</span><span style="color: rgba(0, 128, 128, 1)">23</span>
<span style="color: rgba(0, 128, 128, 1)">24</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">25</span>       &lt;div&gt;
<span style="color: rgba(0, 128, 128, 1)">26</span>          &lt;<span style="color: rgba(0, 0, 0, 1)">div
</span><span style="color: rgba(0, 128, 128, 1)">27</span>             onMouseEnter={() =&gt; { <span style="color: rgba(0, 0, 255, 1)">this</span>.onMouseEnter(1<span style="color: rgba(0, 0, 0, 1)">); }}
</span><span style="color: rgba(0, 128, 128, 1)">28</span>             onMouseLeave={<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.onMouseLeave}
</span><span style="color: rgba(0, 128, 128, 1)">29</span>         &gt;
<span style="color: rgba(0, 128, 128, 1)">30</span>          &lt;div&gt;
<span style="color: rgba(0, 128, 128, 1)">31</span>               {Column &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> React.createElement(Column, {
</span><span style="color: rgba(0, 128, 128, 1)">32</span>               hover:<span style="color: rgba(0, 0, 255, 1)">this</span>.state.hover === 1<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 0, 0, 1)">            })}
</span><span style="color: rgba(0, 128, 128, 1)">34</span>             &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">35</span>             &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">36</span>       &lt;/div&gt;
<span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)">    );
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">39</span> }</pre>
</div>
<p>React.createElement(): 根据指定的第一个参数创建一个React元素。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">React.createElement(
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">type,
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 0, 1)">[...children]
</span><span style="color: rgba(0, 128, 128, 1)">5</span> )</pre>
</div>
<p>第一个参数是必填,传入的是似HTML标签名称,如: ul, li&nbsp;<br>第二个参数是选填,表示的是属性,如: className&nbsp;<br>第三个参数是选填, 子节点,如: 要显示的文本内容</p>
<p><strong>SVG配置组件Column.jsx:</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> import React from 'react'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> import TweenOne from 'rc-tween-one';<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">引入动画插件</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span>
<span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> TweenOneG(props) {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span>   <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getAnimation() {
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> props.animation.map((item, i) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>       <span style="color: rgba(0, 0, 255, 1)">return</span> { ...item, duration: 400<span style="color: rgba(0, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">    });
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">11</span>   &lt;<span style="color: rgba(0, 0, 0, 1)">TweenOne
</span><span style="color: rgba(0, 128, 128, 1)">12</span>       component="g"
<span style="color: rgba(0, 128, 128, 1)">13</span> <span style="color: rgba(0, 0, 0, 1)">      {...props}
</span><span style="color: rgba(0, 128, 128, 1)">14</span>       animation=<span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 128, 128, 1)">15</span>         props.animation ?
<span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">          getAnimation() :
</span><span style="color: rgba(0, 128, 128, 1)">17</span>         <span style="color: rgba(0, 0, 255, 1)">null</span>
<span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">19</span>   /&gt;);
<span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> export <span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> class Column extends React.PureComponent {
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">render() {
</span><span style="color: rgba(0, 128, 128, 1)">24</span>   const { hover } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.props;
</span><span style="color: rgba(0, 128, 128, 1)">25</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span><span style="color: rgba(0, 128, 128, 1)">26</span>       &lt;svg width="328px" height="150px" viewBox="0 0 328 150"&gt;
<span style="color: rgba(0, 128, 128, 1)">27</span>         &lt;defs&gt;
<span style="color: rgba(0, 128, 128, 1)">28</span>         &lt;linearGradient x1="50%" y1="3.05125957%" x2="50%" y2="157.404891%" id="linearGradient-1"&gt;
<span style="color: rgba(0, 128, 128, 1)">29</span>             &lt;stop stopColor="#2898FF" offset="0%" /&gt;
<span style="color: rgba(0, 128, 128, 1)">30</span>         &lt;/linearGradient&gt;
<span style="color: rgba(0, 128, 128, 1)">31</span>         &lt;/defs&gt;
<span style="color: rgba(0, 128, 128, 1)">32</span>         &lt;g id="Page-1" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd"&gt;
<span style="color: rgba(0, 128, 128, 1)">33</span>         &lt;TweenOneG animation={hover ? [{ y: -20 }, { y: -10 }, { y: -30 }] : <span style="color: rgba(0, 0, 255, 1)">this</span>.default1Anim}&gt;
<span style="color: rgba(0, 128, 128, 1)">34</span>             &lt;g id="Group-33" transform="translate(0.000000, 116.000000)"&gt;
<span style="color: rgba(0, 128, 128, 1)">35</span>               &lt;rect id="Rectangle-15" fill="#1890FF" opacity="0.03" x="0" y="2" width="20" height="145" /&gt;
<span style="color: rgba(0, 128, 128, 1)">36</span>             &lt;/g&gt;
<span style="color: rgba(0, 128, 128, 1)">37</span>         &lt;/TweenOneG&gt;
<span style="color: rgba(0, 128, 128, 1)">38</span>         &lt;/g&gt;
<span style="color: rgba(0, 128, 128, 1)">39</span>       &lt;/svg&gt;);
<span style="color: rgba(0, 128, 128, 1)">40</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">41</span> }</pre>
</div>
<p>&nbsp;上面展示的只是部分代码,如需完整的代码,请先留言评论加关注</p><br><br>
来源:https://www.cnblogs.com/jackson-yqj/p/10143766.html
頁: [1]
查看完整版本: React之动画实现