You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

进度条无限循环动画无法正常重复重启的问题求助

进度条无限循环动画无法正常重复重启的问题求助

我最近用HTML和JavaScript做了一个简单的进度条,页面刷新的时候动画能正常运行,但我想让它完成后从头开始无限循环,现在重复重启的功能完全没生效,麻烦大家帮忙看看问题出在哪了!

我的代码如下:

HTML

<div class="progress-bar-container">
  <div class="progress-bar" id="progressBar"></div>
</div>

CSS

.progress-bar-container {
  width: 100%;
  height: 3px;
  background-color: #e0e0e0;
  border-radius: 2px;
  overflow: hidden;
}

.progress-bar {
  width: 100%;
  height: 100%;
  background: linear-gradient(to right, #ff0008, #fad0c4, #ffecd2);
  transform: translateX(100%);
  transition: transform 5s linear;
}

.progress-bar.active {
  transform: translateX(0);
}

JavaScript

const progressBar = document.getElementById('progressBar');

function startProgressBarAnimation() {
  progressBar.classList.remove('active');

  setTimeout(() => {
    progressBar.classList.add('active');
  }, 100);
}

startProgressBarAnimation();

progressBar.addEventListener('transitionend', () => {
  progressBar.style.transition = 'none';

  progressBar.style.transform = 'translateX(100%)';
  setTimeout(() => {
    progressBar.style.transition = 'transform 5s linear';
    startProgressBarAnimation();
  }, 10);
});

问题分析与解决方案

你当前的代码逻辑里,transitionend事件的处理有点绕,而且可能因为浏览器重绘时机的问题,导致重置动画的操作没被正确识别。这里给你两种可行的修复方案:

方案1:简化JS逻辑,强制触发重绘

我们可以去掉复杂的transition样式修改,直接通过操作类名+强制重绘来实现循环,这样更可靠:

修改后的JavaScript代码:

const progressBar = document.getElementById('progressBar');

function startProgressBarAnimation() {
  // 移除active类,让进度条回到初始位置
  progressBar.classList.remove('active');
  // 强制浏览器触发重绘,确保样式更新生效
  void progressBar.offsetWidth;
  // 重新添加active类,启动动画
  setTimeout(() => {
    progressBar.classList.add('active');
  }, 100);
}

// 初始化启动动画
startProgressBarAnimation();

// 监听动画结束事件,重启动画
progressBar.addEventListener('transitionend', startProgressBarAnimation);

方案2:改用CSS Animation(更推荐)

如果只是需要简单的无限循环,完全可以不用JavaScript监听事件,直接用CSS的animation属性,代码更简洁,也更稳定:

修改后的CSS代码:

.progress-bar-container {
  width: 100%;
  height: 3px;
  background-color: #e0e0e0;
  border-radius: 2px;
  overflow: hidden;
}

.progress-bar {
  width: 100%;
  height: 100%;
  background: linear-gradient(to right, #ff0008, #fad0c4, #ffecd2);
  /* 使用CSS动画,设置无限循环 */
  animation: progressLoop 5s linear infinite;
}

@keyframes progressLoop {
  0% {
    transform: translateX(100%);
  }
  100% {
    transform: translateX(-100%);
  }
}

对应的JavaScript可以完全删掉,只保留HTML结构就行——CSS会自动处理无限循环的动画!

备注:内容来源于stack exchange,提问作者DolDurma

火山引擎 最新活动