You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SVG曲线路径动画实现:圆形沿半椭圆路径5分钟缓慢移动

实现圆形沿半椭圆路径5分钟移动的动画

当然可以实现!不过相比CSS,SVG原生的<animateMotion>是更简单精准的方案——它专门用来让元素沿路径运动,完美适配你的需求。下面我会分别给出两种实现方式,重点推荐SVG方案:

一、推荐方案:使用SVG <animateMotion>

这种方法不需要复杂计算,直接让圆形绑定路径,自动贴合运动,代码改动极小:

修改后的完整代码

<div class="container">
  <div class="time-container"><p class="time">5:00</p></div>
  <div class="semi-oval">
    <svg width="190" height="160" xmlns="http://www.w3.org/2000/svg">
      <defs>
        <filter id="shadow">
          <feDropShadow dx="0" dy="10" stdDeviation="6"/>
        </filter>
      </defs>
      <path id="path" d="M10 80 Q 95 10 180 80" stroke="red" stroke-width="2" fill="none" filter="url(#shadow)"/>
      <circle class="circle" cx=15 cy=76 r=7 stroke=#f70202 stroke-width=2 fill=#f92020 >
        <!-- 新增的动画元素 -->
        <animateMotion
          dur="5m"          <!-- 动画时长:5分钟 -->
          repeatCount="none"<!-- 只播放一次,需要循环改成indefinite -->
          fill="freeze"     <!-- 动画结束后停在终点 -->
          rotate="auto"     <!-- 圆形自动沿路径方向旋转,保持贴合 -->
        >
          <mpath href="#path"/> <!-- 绑定要跟随的路径 -->
        </animateMotion>
      </circle>
    </svg>
  </div>
</div>
.container{ 
  position: relative; 
  margin: 15% auto; 
  width: 300px; 
  height: 400px; 
  background-color: #212121; 
  box-shadow: 0 29px 38px rgba(0,0,0,0.50), 0 25px 22px rgba(0,0,0,0.30), inset 0 0 15px 5px rgb(227, 228, 229); 
  border-radius: 15px; 
  border: 2px solid; 
  border-color: #9E9E9E; 
} 
.time-container{ 
  margin: 0 auto; 
  width: 180px; 
  text-align: center; 
  border-radius: 50%; 
  box-shadow: 0px 130px 50px rgb(132, 2, 2), 0px 120px 70px rgb(99, 1, 1); 
} 
.time{ 
  font-size: 3rem; 
  color : #D50000; 
  letter-spacing: 3px; 
} 
.semi-oval{ 
  display: flex; 
  align-items: center; 
  justify-content: center; 
}

关键参数说明:

  • dur="5m":直接设置动画时长为5分钟,单位支持s(秒)、m(分钟)等
  • <mpath href="#path"/>:绑定页面中已有的路径元素,无需重复写路径代码
  • rotate="auto":让圆形在运动时自动旋转,始终与路径切线方向一致,保证"精准贴合"的视觉效果
  • fill="freeze":动画结束后停在终点,不需要的话可以去掉或改成remove

二、CSS方案(不推荐,仅作参考)

CSS本身没有直接沿贝塞尔路径运动的属性,要实现的话需要手动计算路径上的关键坐标,通过@keyframes逐帧控制transform: translate()和rotate(),非常繁琐。比如你的二次贝塞尔路径,需要用数学公式计算不同时间点的坐标,示例简化版(仅示意,无法做到完全精准):

@keyframes moveAlongPath {
  0% {
    transform: translate(0, 0) rotate(0deg);
  }
  50% {
    transform: translate(75px, -64px) rotate(90deg);
  }
  100% {
    transform: translate(165px, 0) rotate(180deg);
  }
}

.circle {
  animation: moveAlongPath 5m linear forwards;
  transform-origin: center;
}

这种方法的问题是:

  • 需要手动计算大量关键帧才能接近路径,无法做到完全精准贴合
  • 旋转角度也需要手动匹配路径切线,极易出错
  • 维护成本极高,路径修改后需要重新计算所有坐标

所以强烈推荐用SVG的<animateMotion>方案,完全满足你"精准贴合路径+5分钟缓慢移动"的需求,代码也更简洁易维护。

内容的提问来源于stack exchange,提问作者Ilimkan Omurzakova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:59:28