<video loop>必须配合muted和autoplay才能可靠循环,iOS还需playsinline;loop是布尔属性,不可赋值,JS中须设video.loop = true,setAttribute无效。

直接写 <video loop> 就能循环,但不加 muted 和 autoplay,它大概率根本不会动。
loop 属性必须是布尔属性,不能带值
浏览器只看 loop 这个属性“在不在”,不读它的值。写成 <video loop="true">、<video loop=""> 或 <video loop="loop"> 都不可靠——部分浏览器可能偶然生效,但属于未定义行为,别赌。
- ✅ 正确静态写法:
<video loop autoplay muted playsinline src="bg.mp4"> - ✅ 正确 JS 动态启用:
videoEl.loop = true(注意:必须是布尔true,不是字符串"true") - ❌ 错误 JS 写法:
videoEl.setAttribute('loop', 'true')—— 这只是往 DOM 上塞了个字符串属性,videoEl.loop读出来仍是false
loop 不起作用?先检查 muted + autoplay 是否同时存在
现代浏览器(Chrome、Safari、Edge)会静默拦截未静音的自动播放。loop 是在视频“播完后重播”,如果一开始就没播起来,循环就无从谈起。
- 缺
muted:视频卡在首帧,控制栏可能都不显示 - 缺
autoplay:用户必须点一下才开始播,此时loop虽然有效,但不符合“自动循环”预期 - iOS Safari 还额外要求
playsinline,否则强制全屏,破坏布局
想循环某一段(比如 12s–28s),不能只靠 loop
<video loop> 只能循环整个视频,HTML 原生不支持“区间循环”。要实现片段循环,必须用 JavaScript 控制时间点。
立即学习“前端免费学习笔记(深入)”;
- 监听
timeupdate事件,而不是ended(后者只在自然播完时触发) - 当
video.currentTime >= endSec时,立刻执行:video.currentTime = startSec,再调video.play() - 必须确保视频已进入
canplay状态,否则currentTime设置可能被忽略(尤其 iOS Safari) - 加
muted仍是前提——否则video.play()在多数环境下会因策略被拒绝
iOS 上 loop 经常失效,ended 事件是更稳的兜底方案
即使写了 loop、muted、autoplay、playsinline,iOS Safari(包括微信 WebView)仍可能在视频播完后停在末帧。这时候得手动接管:
- 监听
ended:video.addEventListener('ended', () => { video.currentTime = 0; video.play().catch(e => console.warn('重播失败:', e)); }) -
video.play()返回 Promise,失败时会 reject,不catch会导致静默中断 - 仅设
currentTime = 0不调play(),视频不会继续播放 - 如果页面没经历过用户交互(如点击),iOS/Chrome 可能直接拒绝
play(),需设计点击触发的降级路径
真正麻烦的从来不是加个 loop 属性,而是确保它能在各种设备、各种加载状态下稳定触发——尤其是 iOS 的静音策略和自动播放限制,会让看似简单的循环变成多层条件判断。



















