playbackRate 属性可直接设置 video/audio 播放速度,1 为正常,2 为 2 倍速,0.5 为半速,负数支持倒放(部分浏览器限制),需在 loadedmetadata 后设置且依赖用户手势触发。

怎么用 playbackRate 调整 HTML5 或 播放速度
HTML5 原生支持倍速播放,核心是元素的 playbackRate 属性,它直接控制媒体时间轴推进速度。值为 1 是正常速度,2 是 2 倍速,0.5 是半速,负数还能倒放(部分浏览器限制)。
注意:该属性只对已加载元数据(loadedmetadata 事件后)的媒体生效;设置后不会自动触发播放,需手动调用 play() 或依赖用户交互触发。
-
video.playbackRate = 1.5—— 立即生效,无需重载 - 设为
0会暂停(但不推荐用这个代替pause()) - 某些安卓 WebView 或旧版 Safari 对非 1x 值支持不稳定,建议检测:
if ('playbackRate' in video)
如何安全地暂停/恢复动画(含 CSS 动画与 JS 控制)
CSS 动画和 JS 驱动的动画暂停逻辑完全不同,不能混用同一套方法。
- 对于
@keyframes+animation的 CSS 动画:
用element.style.animationPlayState = 'paused'暂停,设为'running'恢复;
注意它不改变当前动画时间点,恢复后从暂停处继续 - 对于
requestAnimationFrame自驱动的 JS 动画:
保存上一帧时间戳,暂停时停止调用requestAnimationFrame,恢复时重新启动循环;
别直接用setTimeout模拟,会丢失帧同步精度 - Web Animations API(
element.animate()返回的Animation对象):
有原生pause()/play()方法,且支持playbackRate动态调节
为什么 playbackRate 设了没反应?常见卡点
不是所有场景都能自由调速,浏览器策略和媒体状态会拦截无效操作。
立即学习“前端免费学习笔记(深入)”;
- 未满足「用户手势触发」条件:Chrome 等要求首次播放必须由
click、touchstart等事件驱动,之后才能调playbackRate - 媒体尚未进入
readyState >= 1(即至少已加载元数据),可在onloadedmetadata回调里设速 - 视频源为 HLS 或 MSE 流时,部分浏览器(如 iOS Safari)禁用
playbackRate修改,仅支持 1x - 设置了
controls属性的,其内置控件可能覆盖你的playbackRate设置(尤其在拖拽进度条后)
Canvas 动画如何实现倍速控制(非媒体元素)
Canvas 本身无播放速率概念,所有节奏都由 JS 主导,所以倍速本质是调整时间步长(delta time)或帧间隔。
- 在
requestAnimationFrame循环中,记录performance.now()时间差,乘以倍速系数再更新逻辑:const delta = (now - lastTime) * speedFactor; - 避免直接改
setTimeout延时——会导致帧率抖动,requestAnimationFrame才能匹配屏幕刷新率 - 物理模拟类动画(如粒子、弹簧)必须同步缩放时间步长,否则运动轨迹失真;纯位移动画可只缩放位置增量
- 若用
canvas.animate()(Web Animations API),则直接操作返回的Animation实例的playbackRate
实际做倍速控制时,最容易被忽略的是「不同动画类型对应不同控制入口」:媒体元素靠属性、CSS 动画靠样式、Canvas 靠逻辑时间缩放、Web Animations API 靠实例方法——混用或漏判类型,就会出现“设了没反应”或“暂停失效”。











