playsinline 未生效是因为它仅是许可属性,需同时设置 webkit-playsinline、x5-playsinline、muted 和 autoplay,并在用户手势上下文中调用 play(),且避免第三方库干扰。

video 标签加 playsinline 为什么没生效?
在 iOS Safari 或微信 WebView 中,<video></video> 默认强制全屏播放,加了 playsinline 却还是跳全屏,大概率是漏了关键约束条件。这个属性本身只起“许可”作用,不等于强制内联——它必须配合其他属性一起用才有效。
-
playsinline必须写在<video></video>标签上,不能靠 JS 动态添加(iOS 不认) - 必须同时设置
webkit-playsinline(旧版 Safari 兼容)和x5-playsinline(腾讯 X5 内核,如微信) - 不能有
controls属性?错——可以有,但 iOS 下若用户点击控制栏里的全屏按钮,仍会进全屏;真正要防的是自动触发的全屏行为(比如点击播放、play()调用) - 如果视频带音频(哪怕静音),iOS 仍可能拦截内联播放:需确保
muted+autoplay(或用户手势触发)
完整可用的 video 标签写法
以下是最小可行配置,覆盖 iOS Safari、微信、QQ 浏览器等主流移动端环境:
<video src="example.mp4" playsinline webkit-playsinline x5-playsinline muted autoplay loop controls></video>
注意:autoplay 在多数浏览器中要求 muted,否则会被静音阻止;loop 非必需,但能避免播放结束后自动退出内联状态;controls 可保留,但别指望它阻止用户手动点全屏按钮。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
JS 调用 play() 时 still full-screen?
即使标签写对了,用 JS 主动调用 video.play() 仍可能失败或触发全屏,原因通常是调用时机不在用户手势上下文(如 click/tap 事件回调内)。iOS 要求播放必须由明确的用户交互触发。
- ✅ 正确:绑定在
button.onclick或div.ontouchend里调用play() - ❌ 错误:在
setTimeout、Promise.then、scroll回调里调用 —— 这些不属于有效手势上下文 - 如果必须异步播放(比如加载完再播),可先在手势回调中调用一次空的
play()(捕获上下文),再用video.load()+video.play()组合
微信里还全屏?检查 X5 内核是否启用
微信内置浏览器基于腾讯 X5 内核,x5-playsinline 是关键开关,但它只在 X5 启用时生效。如果页面被识别为“非 X5 兼容模式”,该属性会被忽略。
- 确认方式:在微信中打开
debugtbs.qq.com查看内核版本,或打印typeof window.wx !== 'undefined'和typeof window.qb !== 'undefined' - 常见干扰项:页面引入了某些重写
video行为的第三方库(如 video.js、plyr),它们可能覆盖原生属性;优先用原生<video></video>标签测试 - 微信 8.0.33+ 对
playsinline支持更稳定,旧版本(尤其安卓微信)可能仍有兼容问题,建议 fallback 到 poster 图 + 手动唤起播放提示
最麻烦的不是属性写不写,而是不同环境对“用户意图”的判定逻辑不一致——iOS 看手势链,X5 看内核开关,Chrome on Android 则基本无视 playsinline(它本来就不强制全屏)。别指望一行属性解决所有问题。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










