如何实现SVG路径变形圆形图片的动画效果?
如何实现这类SVG变形动画?
你提供的示例是基于SVG裁剪路径(clipPath)的图片变形效果——通过动态修改裁剪路径的形状,让被裁剪的图片呈现出“变形”的视觉效果。以下是具体实现方法:
核心原理
用SVG的<clipPath>定义一个不规则裁剪区域,将图片放入被该裁剪路径约束的<g>元素中,然后通过动画修改<clipPath>内部<path>的d属性(路径指令),让裁剪区域的形状平滑过渡,最终呈现图片跟着路径变形的效果。
具体实现步骤
1. 搭建基础SVG结构
保留你提供的基础结构,核心是clipPath和被裁剪的图片:
<div class="polymorphing"> <svg viewBox="0 0 200 200" height="600" width="600" xmlns="http://www.w3.org/2000/svg"> <!-- 裁剪路径 --> <clipPath id="myClip"> <path fill="#FF0066" d="M42.3,-45.7C56.3,-38.7,70.1,-26.8,73.3,-12.4C76.5,2,69.1,18.8,58.1,29.6C47.1,40.4,32.7,45.1,17.7,51.9C2.8,58.7,-12.5,67.6,-28.1,66.5C-43.7,65.4,-59.5,54.5,-69.8,39.1C-80.2,23.7,-85.1,3.9,-80.7,-13.1C-76.4,-30.2,-62.9,-44.5,-47.9,-51.3C-32.9,-58.1,-16.4,-57.5,-1.1,-56.1C14.2,-54.8,28.4,-52.7,42.3,-45.7Z" transform="translate(100 100)" /> </clipPath> <!-- 被裁剪的图片 --> <g clip-path="url(#myClip)"> <image class="morph-image" href="https://theplusaddons.com/wp-content/uploads/2019/04/digitalagency3.jpg" x="0" y="0" height="100%" width="100%"> </image> </g> </svg> </div>
2. 添加变形动画
要实现动画,你需要至少两个点数一致的路径,然后通过SVG原生动画或CSS/JS来切换路径的d属性:
方法1:SVG原生<animate>动画
直接在<path>内添加<animate>元素,实现自动循环变形:
<path fill="#FF0066" d="M42.3,-45.7C56.3,-38.7,70.1,-26.8,73.3,-12.4C76.5,2,69.1,18.8,58.1,29.6C47.1,40.4,32.7,45.1,17.7,51.9C2.8,58.7,-12.5,67.6,-28.1,66.5C-43.7,65.4,-59.5,54.5,-69.8,39.1C-80.2,23.7,-85.1,3.9,-80.7,-13.1C-76.4,-30.2,-62.9,-44.5,-47.9,-51.3C-32.9,-58.1,-16.4,-57.5,-1.1,-56.1C14.2,-54.8,28.4,-52.7,42.3,-45.7Z" transform="translate(100 100)"> <!-- 添加变形动画,to是目标路径,要和原路径点数一致 --> <animate attributeName="d" dur="8s" repeatCount="indefinite" values=" M42.3,-45.7C56.3,-38.7,70.1,-26.8,73.3,-12.4C76.5,2,69.1,18.8,58.1,29.6C47.1,40.4,32.7,45.1,17.7,51.9C2.8,58.7,-12.5,67.6,-28.1,66.5C-43.7,65.4,-59.5,54.5,-69.8,39.1C-80.2,23.7,-85.1,3.9,-80.7,-13.1C-76.4,-30.2,-62.9,-44.5,-47.9,-51.3C-32.9,-58.1,-16.4,-57.5,-1.1,-56.1C14.2,-54.8,28.4,-52.7,42.3,-45.7Z; M38.2,-49.5C52.6,-41.6,67.3,-28.3,70.9,-12.8C74.5,2.7,67,19.9,55.3,30.5C43.6,41.1,27.7,45.1,11.9,50.9C-3.9,56.6,-19.9,64.2,-35.1,61.1C-50.3,58,-64.7,44.1,-72.9,27.9C-81.1,11.7,-83.1,-6.2,-76.7,-22.2C-70.3,-38.2,-55.5,-53.3,-39.6,-58.8C-23.6,-64.3,-6.8,-60.2,9.9,-56.6C26.7,-53,52.9,-49.9,38.2,-49.5Z; M42.3,-45.7C56.3,-38.7,70.1,-26.8,73.3,-12.4C76.5,2,69.1,18.8,58.1,29.6C47.1,40.4,32.7,45.1,17.7,51.9C2.8,58.7,-12.5,67.6,-28.1,66.5C-43.7,65.4,-59.5,54.5,-69.8,39.1C-80.2,23.7,-85.1,3.9,-80.7,-13.1C-76.4,-30.2,-62.9,-44.5,-47.9,-51.3C-32.9,-58.1,-16.4,-57.5,-1.1,-56.1C14.2,-54.8,28.4,-52.7,42.3,-45.7Z; " keyTimes="0;0.5;1" calcMode="spline" keySplines="0.42 0 0.58 1;0.42 0 0.58 1" /> </path>
方法2:CSS动画控制
通过CSS变量定义路径,用@keyframes切换变量值:
.polymorphing path { --path-1: "M42.3,-45.7C56.3,-38.7,70.1,-26.8,73.3,-12.4C76.5,2,69.1,18.8,58.1,29.6C47.1,40.4,32.7,45.1,17.7,51.9C2.8,58.7,-12.5,67.6,-28.1,66.5C-43.7,65.4,-59.5,54.5,-69.8,39.1C-80.2,23.7,-85.1,3.9,-80.7,-13.1C-76.4,-30.2,-62.9,-44.5,-47.9,-51.3C-32.9,-58.1,-16.4,-57.5,-1.1,-56.1C14.2,-54.8,28.4,-52.7,42.3,-45.7Z"; --path-2: "M38.2,-49.5C52.6,-41.6,67.3,-28.3,70.9,-12.8C74.5,2.7,67,19.9,55.3,30.5C43.6,41.1,27.7,45.1,11.9,50.9C-3.9,56.6,-19.9,64.2,-35.1,61.1C-50.3,58,-64.7,44.1,-72.9,27.9C-81.1,11.7,-83.1,-6.2,-76.7,-22.2C-70.3,-38.2,-55.5,-53.3,-39.6,-58.8C-23.6,-64.3,-6.8,-60.2,9.9,-56.6C26.7,-53,52.9,-49.9,38.2,-49.5Z"; d: path(var(--path-1)); animation: morph 8s infinite alternate ease-in-out; } @keyframes morph { 0% { d: path(var(--path-1)); } 100% { d: path(var(--path-2)); } }
3. 关键注意事项
- 路径点数必须一致:不同变形路径的
d属性中,指令数量和类型(比如C、M等)要完全匹配,否则动画会出现扭曲错乱。可以用不规则路径生成工具创建同点数的路径。 - 动画平滑度:使用
calcMode="spline"(SVG)或ease-in-out(CSS)来让过渡更自然。 - 交互触发:如果需要滚动、hover触发动画,可以用JavaScript监听事件,动态修改路径的
d属性。
内容的提问来源于stack exchange,提问作者theaminulai
相关产品推荐
相关产品推荐

