requestFullscreen() 必须在用户手势(如点击)中调用,否则静默失败或抛 NotAllowedError;常见原因包括非手势上下文、元素未挂载DOM、不可见、跨iframe未授权;需按标准→webkit→moz→ms顺序兼容调用;状态判断唯一可靠方式是document.fullscreenElement并监听document的fullscreenchange事件;iOS Safari仅支持video或带allow="fullscreen"的iframe。
requestFullscreen() 不是“调用就全屏”,而是必须在用户点击、按键等手势上下文中执行,否则直接静默失败或抛 NotAllowedError —— 这是绝大多数人卡住的第一关。
requestFullscreen() 总是报 Failed to execute 'requestFullscreen' on 'Element'
这个错误几乎全是权限/上下文问题,不是语法错:
setTimeout、Promise.then、DOMContentLoaded 或 load 事件里,都会断开手势链new Element() 就调用,但还没 appendChild
display: none、visibility: hidden,或父容器 overflow: hidden 裁剪了它allow="fullscreen" 属性(如 <iframe src="..." allow="fullscreen">)requestFullscreen() 并兼容老浏览器现代浏览器统一支持 element.requestFullscreen()(返回 Promise),但旧版 Chrome/Safari/Firefox/IE 仍需前缀。别写死一个方法,要按优先级检测:
element.requestFullscreen(标准)element.webkitRequestFullscreen(Safari、旧 Chrome)element.mozRequestFullScreen(Firefox)element.msRequestFullscreen(IE11 / 旧 Edge)示例片段:
立即学习“前端免费学习笔记(深入)”;
function enterFullscreen(el) { if (el.requestFullscreen) { el.requestFullscreen().catch(err => console.error('全屏被拒:', err.message)); } else if (el.webkitRequestFullscreen) { el.webkitRequestFullscreen(); } else if (el.mozRequestFullScreen) { el.mozRequestFullScreen(); } else if (el.msRequestFullscreen) { el.msRequestFullscreen(); }}
注意:document.exitFullscreen() 同样要兼容前缀,且退出也必须由用户手势触发(比如按钮点击),不能靠定时器自动退出。
document.fullscreenElement 和 fullscreenchange 事件怎么用才不翻车判断是否真进全屏,唯一可靠方式是读 document.fullscreenElement(注意拼写是 fullscreen,不是 fullScreen 或 FullScreen);监听状态变化必须绑定到 document 上,不是某个元素:
document.addEventListener('fullscreenchange', () => { ... }) 是唯一有效监听点document.fullscreenElement,而不是靠变量缓存,因为用户可能绕过按钮直接按 Esc常见坑:把监听绑在按钮上、用 isFullscreen 布尔变量手动维护状态、忘记处理 null 值导致后续逻辑崩溃。
iOS Safari 对全屏极其保守:
<video> 元素或带 allow="fullscreen" 的 <iframe> 进入全屏div、canvas 或 document.documentElement 的全屏请求touchend 有时不被认可,优先用 click
:fullscreen CSS 伪类支持不稳定这意味着:如果你的目标是视频播放器,video.requestFullscreen() 是可行路径;如果是通用内容容器,在 iOS 上基本无解,得降级为 CSS “伪全屏”(position: fixed + 100vw/vh)并手动管理显隐逻辑。