如何通过在 svg 中保存开始时间来重新启动动画

Posted

技术标签:

【中文标题】如何通过在 svg 中保存开始时间来重新启动动画【英文标题】:How to restart an animation with saving a begin time in svg 【发布时间】:2020-02-06 14:09:37 【问题描述】:

我正在尝试实现三行一个接一个填充并在等待重新启动时冻结的情况,第一行从 0s 开始,第二行在 3s,最后一行在 6s,整个进程需要 9 秒然后重新启动

<svg viewBox="0 0 74 2"  >
    <line x1="0" y1="0" x2="20" y2="0" style="stroke:black;stroke-width:3" />
    <line x1="27" y1="0" x2="47" y2="0" style="stroke:black;stroke-width:3" />
    <line x1="54" y1="0" x2="74" y2="0" style="stroke:black;stroke-width:3" />
    <line class="line" x1="0" y1="0" x2="0" y2="0" 
          style="stroke:red;stroke-width:4" >
          <animate 
               id="first"
               dur="3s"
               attributeName="x2"
               from="0"
               begin="0s"
               to="20"
               dur="3s"
               fill='freeze'
          />
    </line>
    <line x1="27" y1="0" x2="27" y2="0" 
             style="stroke:red;stroke-width:4" >
          <animate 
                id="second"
                dur="3s"
                begin="3s"
                attributeName="x2"
                from="27"
                to="47"
                dur="3s"
                fill='freeze'
                repeatCount="1"
          />
    </line>
    <line x1="54" y1="0" x2="54" y2="0" 
             style="stroke:red;stroke-width:4" >
          <animate 
                id="third"
                dur="3s"
                begin="6s"
                attributeName="x2"
                from="54"
                to="74"
                dur="3s"
                repeatCount="1"
                fill='freeze'
          />
    </line>
  Sorry, your browser does not support inline SVG.
</svg>

我的问题是除了节省它们的开始时间之外,如何同时重新启动三个动画标签。

附言我想将它嵌入到反应组件中

【问题讨论】:

【参考方案1】:

最简单的方法是让所有动画的长度相同,这样它们就可以同时重新启动。然后调整每个动画中的变化,使它们在正确的时间发生。

为此,我已将动画从 from/to 转换为值,因此我可以每隔 3 秒指定一个值。

<svg viewBox="0 0 74 2"  >
    <line x1="0" y1="0" x2="20" y2="0" style="stroke:black;stroke-width:3" />
    <line x1="27" y1="0" x2="47" y2="0" style="stroke:black;stroke-width:3" />
    <line x1="54" y1="0" x2="74" y2="0" style="stroke:black;stroke-width:3" />
    <line class="line" x1="0" y1="0" x2="0" y2="0" 
          style="stroke:red;stroke-width:4" >
          <animate 
               id="first"
               dur="9s"
               attributeName="x2"
               begin="0s"
               values="0;20;20;20"
               from="0"
               to="20"
               repeatCount="indefinite"
          />
    </line>
    <line x1="27" y1="0" x2="27" y2="0" 
             style="stroke:red;stroke-width:4" >
          <animate 
                id="second"
                dur="9s"
                begin="0s"
                attributeName="x2"
                values="27;27;47;47"
                fill='freeze'
                repeatCount="indefinite"
          />
    </line>
    <line x1="54" y1="0" x2="54" y2="0" 
             style="stroke:red;stroke-width:4" >
          <animate 
                id="third"
                dur="9s"
                begin="0s"
                attributeName="x2"
                values="54;54;54;74"
                repeatCount="indefinite"
          />
    </line>
  Sorry, your browser does not support inline SVG.
</svg>

【讨论】:

以上是关于如何通过在 svg 中保存开始时间来重新启动动画的主要内容,如果未能解决你的问题,请参考以下文章

重启背景SVG动画

如何从头开始重新启动gif动画?框架

这是从头开始SVG元素中的重新开始吗?

在 CSS3 中重新启动动画:比删除元素更好的方法吗?

python matplotlib动画中的停止/开始/暂停

未能通过动画其“顶部”属性来动画 SVG 中的 g 元素