html5嵌入视频无法全屏_html5嵌入视频全屏设置【方案】

video标签需同时添加webkitallowfullscreen和allowfullscreen属性,且须满足格式、尺寸、触发时机等五项条件才能在iOS Safari等移动端正常全屏。

video 标签没加 webkitallowfullscreenallowfullscreen 属性

HTML5 在 Chrome、Safari、Edge 等浏览器中默认禁用全屏,必须显式声明允许。只写 allowfullscreen 不够——老版 Safari(iOS 10 / macOS 10.12 之前)还依赖 webkitallowfullscreen

正确写法示例:

  • allowfullscreen 是标准属性,现代浏览器都认
  • webkitallowfullscreen 是 Safari/WebKit 旧版本的兼容补丁,不加可能导致 iOS Safari 点击全屏按钮无响应
  • 如果用了 iframe 嵌套视频(比如 YouTube),则需在 iframe 上加 allow="fullscreen"

父容器或 CSS 强制限制了全屏行为

即使 属性齐全,若它被包裹在 position: fixedtransformoverflow: hidden 或设置了 z-index 的容器里,全屏后可能被裁剪、错位甚至触发白屏。

常见问题场景:

  • Modal 弹窗内嵌视频:弹窗本身有 transform: scale()will-change: transform,会干扰全屏渲染层
  • 使用了 CSS Grid/Flex 布局且子项设了 align-self: center 等,全屏时布局重算异常
  • 全局 CSS 重置了 videodisplay(如设为 inline),而全屏需要 block 行为

临时排查方法:全屏后右键检查元素,看是否被某个父级 overflow: hidden 截断,或是否有 transform 层叠上下文干扰。

JavaScript 调用 requestFullscreen() 失败报错 “Document not focused”

浏览器强制要求:全屏 API 必须由用户手势(如 clicktouchend)直接触发,不能放在异步回调(setTimeoutPromise.then)、定时器或自动播放逻辑里。

典型错误写法:

video.addEventListener('canplay', () => {
  setTimeout(() => video.requestFullscreen(), 100); // ❌ 非直接手势,被拒绝
});

正确做法:

  • 绑定到明确的用户操作上,例如自定义全屏按钮的 click 事件
  • 确保调用前视频已加载就绪(readyState >= 3),否则部分浏览器会静默失败
  • 捕获异常并提示用户(如 document.fullscreenElementnull 且无报错时,可能是策略拦截)

移动端(尤其是 iOS Safari)全屏仍不生效

iOS Safari 对 全屏有额外限制:仅当视频满足以下全部条件时,才允许原生全屏控件出现:

  • 未设置 playsinline 属性(加了它就会强制行内播放,禁用全屏按钮)
  • 视频格式为 H.264 编码 + AAC 音频(MP4 容器),WebM 在 iOS 不支持全屏
  • 视频尺寸大于等于 320×240 像素(太小的视频会被忽略全屏能力)
  • 页面未启用 viewportuser-scalable=no(会间接禁用某些手势响应)

注意:playsinline 是双刃剑——它让视频在微信、QQ 内置浏览器里能自动播放,但代价是彻底关掉 iOS 原生全屏入口。

如需兼顾,得用 UA 检测 + 动态移除该属性。

全屏不是万能开关,尤其在移动端,每个系统都在悄悄加自己的规则。最稳的方式,是把 allowfullscreenwebkitallowfullscreen、格式、尺寸、触发时机这五点全对齐,缺一不可。