• animate: 相当于 CSS 中的 transition
  • animateTransform: 相当于 CSS 中的 transform

01 Animate

  1. <rect x="10" y="10" width="200" height="20" stroke="black" fill="none">
  2. <animate
  3. attributeName="width" // 指定某一个属性将会做如下的动画
  4. attributeType="XML" // svg的格式
  5. from="200" to="20" // 变化的规则
  6. begin="0s" dur="5s" // 时间的规则
  7. fill="freeze" /> // 填充的格式
  8. </rect>

通过将animate 标签嵌套在指定的图形里面,即可实现变换的效果。另外,还有animateTransform,它主要是用来做变形动画的。

02 AnimateTransform

  1. <rect x="-10" y="-10" width="20" height="20"
  2. style="fill: #ff9; stroke: black;">
  3. <animateTransform attributeType="XML"
  4. attributeName="transform" type="scale"
  5. from="1" to="4 2"
  6. begin="0s" dur="4s" fill="freeze"/>
  7. </rect>

基本图形元素, , Animate&AnimateTransform - 图1, , , , , , , ,

元素 元素 说法
动画元素放在形状元素的内部,用来定义一个元素的某个属性如何踩着时点改变。在指定持续时间里,属性从开始值变成结束值。

attributeName
path元素是用来定义形状的通用元素。所有的基本形状都可以用path元素来创建。
use元素在SVG文档内取得目标节点,并在别的地方复制它们。它的效果等同于这些节点被深克隆到一个不可见的DOM中,然后将其粘贴到use元素的位置,很像HTML5中的克隆模板元素。因为克隆的节点是不可见的,所以当使用CSS样式化一个use元素以及它的隐藏的后代元素的时候,必须小心注意。隐藏的、克隆的DOM不能保证继承CSS属性,除非你明文设置使用CSS继承





black
贝塞尔曲线

03 animate morph

元素 用法 说法
attributeName 用于确定动画的改变的原svg对应的某一个值
dur 一个周期内动画所花费的时间
repeatCount 重复类型 indefinite |
keyTimes 可以理解为ae中的关键帧
calcMode 用来定义动画具体的插值模型。类似于ae中可以定义渐进渐出的效果 discrete | linear[default] | paced | spline
keySplines 如果calcmode设置为spline的时候需要设置对应贝塞尔曲线的格式需要在每一个keytime的时候会需要一个贝塞尔曲线的插值 使用格式是通过 ; 来分隔每一个值 keySplines = “.31,.57,.93,.46;”
value 直接结合 attributeName 属性,来设置具体的值,每个值之间使用 ; 进行分隔。
  1. <path fill="#1EB287">
  2. <animate
  3. attributeName="d"
  4. dur="1440ms"
  5. repeatCount="indefinite"
  6. keyTimes="0; .0625; .208333333; .3125; .395833333; .645833333; .833333333; 1"
  7. calcMode="spline"
  8. keySplines="0,0,1,1; .42,0,.58,1; .42,0,1,1; 0,0,.58,1; .42,0,.58,1; .42,0,.58,1; .42,0,.58,1"
  9. values="M 0,0 C 50,0 50,0 100,0 100,50 100,50 100,100 50,100 50,100 0,100 0,50 0,50 0,0 Z;
  10. M 0,0 C 50,0 50,0 100,0 100,50 100,50 100,100 50,100 50,100 0,100 0,50 0,50 0,0 Z;
  11. M 50,0 C 75,25 75,25 100,50 75,75 75,75 50,100 25,75 25,75 0,50 25,25 25,25 50,0 Z;
  12. M 25,50 C 37.5,25 37.5,25 50,0 75,50 75,50 100,100 50,100 50,100 0,100 12.5,75 12.5,75 25,50 Z;
  13. M 25,50 C 37.5,25 37.5,25 50,0 75,50 75,50 100,100 50,100 50,100 0,100 12.5,75 12.5,75 25,50 Z;
  14. M 50,0 C 77.6,0 100,22.4 100,50 100,77.6 77.6,100 50,100 22.4,100, 0,77.6, 0,50 0,22.4, 22.4,0, 50,0 Z;
  15. M 50,0 C 77.6,0 100,22.4 100,50 100,77.6 77.6,100 50,100 22.4,100, 0,77.6, 0,50 0,22.4, 22.4,0, 50,0 Z;
  16. M 100,0 C 100,50 100,50 100,100 50,100 50,100 0,100 0,50 0,50 0,0 50,0 50,0 100,0 Z; "/>
  17. </path>

