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

CSS关键帧动画仅首次触发,进度条二次点击无动画效果求助

解决CSS进度条动画仅首次点击生效的问题

问题根源

你当前的写法是直接给.progress-value绑定了load关键帧动画,但CSS动画默认仅在元素首次渲染时执行一次。后续通过JS直接修改width样式,不会触发动画重新执行——因为浏览器认为该动画已经完成,没有触发重跑的触发点。

方案一:用CSS过渡(Transition)替代关键帧动画(推荐)

如果你的动画只是简单的宽度从当前值过渡到目标值,用transition会更简洁,且无需处理动画重置逻辑,每次修改宽度都会自动触发过渡:

修改后的CSS:

.progress-value {
  background: #b4b6ff;
  height: 20px;
  width: 0;
  transition: width 2s linear; /* 设置宽度过渡动画,时长和曲线可自定义 */
}

按钮JS代码无需额外修改,直接设置宽度即可:

// 第一个按钮
document.getElementById('progres-bar-1').style.width = '50%';

// 第二个按钮
document.getElementById('progres-bar-1').style.width = '20%';

// 第三个按钮
document.getElementById('progres-bar-1').style.width = '80%';

方案二:重置动画状态触发重跑

如果你坚持使用关键帧动画,需要每次点击时重置元素的动画状态,让浏览器重新执行动画:

首先调整CSS,将动画抽离为独立类:

.progress-value {
  background: #b4b6ff;
  height: 20px;
  width: 0;
}

.progress-animate {
  animation: load 2s normal forwards;
}

@keyframes load {
  0% { width: 0; }
}

然后修改按钮JS代码,每次点击时先重置元素状态,再重新触发动画:

// 封装复用函数,避免重复代码
function updateProgress(targetWidth) {
  const bar = document.getElementById('progres-bar-1');
  // 移除动画类,重置宽度
  bar.classList.remove('progress-animate');
  bar.style.width = '0%';
  // 强制浏览器触发重绘,否则重置操作可能不生效
  void bar.offsetWidth;
  // 重新添加动画类,设置目标宽度
  bar.classList.add('progress-animate');
  bar.style.width = targetWidth;
}

// 第一个按钮调用
updateProgress('50%');
// 第二个按钮调用
updateProgress('20%');
// 第三个按钮调用
updateProgress('80%');

这里的void bar.offsetWidth是关键——它会强制浏览器立即计算元素的布局,让之前的重置操作被识别,从而重新触发动画。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:50:24