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

如何实现环形进度条进入视图时触发动画?

实现环形进度条进入视口时触发动画

现有JavaScript代码在页面加载时自动运行环形进度条动画,希望修改为当进度条元素进入视口时才触发该动画,具体实现方法如下:

核心思路

使用Intersection Observer API监听进度条元素的可见性,当元素进入视口时再执行动画逻辑,同时确保动画只触发一次,避免重复执行。

修改后的代码

// 获取目标元素
let progressBar = document.querySelector(".circular-progress");
let valueContainer = document.querySelector(".value-container");

let progressValue = 0;
let progressEndValue = 65;
let speed = 50;
let animationTriggered = false; // 标记动画是否已触发

// 封装动画逻辑为函数
function startProgressAnimation() {
    if (animationTriggered) return; // 已触发则直接返回
    animationTriggered = true;
    
    let progress = setInterval(() => {
        progressValue++;
        valueContainer.textContent = `${progressValue}%`;
        progressBar.style.background = `conic-gradient(
            #FBDA9D ${progressValue * 3.6}deg,
            #683279 ${progressValue * 3.6}deg
        )`;
        if (progressValue === progressEndValue) {
            clearInterval(progress);
        }
    }, speed);
}

// 创建Intersection Observer实例
const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
        // 当元素进入视口时触发动画
        if (entry.isIntersecting) {
            startProgressAnimation();
            // 动画触发后取消监听,避免重复执行
            observer.unobserve(entry.target);
        }
    });
}, {
    threshold: 0.1 // 元素10%进入视口时触发,可按需调整
});

// 开始监听进度条元素
if (progressBar) {
    observer.observe(progressBar);
}

代码说明

  • animationTriggered变量用于标记动画是否已经执行,防止元素反复进出视口时重复触发。
  • threshold参数可自定义,设为0.1表示元素有10%进入视口就触发,设为1则表示元素完全进入视口才触发。
  • 动画启动后调用unobserve取消监听,避免不必要的性能消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:32:14