04 animateMotion

  1. <g>
  2. <rect x="0" y="0" width="30" height="30" style="fill: #ccc;"/>
  3. <circle cx="30" cy="30" r="15" style="fill: #cfc; stroke: green;"/>
  4. <animateMotion from="0,0" to="60,30" dur="4s" fill="freeze"/>
  5. </g>
  6. <rect x="0" y="0" width="30" height="30" style="fill: #ccc;">
  7. <animateMotion
  8. path="M50,125 C 100,25 150,225, 200, 125"
  9. dur="6s" fill="freeze"/>
  10. </rect>
  11. //或者引用外部的路径进行运动
  12. <path d="M10,110 A120,120 -45 0,1 110 10 A120,120 -45 0,1 10,110"
  13. stroke="lightgrey" stroke-width="2"
  14. fill="none" id="theMotionPath"/>
  15. <circle cx="10" cy="110" r="3" fill="lightgrey" />
  16. <circle cx="110" cy="10" r="3" fill="lightgrey" />
  17. <!-- Red circle which will be moved along the motion path. -->
  18. <circle cx="" cy="" r="5" fill="red">
  19. <!-- Define the motion path animation -->
  20. <animateMotion dur="6s" repeatCount="indefinite">
  21. <mpath xlink:href="#theMotionPath"/>
  22. </animateMotion>
  23. </circle>

路径的作用范围。mpath>path>values>from/to

元素 属性
from,to 指定两点的位置,位置参数是以元素的坐标为原点的。 对应改变的图形的属性的值
fill 指定动画结束后停留的装填。remove 表示回到动画开始的位置,freeze 表示停留在动画结束的位置 remove|freeze
rotate auto:让物体垂直于路径的切线方向运动。不过,如果你的路径是闭合曲线的话,需要注意起始点的位置。 auto-reverse:让物体垂直于路径的切线方向并 + 180°。也就是和 auto 运动关于切线对称。Number:让物体以固定的旋转角度运动。这个就相当于使用 transform:rotate(deg) 进行控制。
在动画设置标签中,还有一个更简单的–set。

05 SET

该标签也是用来模拟 transition 效果的。它和 animate 的主要区别是,它仅仅需要 to 的指定属性,而不需要其他的参考属性,比如 from,by 等。那它有啥特别的存在意义吗?
有的,因为 set 针对于所有属性,甚至包括 style 里面的相关 CSS 属性。所以,可以靠它来很好描述一些非 number 的属性值。

  1. <text text-anchor="middle" x="60" y="60" style="visibility: hidden;"> <set attributeName="visibility" attributeType="CSS" to="visible" begin="4.5s" dur="1s" fill="freeze"/> All gone! </text>

06 img

SVG文档中的SVG元素包含图像信息。它表现为图像文件或者其他SVG文件。
SVG图像格式转换软件支持JPEG、PNG格式,是否支持动图GIF不明确。
SVG文件是这样的一种图像:不被当做外部资源加载,不可以用:visited 样式,不能有交互。使用动态SVG元素,可以用引入外部的URL。使用SVG文件并添加scripts在里面,可以用 放在 中。
注意:HTML规范中定义Animate&AnimateTransform - 图2Animate&AnimateTransform - 图3在解析时是等效的。这种规范只适用于SVG文件或SVG区块内。

07 svg变换的规则

当然svg可以解决复杂的动画问题吗?在这里还是不建议用svg去解决复杂的动画的原理,其实我们一开始理解为svg是webgl 的一个拓展,那么所有的切换都是利用,点到线的模式,那么很简单就是,如果说某一个logo动画,我只要在svg的value中list中设置好每一帧的变化顺序对应的svg不就可以了嘛
salad.gif
但是问题就是,这样复杂的动画他就会理解为类似于ppt的切片动画,除非你已每秒24张svg的顺序把这种svg格式的代码输出,这样似乎就会很复杂了,所以这并不是解决复杂动画的一些方案,但是它是一些简单动画的解决方案,他不会有很多的包需要应用,全部用自己的svg的dom就可以解决;

那么复杂动画的解决方案是什么呢;