
在Web图形设计中,静态的SVG元素有时显得过于沉闷。为了让图形更具表现力,我们常常需要为它们添加动画效果。本教程将专注于一种常见的动画需求:使SVG中的线条和圆形产生类似风吹拂的“震动”或“摆动”效果。我们将利用SVG内置的SMIL(Synchronized Multimedia Integration Language)动画功能,结合路径(<path>)和基本图形(<circle>)的属性动画,实现这一目标。
直接对<line>元素的x1, y1, x2, y2属性进行动画,通常只能实现线条的平移或缩放,难以表现出自然的弯曲震动效果。为了实现线条的弯曲震动,我们需要将其转换为一个<path>元素,并使用三次贝塞尔曲线(Cubic Bezier Curve)来定义其形状。
一个三次贝塞尔曲线由四个点决定:起始点(M命令)、两个控制点(在C命令中指定)和终点(在C命令中指定)。通过改变控制点或终点的位置,我们可以轻松地改变曲线的弯曲程度和方向。
例如,一条从(10,50)到(250,50)的直线,可以表示为: M10,50 C100,50 200,50 250,50 这里,(10,50)是起始点,(100,50)和(200,50)是控制点,(250,50)是终点。当所有点的y坐标相同时,它表现为一条直线。
一旦我们将直线转换为<path>,就可以通过动画其d(path data)属性来实现震动效果。SMIL的<animate>标签是实现这一目标的关键。
<path stroke="black" stroke-width="3" fill="red" d="M10,50C100,50 200,50 250,50">
<animate
attributeName="d"
values="M10,50C100,50 200,50 250,50;
M10,50C100,50 200,50 248,80;
M10,50C100,50 200,50 250,50;
M10,50C100,50 200,50 248,20;
M10,50C100,50 200,50 250,50;"
dur="5s"
repeatCount="indefinite"/>
</path>代码解析:
与线条类似,我们可以通过动画圆形的位置属性(cx和cy)来模拟震动效果。
<circle cx="250" cy="50" r="20" stroke="black" stroke-width="3" fill="red">
<animate
attributeName="cx"
values="250;248;250;248;250"
dur="5s"
repeatCount="indefinite"/>
<animate
attributeName="cy"
values="50;80;50;20;50"
dur="5s"
repeatCount="indefinite"/>
</circle>代码解析:
综合示例1:线条与圆形的同步震动
将上述线条和圆形的动画结合起来,可以创建一个完整的震动效果:
<svg viewBox="0 -50 300 200" width="300">
<path stroke="black" stroke-width="3" fill="red" d="M10,50C100,50 200,50 250,50">
<animate
attributeName="d"
values="M10,50C100,50 200,50 250,50;
M10,50C100,50 200,50 248,80;
M10,50C100,50 200,50 250,50;
M10,50C100,50 200,50 248,20;
M10,50C100,50 200,50 250,50;"
dur="5s"
repeatCount="indefinite"/>
</path>
<circle cx="250" cy="50" r="20" stroke="black" stroke-width="3" fill="red" >
<animate
attributeName="cx"
values="250;248;250;248;250"
dur="5s"
repeatCount="indefinite"/>
<animate
attributeName="cy"
values="50;80;50;20;50"
dur="5s"
repeatCount="indefinite"/>
</circle>
</svg>如果希望在震动的圆形内部显示一张图片而不是纯色填充,我们可以结合使用<symbol>、<use>和<clipPath>。
<svg viewBox="0 -50 300 200" width="300">
<!-- 定义剪切路径 -->
<clipPath id="cp">
<circle cx="20" cy="20" r="20" stroke="black" stroke-width="3" fill="red" />
</clipPath>
<!-- 线条动画(与之前相同) -->
<path stroke="black" stroke-width="3" fill="red" d="M10,50C100,50 200,50 250,50">
<animate
attributeName="d"
values="M10,50C100,50 200,50 250,50;
M10,50C100,50 200,50 248,80;
M10,50C100,50 200,50 250,50;
M10,50C100,50 200,50 248,20;
M10,50C100,50 200,50 250,50;"
dur="5s"
repeatCount="indefinite"/>
</path>
<!-- 定义包含图片的符号 -->
<symbol id="s">
<image xlink:href ="https://assets.codepen.io/222579/darwin300.jpg" width="40" height="40" clip-path="url(#cp)"/>
</symbol>
<!-- 使用符号并对其进行动画 -->
<use xlink:href="#s" x="230" y="30">
<animate
attributeName="x"
values="230;228;230;228;230"
dur="5s"
repeatCount="indefinite"/>
<animate
attributeName="y"
values="30;60;30;0;30"
dur="5s"
repeatCount="indefinite"/>
</use>
</svg>代码解析:
通过本教程,我们学习了如何利用SVG的<path>元素和SMIL动画功能,为线条和圆形元素创建生动的震动效果。从将直线转换为可动画的贝塞尔曲线路径,到为圆形添加位置摆动,再到在圆形中嵌入并动画化图像,这些技术为SVG图形增添了动态和交互性。掌握这些技巧,将使您能够创建更具吸引力和表现力的Web图形。
以上就是SVG路径与SMIL动画:实现线条和圆形元素的震动效果的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号