移动端视频全屏必须由用户手势触发,ios需playsinline+muted+手势三者同时满足,安卓微信则依赖x5-video-player-type等x5专属属性实现同层播放。

video 全屏触发必须由用户手势发起,否则直接报错
几乎所有现代移动端浏览器(包括 iOS Safari、Chrome for Android、微信 WebView)都强制要求:调用 requestFullscreen() 必须发生在用户真实点击或触摸的事件处理器内,不能经过异步链路。一旦在 setTimeout、fetch().then()、Promise 回调里调用,就会抛出 Failed to execute 'requestFullscreen' on 'Element': API can only be initiated by a user gesture.
- 正确写法:
button.addEventListener('click', () => videoElement.requestFullscreen()) - 错误写法:
playButton.addEventListener('click', () => play().then(() => videoElement.requestFullscreen())) - autoplay 播放完成后也不能自动全屏——哪怕视频已就绪,也得等用户再点一次
- 微信安卓 X5 内核对“用户手势”判定更严,长按、双击、
touchend后 300ms 内的调用才被认可,click可能失效,建议优先用ontouchend
iOS Safari 的 playsinline 是内联播放的唯一开关,但必须配齐条件
playsinline 不是“可选优化”,而是 iOS Safari 上让 <video></video> 停留在页面内播放的硬性前提。但它单独存在毫无作用,必须和 muted、用户首次交互后调用 play() 同时满足。
- 写法必须是
playsinline或playsinline="",playsinline="true"会被忽略 - 带声音的视频想内联播放?先静音:
<video muted playsinline></video>,再通过按钮解静音:video.muted = false; video.play() - 仅加
playsinline但没muted→ iPhone 点击仍跳原生全屏 - 仅加
muted但没playsinline→ iOS Safari 依然强制全屏(即使静音)
Android 微信 WebView 不认 playsinline,得用 x5-video-player-type 降级兜底
安卓版微信内置浏览器(X5 内核)不支持 playsinline,视频默认始终全屏。这不是 bug,是腾讯定制策略。要实现“伪小窗”效果,必须启用同层 H5 播放器。
- 关键属性:
x5-video-player-type="h5-page"(启用同层播放) +x5-video-orientation="portraint"(锁定竖屏) - 配合 CSS:
.video-container { position: relative; z-index: 1; },把操作按钮、弹幕等盖在视频上层 - 注意:
x5-video-player-type在 iOS 微信和 Chrome 中无效,需 UA 判断后动态添加 - 若不加该属性,安卓微信中任何 JS 全屏调用(包括
webkitEnterFullscreen)都会静默失败
全屏 API 名称不统一,必须按顺序尝试且带可选链保护
不同系统、不同 WebView 对全屏方法的命名完全不同,没有“一次写完到处跑”的写法。标准 requestFullscreen() 在 iOS Safari 无效,而 webkitEnterFullscreen() 只对 <video></video> 元素有效且仅限 Safari。
- 推荐调用顺序:
element.requestFullscreen()→element.webkitRequestFullscreen?.()→element.webkitEnterFullscreen?.() -
webkitEnterFullscreen()是 iOS Safari 专属,其他浏览器调用会报undefined is not a function,务必用可选链?.() - 不要漏掉
document.exitFullscreen()的兼容写法:document.exitFullscreen?.() || document.webkitExitFullscreen?.() - iframe 里视频全屏需额外加属性:
allowfullscreen、webkitallowfullscreen、mozallowfullscreen
playsinline+muted+手势 三者同时成立,而安卓微信压根不认 playsinline —— 这两个平台根本不在同一套规则里。你得先判断 UA,再决定走哪条路径,中间还不能混用逻辑。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











