从 lineto 到 cubic-bezier 曲线命令的 SVG 路径动画
SVG path animation from lineto to cubic-bezier curve command
我正在尝试为 svg <path>
元素制作动画。初始 <path>
元素具有 L(lineto)
命令,而我试图将其设置为动画的 <path>
具有 C(cubic-bezier curve)
命令。我试过为它制作动画,但它并没有真正在两条路径之间转换。这样的事情可能吗?
<svg>
<path id="path" d="M0,50 L25,40 L50,60 L75,40 L100,60 L125,40 L150,50" fill="none" stroke-width="2" stroke="#000" />
<animate xlink:href="#path"
attributeName="d"
dur="3s"
from="M 0 50 L 25 40 L 50 60 L 75 40 L 100 60 L 125 40 L 150 50"
to="M 0 80 C 25 55 50 55 75 80 C 100 105 125 105 150 80"
repeatCount="indefinite" />
</svg>
如您所知,路径数据动画需要列出完全相同的命令序列和点才能工作。也就是说,您可以根据需要将路径分成任意多的段,如果控制点位于一条直线上,则立方贝塞尔曲线可以描述一条直线。为了使您的示例生效,您需要
- 将每个
L
段重写为 C
段
- 将每个
C
段分成三个C
段,使曲线不变
这两项任务最好使用具有适当工具的图形编辑器(如 Inkscape)执行。
<svg>
<path id="path" d="M0,50 L25,40 L50,60 L75,40 L100,60 L125,40 L150,50" fill="none" stroke-width="2" stroke="#000" />
<animate xlink:href="#path"
attributeName="d"
dur="3s"
from="M 0,50
C 12.5,45 12.5,45 25,40
37.5,50 37.5,50 50,60
62.5,50 62.5,50 75,40
87.5,50 87.5,50 100,60
112.5,50 112.5,50 125,40
137.5,45 137.5,45 150,50"
to="M 0,80
C 8.33333,71.6667 16.6667,66.1111 25,63.3333
33.3333,60.5556 41.6667,60.5556 50,63.3333
58.3333,66.1111 66.6667,71.6667 75,80
83.3333,88.3333 91.6667,93.8889 100,96.6667
108.333,99.4444 116.667,99.4444 125,96.6667
133.333,93.8889 141.667,88.3333 150,80"
repeatCount="indefinite" />
</svg>
我正在尝试为 svg <path>
元素制作动画。初始 <path>
元素具有 L(lineto)
命令,而我试图将其设置为动画的 <path>
具有 C(cubic-bezier curve)
命令。我试过为它制作动画,但它并没有真正在两条路径之间转换。这样的事情可能吗?
<svg>
<path id="path" d="M0,50 L25,40 L50,60 L75,40 L100,60 L125,40 L150,50" fill="none" stroke-width="2" stroke="#000" />
<animate xlink:href="#path"
attributeName="d"
dur="3s"
from="M 0 50 L 25 40 L 50 60 L 75 40 L 100 60 L 125 40 L 150 50"
to="M 0 80 C 25 55 50 55 75 80 C 100 105 125 105 150 80"
repeatCount="indefinite" />
</svg>
如您所知,路径数据动画需要列出完全相同的命令序列和点才能工作。也就是说,您可以根据需要将路径分成任意多的段,如果控制点位于一条直线上,则立方贝塞尔曲线可以描述一条直线。为了使您的示例生效,您需要
- 将每个
L
段重写为C
段 - 将每个
C
段分成三个C
段,使曲线不变
这两项任务最好使用具有适当工具的图形编辑器(如 Inkscape)执行。
<svg>
<path id="path" d="M0,50 L25,40 L50,60 L75,40 L100,60 L125,40 L150,50" fill="none" stroke-width="2" stroke="#000" />
<animate xlink:href="#path"
attributeName="d"
dur="3s"
from="M 0,50
C 12.5,45 12.5,45 25,40
37.5,50 37.5,50 50,60
62.5,50 62.5,50 75,40
87.5,50 87.5,50 100,60
112.5,50 112.5,50 125,40
137.5,45 137.5,45 150,50"
to="M 0,80
C 8.33333,71.6667 16.6667,66.1111 25,63.3333
33.3333,60.5556 41.6667,60.5556 50,63.3333
58.3333,66.1111 66.6667,71.6667 75,80
83.3333,88.3333 91.6667,93.8889 100,96.6667
108.333,99.4444 116.667,99.4444 125,96.6667
133.333,93.8889 141.667,88.3333 150,80"
repeatCount="indefinite" />
</svg>