在我的回答中,我想就平滑动画的实现给出一般性建议,并通过问题作者的具体示例来考虑它们。
使用该属性实现平滑动画路径变化的主要条件d
是:
- 相同数量的节点
- 节点类型(A;C;Q)的精确匹配,分别针对路径初始和最终位置的每个点
可以通过不同的方式满足这些条件,但最好在矢量编辑器中执行此操作。
下图显示了矢量编辑器中的初始路径,需要在观察同一性和相同数量的节点点的条件下将其转换为最终路径。
红色箭头表示需要移动的节点。
- 要移动选定的锚点,您必须在按住的同时单击标记它们shift
- 然后按住Ctrl键,将光标放在选中的点上,将整条曲线移动到动画的最终位置。
- 将文件以格式保存在矢量编辑器中
* .svg
并复制最终的公式path
动画实现
现在我们有了公式初始和最终路径。要实现属性d
路径的动画,请使用命令SMIL
<animate attributeName="d" values="`begin path`;`final path`" .... />
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.0.2/anime.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 349" class="svg_curve">
<path style="fill: #000;" d="M1920,349H0V242s468-52.44,960-73.33S1920,0,1920,0Z" class="path">
<animate attributeName="d"
values="
M1920,349H0V242s468-52.44,960-73.33S1920,0,1920,0Z;
M1920,466H0V359s159-60,960-73S1920,0,1920,0Z"
dur="5s"
fill="freeze"
/>
</path>
</svg>
要循环动画,请添加 values 属性begin path
:
<animate attributeName="d" values="`begin path`;`final path`;begin path" .... />
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/2.0.2/anime.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 349" class="svg_curve">
<path style="fill: #000;" d="M1920,349H0V242s468-52.44,960-73.33S1920,0,1920,0Z" class="path">
<animate attributeName="d"
values="
M1920,349H0V242s468-52.44,960-73.33S1920,0,1920,0Z;
M1920,466H0V359s159-60,960-73S1920,0,1920,0Z;
M1920,349H0V242s468-52.44,960-73.33S1920,0,1920,0Z"
dur="5s"
fill="freeze"
repeatCount="indefinite"
/>
</path>
</svg>
更新
绕过精确匹配节点的数量和类型的限制,允许插件kute-svg.js
插件使用示例