Skip to main content
 首页 » 编程设计

javascript之SVG 动画路径 d 属性

2024年02月27日29zhengyun_ustc

是否可以使用 SVG 来制作 d 的动画<path> 的属性?

我可以绘制菱形和圆形作为由八条贝塞尔曲线组成的路径:

<html> 
  <head> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script> 
    <script> 
      jQuery(function($){ 
        var a = 50; 
 
        var draw = function(b, c, d, e, f){ 
          return [ 
            'M', a, 0,  
 
            'C', b, c, ',', d, e, ',', f, f, 
            'C', e, d, ',', c, b, ',', 0, a, 
 
            'C', -c, b, ',', -e, d, ',', -f, f, 
            'C', -d, e, ',', -b, c, ',', -a, 0, 
 
            'C', -b, -c, ',', -d, -e, ',', -f, -f, 
            'C', -e, -d, ',', -c, -b, ',', 0, -a, 
 
            'C', c, -b, ',', e, -d, ',', f, -f, 
            'C', d, -e, ',', b, -c, ',', a, 0, 
          ].join(' '); 
        }; 
 
        $('#diamond').attr({ d: draw( 5*a/6,          a/6,                    2*a/3,         a/3,            a/2 ) }); 
        $('#circle' ).attr({ d: draw(     a, a*Math.PI/12, (2 + 1/Math.sqrt(2))*a/3, a*Math.PI/6, a/Math.sqrt(2) ) }); 
      }); 
    </script> 
  </head> 
  <body> 
    <svg width="200" height="200"> 
      <g transform="translate(100,100)"> 
        <path id=diamond fill="blue" stroke="black"/> 
      </g> 
    </svg> 
    <svg width="200" height="200"> 
      <g transform="translate(100,100)"> 
        <path id=circle fill="red" stroke="black"/> 
      </g> 
  </body> 
</html> 

我想动画化从一种到另一种的转变。

我可以在 javascript 中模拟这一点(只需在特定时间线性插值贝塞尔曲线参数),但我想知道是否有办法使用 SVG 来做到这一点。

(圆形和菱形只是一个例子 - 实际上我想在由相同数量的贝塞尔曲线组成的两个任意实体之间进行转换)。

请您参考如下方法:

这是可能的。这里有很多对路径的 d 元素进行动画处理的示例:http://hoffmann.bplaced.net/svgtest/index.php?in=attributes#pathd包括动画贝塞尔曲线。您应该能够针对您的特定用例进行调整。

这是没有弧形标志动画的路径 15。大弧标志只能是 0 或 1,因此对其进行线性动画没有多大意义。

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="400px" height="400px" viewBox="-500 100 1500 1500"> 
<path id="p1" 
    d="M 100 100 A 200 400 30 1 0 600 200 a 300 100 45 0 1 -300 200" 
    stroke="blue" fill="none" 
    stroke-width="4" /> 
<animate xlink:href="#p1" 
    attributeName="d" 
    attributeType="XML" 
    from="M 100 100 A 200 400 30 1 0 600 200 a 300 100 45 0 1 -300 200" 
        to="M 300 600 A 300 400 -20 1 0 400 200 a 200 600 -50 0 1 100 400" 
    dur="10s" 
    fill="freeze" /> 
         
</svg>