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

如何实现顶部填充、底部渐变收尾的可旋转SVG描边圆形?

嘿,针对你要实现的这种顶部12点填充、底部6点渐变收尾的旋转SVG spinner,我推荐用SVG原生描边属性+CSS动画的方案,这是性能最优、代码最简洁的实现方式,完全不需要JS,纯前端就能搞定。下面是完整的实现代码和详细解释:

完整实现代码

<div id="container">
  <svg id="svg-spinner" version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" width="100" height="100">
    <defs>
      <!-- 定义垂直方向的线性渐变:顶部实色,底部渐变透明 -->
      <linearGradient id="strokeGrad" x1="0" y1="0" x2="0" y2="1">
        <stop offset="0%" stop-color="#2563eb" />
        <stop offset="90%" stop-color="#2563eb" />
        <stop offset="100%" stop-color="#2563eb" stop-opacity="0" />
      </linearGradient>
    </defs>
    <!-- 圆形描边:起点通过rotate转到12点,仅显示半圆描边 -->
    <circle 
      cx="50" cy="50" r="45" 
      fill="none" 
      stroke="url(#strokeGrad)" 
      stroke-width="8"
      stroke-dasharray="141.37 141.37"
      transform="rotate(-90deg 50 50)"
    />
  </svg>
</div>

<style>
@keyframes spin {
  /* 从初始-90度旋转到270度,刚好完成一圈360度旋转 */
  from { transform: rotate(-90deg); }
  to { transform: rotate(270deg); }
}

#svg-spinner circle {
  animation: spin 1.5s linear infinite;
  /* 开启GPU加速,提升动画流畅度 */
  transform-origin: 50% 50%;
}
</style>

关键细节解释

  • 渐变设置:linearGradient的y1="0"到y2="1"是垂直方向渐变,前90%保持实色(保证顶部12点到接近6点的位置都是填充效果),最后10%渐变到透明,实现6点位置的平滑收尾。你可以调整stop的offset值来控制渐变收尾的长度。
  • 描边起点调整:SVG圆形的默认描边起点是3点钟位置,通过transform="rotate(-90deg 50 50)"将起点旋转到12点钟,刚好符合你的需求。
  • 描边长度控制:stroke-dasharray="141.37 141.37"中,141.37是半圆的周长(2 * π * 45 / 2 ≈ 141.37),第一个值是显示的描边长度,第二个是隐藏的长度,这样只显示从12点到6点的半圆弧。
  • 旋转动画:CSS动画spin从rotate(-90deg)(初始位置)转到rotate(270deg),刚好完成360度旋转,linear保证匀速,infinite实现无限循环。加上transform-origin: 50% 50%确保围绕圆心旋转,开启GPU加速提升流畅度。

为什么这是最优方案?

  • 性能极佳:纯CSS+SVG动画,浏览器会用GPU加速,没有JS执行开销,在各种设备上都能流畅运行。
  • 可维护性强:所有参数(颜色、粗细、动画速度、渐变长度)都可以直接修改,无需复杂逻辑。
  • 兼容性好:支持所有现代浏览器,甚至IE11也能兼容SVG描边和CSS动画(需要调整前缀,但基本可用)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:41:19