
video.playbackRate 属性必须用 JS 动态设置,不能写在 HTML 里
直接在 <video playbackrate="1.5"></video> 或 <video playbackrate="1.5"></video> 中设值是无效的——HTML 解析器根本不认识这个属性,它只存在于 DOM 接口层面。
-
playbackRate是只读/写属性,只能通过 JavaScript 访问和修改 - 写错大小写(如
playbackrate)会导致静默失败,不报错也不生效 - 桌面 Chrome/Firefox 支持任意合法浮点数(如
1.25、0.75),但旧版 Edge 会自动四舍五入到最近支持值(1.25→1.25,1.3→1.25) - iOS Safari 要求用户点击等手势触发后才能修改非
1.0值,否则设置成功但实际不变(video.playbackRate读回来还是1.0)
必须等视频加载到 loadedmetadata 或 canplay 才能安全设置
常见错误:页面一加载就执行 video.playbackRate = 1.5,结果在 Firefox 或 Safari 上完全没反应,控制台也无报错。
- 视频元素刚创建时
readyState是0(HAVE_NOTHING),此时设置playbackRate会被忽略 - 推荐监听
loadedmetadata(元数据已加载,含时长、尺寸)或canplay(可开始播放)事件再设置 - 更稳妥的写法是封装一个函数,先检查
video.readyState >= 2(即 HAVE_METADATA),否则挂载一次性的事件监听 - 不要依赖
ratechange事件来同步 UI 显示——它不一定触发,按钮点完立刻更新文本更可靠
倍速值有浏览器隐式范围限制,超出会静默截断或抛错
你以为设 video.playbackRate = 10 就能飞速播放?现实是:Chrome 允许 0.0625–16.0,Safari 桌面版约 0.25–4.0,iOS 则只认 0.5/1.0/1.5/2.0 这几个离散值。
- 超出范围时行为不一致:Chrome 静默截断为最近合法值,Firefox 可能抛
DOMException,Safari iOS 直接忽略 - 负数(如
-1.0)理论上支持反向播放,但仅 Chrome 和部分桌面 Safari 实现较完整,移动端基本不可用 - 设置后务必读回验证:
if (video.playbackRate !== targetRate) { /* 处理降级 */ } - 用户输入框场景下,建议加
Math.min(Math.max(parseFloat(val), 0.25), 4.0)做兜底
移动端 iOS 必须“用户手势触发”,自动播放后调速大概率失败
这是最常被忽略的兼容性雷区:哪怕视频已自动播放,你在 setTimeout 里设 playbackRate,iOS Safari 仍会拒绝——它只认点击、触摸、键盘等明确由用户发起的动作。
立即学习“前端免费学习笔记(深入)”;
- 所有倍速按钮必须绑定在真实用户交互事件上(
click、touchend),不能靠定时器或loadeddata后自动触发 - 不能在
autoplay+play()成功回调里立刻改playbackRate,必须再套一层用户事件(比如点一下“恢复播放”按钮才允许调速) - 如果要用快捷键(如按
→快进 + 调速),需确保keydown事件发生在 video 获焦或 document 有用户交互历史之后 - 没有银弹:iOS 上想“打开页面就 1.5 倍速播放”,目前无法绕过用户首次点击
事情说清了就结束。真正难的不是写那行 video.playbackRate = x,而是让这行代码在所有设备上都按你想的那样跑起来。











