如何动画svg矩形像音乐波一样增长?

时间:2016-12-25 05:53:01

标签: animation svg svg-animate

我有以下代码,

<div id="akbar">
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
     width="400" height="200" viewBox="0 0 400 200">
    <g transform="scale(1,-1) translate(0,-200)">
      <rect x="50" y="0" fill="#f00" width="100" height="100">
        <animate attributeName="height" 
                 from="0" 
                 to="100" 
                 dur="0.5s" 
                 fill="freeze" />
      </rect>
      <rect x="150" y="0" fill="#f70" width="100" height="200">
        <animate 
                 attributeName="height" 
                 from="0" 
                 to="200" 
                 dur="0.5s" 
                 fill="freeze" />
      </rect>
      <rect x="250" y="0" fill="#ec0" width="100" height="150">
        <animate 
                 attributeName="height" 
                 from="0" 
                 to="150" 
                 dur="0.5s" 
                 fill="freeze" />
      </rect>
    </g>
  </svg>
</div>

我想让svg矩形动画像音乐波一样增长。

我怎样才能做到这一点?

我需要this behavior

1 个答案:

答案 0 :(得分:1)

您可以使用

来实现它
  • values
  • keyTimes
  • keySplines

<animate>标记的属性。

JSfiddle example

我仅将您的示例剥离为单列:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg"
 width="400" height="200" viewBox="0 0 400 200">
  <g transform="scale(1,-1) translate(0,-200)">
    <rect x="50" y="0" fill="#f00" width="100" height="100">
      <animate 
        attributeName="height" 
        from="0"
        to="100" 
        dur="1s" 
        fill="freeze"
        values="0; 200; 150; 160; 150; 160"
        keyTimes="0; 0.2; 0.4; 0.6; 0.8; 1"
        keySplines=".42 0 1 1;
                    0 0 .59 1;
                    .42 0 1 1;
                    0 0 .59 1;
                    .42 0 1 1;
                    0 0 .59 1;"
      />
    </rect>
  </g>
</svg>

由于它还不完美,你可以使用属性来更好地调整时间(特别是keySplines)并使音乐波像更多。

正如您在提供的示例中所看到的,单列的移动步骤是:

  1. 一路从下到上
  2. 然后,从顶部到高度的~83%
  3. 然后,从~83%到~88%
  4. 然后,从~88%到~83%
  5. 然后,从~83%到~88%
  6. 我想增加那些重复百分比数字(83和88)之间的差异会给你带来稍微好一点的影响(基于75%和80%,更容易在widht: 200px上计算),但是它很接近。

    另请参阅关于SVG动画的CSS tricks article,它非常详尽,涵盖了有关所提及属性的所有细节 - 等等。

相关问题