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

基于进度条属性动态调整SCSS脉冲动画时长的方法

解决进度条脉冲动画速度随长度变化的问题

这个问题的核心原因是你当前的动画使用了百分比单位定义background-position的变化——百分比是相对于进度条自身宽度计算的。进度条越长,-50%到150%对应的实际像素距离就越大,而动画时长固定为2秒,自然视觉上速度就变快了。

下面是两种可行的解决方案:

方案1:纯CSS固定移动距离(推荐)

把background-position的百分比换成固定像素值+calc(),让动画移动的总像素距离保持一致,这样无论进度条长度如何,速度都能稳定:

.progress {
  &__bar {
    /* 可自定义脉冲覆盖的宽度,比如200px */
    --pulse-overlay-width: 200px;
    animation: pulse 2s ease-out infinite;
  }
}

@keyframes pulse {
  0% { 
    background-position: calc(var(--pulse-overlay-width) * -1) center, right center, left center; 
  }
  100% { 
    background-position: calc(100% + var(--pulse-overlay-width)) center, right center, left center; 
  }
}

原理

动画从进度条左侧外--pulse-overlay-width的位置,移动到进度条右侧外--pulse-overlay-width的位置,总移动距离是2 * --pulse-overlay-width(固定像素值),搭配固定的2秒时长,速度就完全一致了。你可以调整--pulse-overlay-width来控制脉冲覆盖的宽度。

方案2:JS动态计算动画时长

如果需要保留百分比的相对逻辑,可以通过JS根据进度条的实际宽度动态调整animation-duration,让移动速度(像素/秒)保持恒定:

// 假设你希望每秒移动200像素(可自定义)
const pixelsPerSecond = 200;
const bar = document.querySelector('.progress__bar');
const percent = 75; // 示例进度百分比
const barWidth = (percent / 100) * bar.parentElement.offsetWidth;

// 原动画-50%到150%对应进度条宽度的2倍距离
const totalDistance = barWidth * 2;
// 计算适配的动画时长:总距离 / 每秒移动像素
const animationDuration = totalDistance / pixelsPerSecond;

// 应用样式
bar.style.width = `${percent}%`;
bar.style.animationDuration = `${animationDuration}s`;

原理

通过计算进度条的实际像素宽度,推导动画需要移动的总像素距离,再除以期望的每秒移动像素数,得到匹配的动画时长,确保不同长度的进度条动画速度一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:50