全屏api需通过用户手势触发element.requestfullscreen(),监听document的fullscreenchange事件并用document.fullscreenelement判断状态,退出调用document.exitfullscreen(),注意移动端限制与css适配。

全屏 API 的基本调用方式(requestFullscreen)
现代浏览器通过 Element.requestFullscreen() 启动全屏,它返回 Promise,成功进入全屏后 resolve,失败则 reject。注意:该方法必须由用户手势(如 click、keydown)触发,否则会被浏览器静默拒绝。
- 只支持挂载在 DOM 元素上,不能直接对
document或window调用 - 推荐作用于容器元素(如
<div id="app">),而非 <code>—— 后者在部分浏览器(如 Safari)中可能被忽略或降级为伪全屏 - 调用前建议检查兼容性:
if (el.requestFullscreen),或使用el.webkitRequestFullscreen/el.msRequestFullscreen作降级(但 IE11 已淘汰,通常可不处理) - 监听位置必须是
document,不是触发全屏的元素本身 - 通过
document.fullscreenElement判断:值为null表示未全屏;否则为当前全屏的 DOM 元素 - 注意拼写:
fullscreenElement(无连字符),不是fullScreenElement或isFullscreen - 示例:
document.addEventListener('fullscreenchange', () => { if (document.fullscreenElement) { console.log('已进入全屏'); } else { console.log('已退出全屏'); } }); - 该方法也返回 Promise,可用于链式处理退出后的逻辑
- 即使当前未处于全屏状态,调用它也不会报错,但 Promise 会立即 resolve
- 不要在
fullscreenchange回调里再次调用exitFullscreen(),否则可能引发循环或竞态(例如用户双击退出按钮) - 移动端(尤其是 iOS Safari)不支持真正全屏,
exitFullscreen()可能无效果,此时需配合 CSS(如height: 100vh)模拟视觉全屏 - 确保绑定在
click或touchend事件处理器内,且函数体中直接调用el.requestFullscreen(),不要包在 setTimeout 或 Promise.then 里 - 如果按钮被 Vue/React 封装,确认事件 handler 没有异步代理(比如
onClick={async () => {...}}会导致上下文丢失) - iframe 场景下需添加
allow="fullscreen"属性,否则子页面无法请求全屏 - CSS 适配别漏掉:
:fullscreen伪类可定制全屏时的样式,但注意 Safari 仍需:-webkit-full-screen
如何监听全屏状态变化(fullscreenchange 事件)
浏览器切换全屏状态时会触发 document 上的 fullscreenchange 事件,这是唯一可靠的方式判断当前是否处于全屏——不要依赖布尔变量手动维护状态。
退出全屏的正确做法(exitFullscreen)
退出全屏应调用 document.exitFullscreen(),而不是重复调用目标元素的 requestFullscreen() 或操作样式。
常见报错与绕过限制的现实策略
最常遇到的是 NotAllowedError: requestFullscreen() is not allowed,本质是浏览器策略拦截,和跨域、自动播放、非用户手势强相关。
document.fullscreenElement 的可靠性远高于任何自定义状态标记,而用户手势约束是硬门槛,绕不过去。











