马黑黑 发表于 2022-9-11 08:50

svg动画之:animate

<p><b><font color="#ff0000">animate&nbsp;</font></b>动画在&nbsp;svg&nbsp;里是基于元素属性变化的动画指令,使用它,必须给出元素的属性名。比如我们画一根线:</p><p><br></p><p>&lt;line <font color="#ff0000">x1</font>="50" <font color="#ff0000">y1</font>="50" <font color="#ff0000">x2</font>="250" <font color="#ff0000">y2</font>="50" <font color="#ff0000">stroke</font>="steelblue" /&gt;</p>

<p><br></p><p>画这根线的代码,标红的部分,都是元素&nbsp;line&nbsp;的属性名称,其中,x1&nbsp;和&nbsp;y1&nbsp;是线段起始坐标,x2&nbsp;和&nbsp;y2&nbsp;是线段终点坐标,stroke&nbsp;是描边颜色。“属性”用英文表示,成为&nbsp;attribute,属性名称就叫&nbsp;attribute name,svg中写成 <font color="#0000ff">attributeName</font>,注意大小写。</p>

<p><br></p>

<p>animate&nbsp;当做标签使用,像这样组织代码:</p><p><br></p>

<p>&lt;<font color="#ff0000">animate</font>&nbsp;<font color="#0000ff">attributeName</font>="x2" ... /&gt;</p><p><br></p><p>这是要改变&nbsp;x2&nbsp;的值,因为&nbsp;animate&nbsp;指定了&nbsp;x2&nbsp;为要发生动画的属性。我们将现场从 250&nbsp;变回初始值 50,这用上&nbsp;from="250" to="50"&nbsp;的语义化描述,就是“从 ……&nbsp;到 ……”的意思,小学英语里就有的词汇:</p>

<p><br></p>

<p>&lt;<font color="#ff0000">animate</font>&nbsp;<font color="#0000ff">attributeName</font>="x2"&nbsp;<font color="#0000ff">from</font>="250" <font color="#0000ff">to</font>="50" ... /&gt;</p>

<p><br></p>

<p>动画有运行周期时长,也就是,一个动画全程所需要的时间,这叫&nbsp;duration,svg&nbsp;用简称&nbsp;dur&nbsp;表示,语句是,dur="2s",需要实践单位,可以是秒&nbsp;s,也可以是毫秒&nbsp;ms,看你喜欢。我们把&nbsp;dur&nbsp;加入到&nbsp;animate&nbsp;代码中:</p>

<p><br></p><p>&lt;<font color="#ff0000">animate</font>&nbsp;<font color="#0000ff">attributeName</font>="x2"&nbsp;<font color="#0000ff">from</font>="250"&nbsp;<font color="#0000ff">to</font>="50" du="2s" ... /&gt;</p>

<p><br></p>

<p>还有动画的重复次数。repeat&nbsp;是&nbsp;重复,count&nbsp;是数数,svg 用&nbsp;repeatCount&nbsp;表示,注意大小写。语句,repeatCount="100",需要无限循环的话,用&nbsp;indefinite&nbsp;代替 100。同样,将其加入的前面的代码:</p>

<p><br></p>

<p>&lt;<font color="#ff0000">animate</font>&nbsp;<font color="#0000ff">attributeName</font>="x2"&nbsp;<font color="#0000ff">from</font>="250"&nbsp;<font color="#0000ff">to</font>="50" du="2s"&nbsp;<font color="#0000ff">repeatCount</font>="indefinite" ... /&gt;</p><p><br></p>

<p>动画设计完毕,如何让它驱动&nbsp;line&nbsp;线条去改变自身长短呢?把&nbsp;动画标签&nbsp;作为子元素放置到&nbsp;line&nbsp;代码中即可,line标签的自闭合标签改为有收尾符的标签:</p><p><br></p><p><font color="#ff0000">&lt;line</font>&nbsp;<font color="#ff0000">x1</font>="50"&nbsp;<font color="#0000ff">y1</font>="50"&nbsp;<font color="#0000ff">x2</font>="250"&nbsp;<font color="#0000ff">y2</font>="50"&nbsp;<font color="#0000ff">stroke</font>="steelblue" &gt;</p><p>&nbsp; &nbsp; &lt;<font color="#ff0000">animate</font>&nbsp;<font color="#0000ff">attributeName</font>="x2"&nbsp;<font color="#0000ff">from</font>="250"&nbsp;<font color="#0000ff">to</font>="50" du="2s"&nbsp;<font color="#0000ff">repeatCount</font>="indefinite" /&gt;</p><p><font color="#ff0000">&lt;/line&gt;<br><br></font></p>

<svg style="border: 1px solid steelblue">
        <line x1="50" y1="50" x2="250" y2="50" stroke="steelblue">
                <animate attributeName="x2" from="250" to="50" dur="2s" repeatCount="indefinite"></animate>
        </line>
</svg>
<p><br>效果如我们预设的一样,线条在不断重复着从长变短的动画。</p>

马黑黑 发表于 2022-9-11 08:50

本帖最后由 马黑黑 于 2022-9-11 10:11 编辑

在一楼,线条仅以一个方向变化,整个运动显得突兀,能不能也像 CSS 关键帧动画那样有一个 alternate 属性令之执行指令后反向再执行,从而达到匀速变化的效果?

