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

循环中clearInterval后重启setInterval的进度条动画问题

解决进度条依次动画的问题

你的代码中,for循环会同步执行三次setInterval调用,导致三个进度条同时开始动画,没有实现“完成一个再启动下一个”的逻辑。以下是两种可行的解决方案:

方案一:递归调用实现依次动画

这种方式通过递归函数,在前一个进度条动画完成后自动启动下一个:

const items = document.getElementsByClassName('bar');
let currentIndex = 0;

function animateNextBar() {
  // 所有进度条处理完毕则退出
  if (currentIndex >= items.length) return;

  const currentBar = items[currentIndex];
  let counter = 0;
  const intervalId = setInterval(() => {
    if (counter >= 100) {
      clearInterval(intervalId);
      currentIndex++;
      // 当前进度条完成,启动下一个
      animateNextBar();
    } else {
      counter++;
      currentBar.style.width = `${counter}%`;
    }
  }, 10);
}

// 启动第一个进度条动画
animateNextBar();

方案二:Promise + async/await 实现顺序执行

将单个进度条的动画封装为Promise,再通过async/await按顺序执行:

const items = document.getElementsByClassName('bar');

// 封装单个进度条动画为Promise
function animateBar(bar) {
  return new Promise(resolve => {
    let counter = 0;
    const intervalId = setInterval(() => {
      if (counter >= 100) {
        clearInterval(intervalId);
        resolve();
      } else {
        counter++;
        bar.style.width = `${counter}%`;
      }
    }, 10);
  });
}

// 按顺序执行所有进度条动画
async function animateAllBars() {
  for (const bar of items) {
    await animateBar(bar);
  }
}

animateAllBars();

两种方案的核心逻辑都是避免同步启动所有定时器,而是在前一个进度条的动画完成后,再触发下一个的动画流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:03:16