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

如何实现滚动到对应区域时才激活SVG环形百分比进度条动画

第一步:调整CSS样式

把原本写在.circle选择器里的动画属性移除,单独放到一个触发类中,避免页面加载就自动执行动画:

/* 修改后的.circle样式 */
.circle {
 fill: none;
 stroke-width: 2.8;
 stroke-linecap: round;
 /* 把原有的animation属性迁移到下方新增的触发类中 */
}
/* 新增动画触发类 */
.circle.animated {
  animation: progress 1s ease-out forwards;
}

/* 其余原有CSS代码无需修改 */
.circular-chart {
 display: block;
 margin: 10px auto;
 max-width: 80%;
 max-height: 250px;
}
.circle-bg {
 fill: none;
 stroke: #eee;
 stroke-width: 3.8;
}
@keyframes progress {
0% {
 stroke-dasharray: 0 100;
   }
 }
.circular-chart.orange .circle {
 stroke: #ea5031;
 }
.percentage {
 fill: #666;
 font-family: sans-serif;
 font-size: 0.5em;
 text-anchor: middle;
 } 

第二步:添加滚动监听触发逻辑

使用性能更优的IntersectionObserver API实现元素进入视口检测,无需监听滚动事件,不会造成额外性能损耗:

// 等待DOM结构加载完成后执行逻辑
document.addEventListener('DOMContentLoaded', function() {
  // 选中页面内所有环形进度条元素
  const circularCharts = document.querySelectorAll('.circular-chart');
  // 定义观察者实例
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      // 当进度条元素进入视口时触发
      if (entry.isIntersecting) {
        // 给当前进度条的环形路径添加动画触发类
        const circleEl = entry.target.querySelector('.circle');
        circleEl.classList.add('animated');
        // 触发一次后取消监听,避免滚动重复触发动画
        observer.unobserve(entry.target);
      }
    })
  }, {
    threshold: 0.1 // 元素露出10%时触发,可根据需求自行调整数值
  });
  // 给所有进度条绑定监听
  circularCharts.forEach(chart => {
    observer.observe(chart);
  })
})

修改完成后,进度条只会在滚动到视口范围内时才会触发动画,不会在页面加载时自动执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:09:03