svg 没有相应的 alternate 属性,但我们有办法处理。animate 的参数里,有一个 values 值,注意是复数。这个参数用数组形式描述变化状态,取代 from ... to 的工作(使用 values 参数后 from 和 to 的设置也会自动失效)。

例如,我们前例使用的变化描述,from="250" to="50",使用 values 表示的话,是酱紫,values="250; 50;",从 250 到 50 的意思,我们再给它加一个变化描述数字,就可以达成 alternate 一样在运动周期中加入反向运动的效果了:values="250; 50; 250"。这其实就是 长→短→长 的变化路径,由于头尾变化一致,所以往复运动。

看看整体代码:

<svg style="border: 1px solid steelblue">
      <line x1="50" y1="50" x2="250" y2="50" stroke="steelblue" >
                <animate attributeName="x2" values="250; 50; 250;" dur="2s" repeatCount="indefinite" />
      </line>
</svg>


效果放在楼下。

马黑黑 发表于 2022-9-11 08:50

本帖最后由 马黑黑 于 2022-9-11 10:05 编辑 <br /><br /><svg style="border: 1px solid steelblue">
        <line x1="50" y1="50" x2="250" y2="50" stroke="steelblue" >
                <animate attributeName="x2" values="250; 50; 250;" dur="2s" repeatCount="indefinite" />
        </line>
</svg>

红影 发表于 2022-9-11 09:46

还需要占楼么?如果需要,我把我这个删了。
我只是想问问,循环也能设置往复形式么?也就是线段变短再变长。

马黑黑 发表于 2022-9-11 09:47

红影 发表于 2022-9-11 09:46
还需要占楼么?如果需要,我把我这个删了。
我只是想问问,循环也能设置往复形式么?也就是线段变短再变长 ...

要占的都占了{:4_170:}

红影 发表于 2022-9-11 09:48

这个和电波那个帖子相比,没有begin=的设置,也是不需要{:4_173:}

马黑黑 发表于 2022-9-11 09:48

红影 发表于 2022-9-11 09:48
这个和电波那个帖子相比,没有begin=的设置,也是不需要
不设置时 begin 是 0s

红影 发表于 2022-9-11 09:51

attribute name指定了要发生变化的属性的名字,而透明度那个,好像没特定是哪个属性,那就是对应某个绘画结果的全部了?

梦缘 发表于 2022-9-11 09:52

学习了解老师代码,感谢老师分享!{:4_204:}

马黑黑 发表于 2022-9-11 10:06

红影 发表于 2022-9-11 09:51
attribute name指定了要发生变化的属性的名字,而透明度那个,好像没特定是哪个属性,那就是对应某个绘画结 ...

svg图形对象都有 stroke-opacity 属性,属性有没有使用都是合法的、可驱动的

马黑黑 发表于 2022-9-11 10:07

梦缘 发表于 2022-9-11 09:52
学习了解老师代码,感谢老师分享!

{:4_190:}

红影 发表于 2022-9-11 10:31

马黑黑 发表于 2022-9-11 09:47
要占的都占了

看起来不需要我自己删自己的了,嗯,动作迅速{:4_173:}

红影 发表于 2022-9-11 10:31

马黑黑 发表于 2022-9-11 09:48
不设置时 begin 是 0s

哦,知道了。谢谢黑黑{:4_204:}

红影 发表于 2022-9-11 10:32

马黑黑 发表于 2022-9-11 10:06
svg图形对象都有 stroke-opacity 属性,属性有没有使用都是合法的、可驱动的

我是说,这个命令不是驱动一城一池,而是驱动全部吧。

马黑黑 发表于 2022-9-11 10:36

红影 发表于 2022-9-11 10:32
我是说,这个命令不是驱动一城一池,而是驱动全部吧。

我不知道啥一城一池,它驱动 stroke-opacity 就驱动 stroke-opacity,是描边颜色的透明度。

马黑黑 发表于 2022-9-11 10:36

红影 发表于 2022-9-11 10:31
哦,知道了。谢谢黑黑

{:4_181:}

马黑黑 发表于 2022-9-11 10:37

红影 发表于 2022-9-11 10:31
看起来不需要我自己删自己的了,嗯,动作迅速

预留两个行了,其实一个也可以。不需要讲完全部的内容,否则太复杂了大家看了不得要领

红影 发表于 2022-9-11 11:07

马黑黑 发表于 2022-9-11 10:36
我不知道啥一城一池,它驱动 stroke-opacity 就驱动 stroke-opacity,是描边颜色的透明度。

知道了,也就是对范围内所有描边的颜色都运作。

红影 发表于 2022-9-11 11:10

马黑黑 发表于 2022-9-11 08:50
在一楼,线条仅以一个方向变化,整个运动显得突兀,能不能也像 CSS 关键帧动画那样有一个 alternate 属性令 ...

svg 没有相应的 alternate 属性,但可以用数组形式描述变化状态,取代 from ... to 的工作。

前面就想问的,黑黑在留的楼层里说了{:4_187:}

红影 发表于 2022-9-11 11:11

马黑黑 发表于 2022-9-11 10:37
预留两个行了,其实一个也可以。不需要讲完全部的内容,否则太复杂了大家看了不得要领

嗯,还是少点的好,容易懂。太多了会连所有的都带得弄不懂了{:4_173:}
页: [1] 2
查看完整版本: svg动画之:animate