html全屏不等于沉浸体验,需用env(safe-area-inset-*)补白、viewport-fit=cover、video.requestfullscreen()替代、监听document的fullscreenchange事件并轮询fullscreenelement、用inset定位退出按钮且设最高z-index。

HTML全屏本身不等于沉浸体验,但用户一旦进入全屏,立刻会暴露沉浸适配缺失的问题——状态栏遮字、导航栏压按钮、退出无路径、视频黑边,这些都不是“没全屏”,而是“没适配好”。
为什么 document.documentElement.requestFullscreen() 后页面还是被切掉?
因为现代移动系统(尤其是 iOS 和 Android 12+)默认将网页渲染在「安全区域」内,requestFullscreen() 只触发浏览器级全屏,不自动拉伸到状态栏/导航栏下方。你看到的“被切”,其实是内容被系统 UI 遮挡了。
- 必须手动启用 CSS 沉浸式布局:
env(safe-area-inset-top)、env(safe-area-inset-bottom)配合padding或margin补白 - Android 上需额外设置
viewportmeta:<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> - iOS Safari 对非
<video></video>元素的全屏支持极弱,documentElement全屏常静默失败,建议改用video.requestFullscreen()并加webkit-playsinline属性
fullscreenchange 事件监听不到状态变化?
监听对象错了。这个事件只在 document 上触发,不是绑定在目标元素上。而且移动端某些场景(比如从视频全屏切回)可能不抛出该事件,必须配合 document.fullscreenElement 主动轮询校验。
- 正确写法:
document.addEventListener('fullscreenchange', handler),不是element.addEventListener - 不要只信事件:进入后立即读取
document.fullscreenElement,退出后延时 100ms 再读一次,避免 iOS Safari 的状态延迟 -
fullscreenerror必须监听并console.error出错原因,常见如NotAllowedError(非手势触发)或SecurityError(跨域 iframe 内调用)
怎么让退出按钮在全屏下始终可见?
退出按钮不能靠固定定位(position: fixed)硬塞在右上角——全屏后视口尺寸突变,且安全区域偏移会让它被状态栏吞掉。
- 用
position: absolute+inset定位:inset: env(safe-area-inset-top) auto auto env(safe-area-inset-right) - 按钮容器需设
z-index: 2147483647(最高层),防止被浏览器 UI 层盖住 - iOS 上
requestFullscreen()后,document.body会临时添加:-webkit-full-screen伪类,可借此单独样式控制按钮显隐
真正难的不是调用 requestFullscreen(),而是全屏后那几毫秒里,要同时处理好系统 UI 侵占、CSS 渲染边界、事件时机漂移和降级 fallback —— 这些细节不补全,用户点一下就“卡住”,比不提供全屏更伤体验。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











