如何从SVG元素的最后/当前位置(仅限SMIL、无CSS和无js)沿路径设置SVG元素的动画?

如何从SVG元素的最后/当前位置(仅限SMIL、无CSS和无js)沿路径设置SVG元素的动画?,svg,path,smil,Svg,Path,Smil,我希望在不使用CSS或Javascript的情况下,仅使用SMIL沿路径为svg元素设置动画。我想做的是: 在元素上播放动画 使该元素在动画结束时保持在最终位置 从元素的当前位置开始应用于该元素的下一个动画 到目前为止,我一直在想如何通过使用&设置属性fill=“freeze”达到第2点,但我找不到一种方法来达到第3点。。。每次,元素都会从其初始位置重新启动 这里是一个片段,用于观察所需的效果(使用js完成)。 我在想,仅仅用SMIL是否真的有可能? 如果是这样,我应该探索什么来实现它 let

我希望在不使用CSS或Javascript的情况下,仅使用SMIL沿路径为svg元素设置动画。我想做的是:

  • 在元素上播放动画
  • 使该元素在动画结束时保持在最终位置
  • 从元素的当前位置开始应用于该元素的下一个动画
  • 到目前为止,我一直在想如何通过使用&设置属性
    fill=“freeze”
    达到第2点,但我找不到一种方法来达到第3点。。。每次,元素都会从其初始位置重新启动

    这里是一个片段,用于观察所需的效果(使用js完成)。 我在想,仅仅用SMIL是否真的有可能? 如果是这样,我应该探索什么来实现它

    let animation=document.querySelector(';
    animation.addEventListener('endEvent',()=>{
    让circle=document.querySelector(“#元素_动画”);
    设newCX=circle.cx.animVal.value+180;
    设newCY=circle.cy.animVal.value+35;
    circle.setAttribute(“cx”,newCX);
    circle.setAttribute(“cy”,newCY);
    setAttribute(“填充”、“移除”);
    })
    animation.addEventListener('beginEvent',()=>{
    setAttribute(“填充”、“冻结”);
    })
    元素最终位置(动画后):初始
    元素最终位置(动画后):最后一帧
    期望的行为:
    设置动画后,如果单击元素以在其上重新启动动画,我希望动画以元素在其当前位置开始


    我本以为这会奏效(见:):

    
    
    只有SMIL,没有。@RobertLongson我怀疑,但我们永远不知道,可能会错过一个技巧:D Thanx代表光明!你能做的最好的事情就是有很多对象,除了第一个是显示:无,然后每次动画结束时,你都会进行下一个显示:块和动画。但是重复很多,并且只适用于固定数量的步骤。您能使用相对路径吗?(即小写字母“l”、“m”等),然后在每次单击时启动动画?并设置每个fill=“冻结”?在我的大脑中,这在概念上是有意义的,但我需要尝试一下。因此,对于javascript部分,暂停/取消暂停是聪明的,但它可能会阻止svg的所有最终其他动画(这是我的情况,我在这里简化了它只是为了示例)
      <path transform="translate(100, 100)" fill="none" stroke-linejoin="bevel" id="motionpath" stroke="black" d="m 0, 0 c 40,0 45,35 180,35"></path>
      <circle id="circle" r="25" stroke="black" stroke-width="3" fill="red" cx="100" cy="100">
        <animateMotion begin="click" dur="1s" fill="freeze" addative="replace" accumulate="sum">
          <mpath xlink:href="#motionpath"></mpath>
        </animateMotion>
      </circle> 
    
      <circle id="circle" r="25" stroke="black" stroke-width="3" fill="red" cx="100" cy="100">    
        <animate attributeName="cx" from="100" by="+180" begin="circle.click" dur="1s" fill="freeze"  additive="replace" accumulate="sum"></animate>
        <animate attributeName="cy" from="100" by="+35" begin="circle.click" dur="1s" fill="freeze"  additive="replace" accumulate="sum"></animate>
      </circle>