controlslist="nofullscreen" 仅能建议隐藏全屏按钮,无法真正禁止全屏——双击、右键、系统手势及 js 调用 requestfullscreen() 均可绕过;firefox 完全忽略,safari 16.4+ 才支持,安卓 webview 基本不识别。

controlslist="nofullscreen" 只能建议浏览器隐藏全屏按钮,不能真正防全屏——双击视频、右键菜单、系统手势(如 iOS 上滑)仍可能触发全屏。
为什么 nofullscreen 失效很常见
这个属性在 Firefox 中完全被忽略;Safari 直到 16.4+ 才开始支持,旧版写了也白写;安卓 WebView 基本不识别。Chrome/Edge 虽能隐藏按钮,但以下行为不受影响:
- 用户双击视频区域(Chrome 桌面端默认响应)
- 右键弹出原生上下文菜单 → “Enter fullscreen” 选项仍在
- iOS Safari 中上滑手势、长按视频、或点击右下角“…”按钮仍可全屏
- JavaScript 调用
videoElement.requestFullscreen()依然成功(该 API 不受controlslist约束)
真正能干预全屏的 JS 方式
仅靠 HTML 属性做不到,必须结合监听与拦截逻辑:
- 监听
fullscreenchange事件,检测到进入全屏后立刻调用document.exitFullscreen() - 在
click、dblclick、contextmenu事件上阻止默认行为(注意:要绑定在<video></video>或包裹容器上,且避免被pointer-events: none阻断) - 禁用双击触发:给
<video></video>加ondblclick="event.preventDefault()"(Chrome 有效,但 Safari 可能绕过) - 更彻底的做法:移除
controls属性,自己控制 UI,同时在requestFullscreen前加条件判断(比如只允许特定用户角色调用)
移动端尤其要注意的兼容性坑
iOS Safari 对 nofullscreen 支持极弱,且系统级手势(如上滑)无法用 JS 拦截。如果你的目标是“不让视频脱离页面”,唯一较稳的路径是:
- 设
playsinline+webkit-playsinline强制内联播放 - 去掉
controls,避免原生控件引入全屏入口 - 所有交互(播放/暂停/进度)都走自定义按钮 + JS 控制
- 不依赖
controlslist,它在这里基本没用
真正容易被忽略的是:全屏与否,最终由用户代理(浏览器+系统)决定,前端只能提示或软性干预;想硬性禁止,得从服务端权限、DRM 或播放器 SDK 层入手。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











