全屏遮罩未盖住可视区主因是定位方式错误或父容器截断定位流;必须用position: fixed、top/left为0、宽高设100vw/100vh,z-index≥9999,并处理滚动、焦点、键盘等可访问性细节。
常见原因是遮罩元素的 position 没设对,或者父容器有 overflow: hidden 截断了定位流。全屏遮罩必须用 position: fixed,且 top/left 都设为 0,同时宽高设为 100vw 和 100vh(不是 100%)——后者依赖父容器高度,容易失效。
实操建议:
立即学习“前端免费学习笔记(深入)”;
z-index 至少设为 9999,避免被第三方 UI 库(如 Ant Design、Element Plus)的弹窗层级压住background-color: rgba(0, 0, 0, 0.5) 实现半透效果,别只用 #000,否则遮罩下内容完全不可见,影响可访问性pointer-events: auto(默认已是),否则点击穿透到下层直接给遮罩层绑定 click 事件关弹窗,会导致点击弹窗内部时也触发关闭——因为事件会冒泡上来。这不是 bug,是 DOM 事件机制的自然行为。
实操建议:
立即学习“前端免费学习笔记(深入)”;
click,但在回调里检查 event.target === event.currentTarget,确保只响应遮罩本体点击position: relative 容器,并阻止其 click 事件冒泡:element.addEventListener('click', e => e.stopPropagation())
onclick="closeModal()" 写在 HTML 里,不利于状态管理,尤其在 React/Vue 中会破坏响应式逻辑iOS Safari 在弹窗激活时不会禁用 body 滚动,用户滑动遮罩层会带动背景页一起滚,体验极差。这不是 CSS 能单靠 overflow: hidden 解决的。
实操建议:
立即学习“前端免费学习笔记(深入)”;
<body> 加 style="position: fixed; width: 100%; top: -${window.scrollY}px;",并记录原始 scrollY
body 样式,并用 window.scrollTo(0, savedScrollY) 回滚位置overflow: hidden:iOS 下无效,且可能引发页面重排错位需要。按 Esc 关闭是 Web 弹窗的通用预期,WCAG 2.1 也要求模态框支持键盘退出。但很多人只实现鼠标交互,漏掉键盘路径。
实操建议:
立即学习“前端免费学习笔记(深入)”;
document 的 keydown 事件,判断 e.key === 'Escape',再检查当前是否有激活的遮罩层(比如通过 class 名或 data 属性)focus() 把焦点移到弹窗内首个可聚焦元素(如按钮或输入框),否则键盘用户无法操作