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

用JavaScript模拟CSS动画makeItfadeIn,实现range滑块同步动效

同步Range滑块与CSS动画的实现方案

问题背景

现有一段CSS进度条动画(makeItfadeIn),包含1秒延迟、3秒时长、ease(先快后慢)的缓动效果,需要让页面中的<input type="range">滑块执行完全同步的动画:从value=0滑动到指定目标值,最终与进度条同步到位。

修正后的基础代码

先调整原有CSS,避免样式冲突影响range滑块的正常显示:

.outer {
  margin: 50px;
}

.progress {
  border: 1px solid black;
  border-radius: 3px;
  width: 100%;
  height: 30px;
  background: linear-gradient(to right, hotpink 50%, transparent 0);
  background-size: 200% 100%;
  background-position: right;
  animation: makeItfadeIn 3s 1s forwards;
}

@keyframes makeItfadeIn {
  100% {
    background-position: left;
  }
}

/* 给range滑块单独设置基础样式 */
.slider {
  width: 100%;
  margin-top: 10px;
}

对应HTML结构:

<div class="outer">
  <div class="progress"></div>
  <input type="range" value="0" min="0" max="100" class="slider" />
</div>

JavaScript同步动画实现

核心逻辑:监听CSS动画的启动事件,触发滑块动画时使用与CSS完全一致的缓动、时长参数,保证同步性。

// 获取页面元素
const progressBar = document.querySelector('.progress');
const slider = document.querySelector('.slider');
const targetValue = 50; // 对应进度条的50%目标位置

// 模拟CSS默认的ease缓动函数(匹配cubic-bezier(0.25, 0.1, 0.25, 1))
function easeEasing(t) {
  return t < 0.5 
    ? 4 * t * t * t 
    : 1 - Math.pow(-2 * t + 2, 3) / 2;
}

// 滑块动画执行函数
function animateSlider() {
  const startTime = performance.now();
  const duration = 3000; // 与CSS动画一致的3秒时长
  const startValue = 0;
  const valueDiff = targetValue - startValue;

  function updateSlider(currentTime) {
    const elapsed = currentTime - startTime;
    if (elapsed >= duration) {
      slider.value = targetValue;
      return;
    }
    // 计算当前缓动进度对应的滑块值
    const progress = easeEasing(elapsed / duration);
    const currentValue = startValue + valueDiff * progress;
    slider.value = currentValue;
    requestAnimationFrame(updateSlider);
  }

  slider.value = 0; // 重置初始值
  requestAnimationFrame(updateSlider);
}

// 监听CSS动画启动事件,同步触发滑块动画
progressBar.addEventListener('animationstart', animateSlider);

关键细节说明

  • 缓动一致性:自定义的easeEasing函数完全复刻CSS默认ease的动画节奏,保证滑块与进度条的运动曲线完全同步。
  • 触发时机对齐:通过animationstart事件监听CSS动画的实际启动点,自动匹配1秒延迟后的动画开始时间。
  • 流畅度保障:使用requestAnimationFrame实现帧级更新,确保滑块动画的流畅度与CSS动画一致。

内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:32:36