video loop 属性必须以布尔形式直接写在标签中,如 ,赋值写法无效;JS 设置需用 video.loop = true 而非字符串;iOS Safari 要求 muted 和 autoplay 才支持原生循环。

video loop 属性必须作为布尔属性直接写在标签里
浏览器只检查 loop 这个属性是否存在,不读取它的值。写成 <video loop="true"></video>、<video loop=""></video> 甚至 <video loop="loop"></video> 都是无效的——只有 <video loop></video> 或 <video loop src="x.mp4"></video> 才真正触发循环。
常见错误是把 loop 当成普通 HTML 属性来赋值,结果页面毫无反应。XHTML 里虽允许 loop="loop",但现代 HTML5 项目没必要迁就这种写法,徒增理解成本。
JS 动态设置 loop 必须用布尔值,不是字符串
通过 JS 控制时,video.loop = true 有效,video.loop = "true" 无效;同理,video.setAttribute('loop', 'true') 也完全没用——它只是往 DOM 上加了个带值的属性,不改变 JS 层的 loop 状态。
需要动态切换时,注意两点:
立即学习“前端免费学习笔记(深入)”;
-
video.loop = false不会中断当前播放周期,得等这一遍播完才停 - 设完
false后建议跟一句video.load(),否则 Chrome/Safari 可能缓存旧状态,下次再设true也不生效
iOS Safari 对 loop 有硬性限制,muted + autoplay 是前提
哪怕用户已经点过屏幕、视频也已加载完成,iOS Safari(含微信内置浏览器)仍可能忽略 loop,除非同时满足:muted 和 autoplay。这是 Apple 的策略,不是 bug。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
所以背景视频想稳定循环,必须写成:
<video loop muted autoplay playsinline src="bg.mp4"></video>
其中 playsinline 防止全屏跳转,muted 绕过自动播放拦截。如果视频必须有声,iOS 下基本无法可靠实现原生循环,只能退到 ended 事件手动重播,但会引入可感知的卡顿和 Promise 拒绝风险。
手动监听 ended 事件重播比原生 loop 更可控,但也更重
当原生 loop 失效或需要精细控制(比如循环前做清理、加延迟、换源),可以用 JS 监听 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 是零成本的声明式行为,而手动重播是显式、可干预、但也更易出错的命令式路径——选哪个,取决于你是否真的需要“干预循环”这个动作本身。


















