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

滑块控制CSS关键帧动画速度失效:拖动时动画停止问题求助

解决滑块控制CSS动画速度时停止的问题

问题根源是:修改CSS动画时长变量时,浏览器会重置动画并从头开始播放,视觉上表现为动画停止。以下是无需额外库的解决方案,核心是通过JS记录动画当前进度,修改速度后让动画从当前位置继续:

实现步骤

1. 基础HTML/CSS结构

定义CSS变量控制动画时长,背景位移动画保持无限循环:

<div class="blackhole"></div>
<input type="range" id="speed-slider" min="0.3" max="4" step="0.1" value="1">
:root {
  --anim-duration: 1s; /* 默认动画时长 */
}

.blackhole {
  width: 300px;
  height: 300px;
  background: url('你的黑洞背景图路径') repeat-x;
  animation: blackhole-slide var(--anim-duration) linear infinite;
}

@keyframes blackhole-slide {
  to {
    background-position-x: -3600px; /* 替换为你的背景图总宽度 */
  }
}

2. JS控制逻辑

监听滑块输入事件,记录动画当前进度,修改速度后通过负延迟让动画续播:

const slider = document.getElementById('speed-slider');
const blackholeEl = document.querySelector('.blackhole');
let prevDuration = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--anim-duration'));

slider.addEventListener('input', (e) => {
  // 获取当前动画已运行时间
  const currentAnimTime = parseFloat(getComputedStyle(blackholeEl).animationCurrentTime);
  // 计算已完成的进度比例
  const progress = currentAnimTime / prevDuration;
  // 滑块对应的新时长
  const newDuration = parseFloat(e.target.value);
  
  // 设置负延迟,让动画直接跳转到当前进度位置
  blackholeEl.style.animationDelay = `-${progress * newDuration}s`;
  // 更新CSS变量
  document.documentElement.style.setProperty('--anim-duration', `${newDuration}s`);
  
  // 更新记录的上一次时长
  prevDuration = newDuration;
});

关键原理

  • animationCurrentTime:浏览器返回的动画当前已运行时长,用于计算进度
  • 负的animation-delay:强制动画从指定进度点开始播放,避免重置到初始状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:52:38