SVG SMIL 动画(基本动画 、变换动画)

一、简介

image.png

  • 动画标签:<animate>、<animateTransform>、<animateMotion> ...

  • 动画元素、属性定位以及动画参数设置:

    • attributeNameattributeType

    • fromtodurrepeatCountfill

    • calcMode

二、使用方式

  • 定位动画目标

    • Internal Resource Identifier 定位,指定需要生效动画的标签

      <animate xlink:href="url(#rect1)"></animate>
      
    • 包含在目标元素内,对包含的父元素生效动画

      <rect x="0" ...>
          <animate></animate>
      </rect>
      
  • 设置要进行动画的属性以及变化范围、时间长度

    <animate xlink:href="url(#rect1)"
        attributeType="XML"
        attributeName="x"
        from="0" to="100"
        dur="2s"
        repeatCount="1">
    </animate>
    

三、基本动画

  • animate 支持叠加动画,也就是同一个标签支持添加多个 animate 动画标签。

  • 效果

    temp.gif

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        html,body {
          margin: 0;
          padding: 0;
          background-color: #001122;
          /* 全屏 */
          width: 100%;
          height: 100%;
          /* 清空字号,免得影响 svg */
          line-height: 0;
          font-size: 0;
        }
      </style>
    </head>
    <body>
      <!-- animate
        attributeType: 标签类型
        attributeName: 需要支持动画的属性
        begin: 动画开始时机
        from: 开始值
        to: 结束值
        dur: 动画时间
        fill: freeze(停留在最后)、none(默认,回到起点)
        repeatCount: 动画次数,indefinite(无限次),默认 1
        -->
      <!-- svg -->
      <svg width="100%" height="100%">
        <!-- 1 平移动画 -->
        <rect x="50" y="10" width="40" height="40" fill="red">
          <!-- 动画 -->
          <animate attributeType="XML"
            attributeName="x"
            from="50" to="200"
            dur="1s"
            repeatCount="indefinite"/>
          <!-- 颜色变化 -->
          <animate attributeType="XML"
            attributeName="fill"
            from="red" to="yellow"
            dur="1s"
            repeatCount="indefinite"/>
        </rect>
        <!-- 2 平移动画 - 往返 -->
        <rect x="50" y="80" width="40" height="40" fill="red">
          <!-- 动画 -->
          <animate id="goright1" attributeType="XML"
            attributeName="x"
            begin="0; goleft1.end"
            from="50" to="200"
            dur="1s"
            fill="freeze"/>
          <animate id="goleft1" attributeType="XML"
            attributeName="x"
            begin="goright1.end"
            from="200" to="50"
            dur="1s"
            fill="freeze"/>
          <!-- 颜色变化 -->
          <animate attributeType="XML"
            attributeName="fill"
            from="red" to="yellow"
            dur="1s"
            repeatCount="indefinite"/>
        </rect>
        <!-- 3 平移动画 - 往返 - 暂停 -->
        <rect x="200" y="150" width="40" height="40" fill="red">
          <!-- 动画 -->
          <animate id="goleft2" attributeType="XML"
            attributeName="x"
            begin="0; goright2.end + 1s"
            from="200" to="50"
            dur="1s"
            fill="freeze"/>
          <animate id="goright2" attributeType="XML"
            attributeName="x"
            begin="goleft2.end + 1s"
            from="50" to="200"
            dur="1s"
            fill="freeze"/>
          <!-- 颜色变化 -->
          <animate attributeType="XML"
            attributeName="fill"
            from="red" to="yellow"
            dur="1s"
            repeatCount="indefinite"/>
        </rect>
      </svg>
    </body>
    </html>
    

四、变换动画

  • animateTransform 支持叠加动画,也就是同一个标签不能添加多个 animateTransform 动画标签。

  • 效果

    temp.gif

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        html,body {
          margin: 0;
          padding: 0;
          background-color: #001122;
          /* 全屏 */
          width: 100%;
          height: 100%;
          /* 清空字号,免得影响 svg */
          line-height: 0;
          font-size: 0;
        }
      </style>
    </head>
    <body>
      <!-- animateTransform
        attributeType: 标签类型
        attributeName: 需要支持动画的属性
        type: 子属性
        begin: 动画开始时机
        from: 开始值
        to: 结束值
        dur: 动画时间
        fill: freeze(停留在最后)、none(默认,回到起点)
        repeatCount: 动画次数,indefinite(无限次),默认 1
        -->
      <!-- svg -->
      <svg width="100%" height="100%" viewBox="-400 -400 800 800">
        <!-- 1 原地旋转 -->
        <rect x="0" y="0" width="40" height="40" fill="red">
          <!-- 动画 -->
          <animateTransform attributeType="XML"
            attributeName="transform"
            type="rotate"
            from="0"
            to="360"
            dur="3s"
            repeatCount="indefinite">
        </rect>
        <!-- 1 原地旋转 - 缩放 - 不支持多个动画叠加 -->
        <rect x="0" y="80" width="40" height="40" fill="red">
          <!-- 动画 -->
          <!-- <animateTransform attributeType="XML"
            attributeName="transform"
            type="rotate"
            from="0"
            to="360"
            dur="3s"
            repeatCount="indefinite"> -->
          <animateTransform attributeType="XML"
            attributeName="transform"
            type="scale"
            from="1"
            to="2"
            dur="3s"
            repeatCount="indefinite">
        </rect>
      </svg>
    </body>
    </html>
    

五、轨迹 Path 动画(animateMotion)

六、Scripting Animation(脚本动画)

七、参考文档

  • 参考资料

    http://www.w3.org/TR/SVG/animate.html

    http://www.zhangxinxu.com/wordpress/?p=4333

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值