最稳妥方案是用 display: none 配合 js 切换全屏遮罩菜单,关键结构为 overlay、menu 和 toggle 按钮;css 设 fixed 全屏遮罩与 flex 居中菜单;js 支持按钮、esc 键及遮罩点击关闭(需 target 判断);移动端需确保按钮最小 44×44px 可点区域。

点击按钮才显示的全屏遮罩菜单怎么写
直接用 display: none 配合 JS 切换最稳妥,别一上来就用 visibility: hidden 或 opacity: 0 —— 它们不阻断点击穿透,用户可能误点背后按钮。
关键结构只有三块:<div class="overlay">(全屏遮罩)、<code><nav class="menu"></nav>(菜单内容)、一个触发用的 <button id="menu-toggle"></button>。CSS 里给 .overlay 加 position: fixed、top: 0、left: 0、width: 100vw、height: 100vh,再设 background-color: rgba(0,0,0,0.8) 就行。
- JS 只需监听
menu-toggle的click,然后对.overlay切换classList.toggle("active") - CSS 中写
.overlay.active { display: block; },初始状态设为display: none - 记得在
.menu上加position: relative和足够高的z-index(比如z-index: 1000),否则会被遮罩盖住
菜单内容居中且可滚动的 CSS 写法
初学者常把菜单写成“死高”,结果内容一多就溢出页面。正确做法是:让 .menu 宽高自适应内容,再用 Flex 居中;超出部分靠 max-height + overflow-y: auto 控制。
示例关键 CSS:
.overlay.active .menu {
display: flex;
align-items: center;
justify-content: center;
}
.menu {
max-width: 90%;
max-height: 80vh;
overflow-y: auto;
}
-
max-width防止在小屏上文字撑破容器 -
max-height必须配合overflow-y: auto,不然滚动条不会出现 - 别给
.menu设固定height: 100%,它会继承父级高度(即整个视口),导致内部滚动失效
按 ESC 键或点击遮罩关闭菜单的 JS 实现
只靠按钮开闭不够,用户习惯按 ESC 或点背景收起——漏掉这个,体验立刻掉档。
- 监听
document的keydown,判断e.key === 'Escape',再执行关闭逻辑 - 给
.overlay绑click,但注意:必须检查e.target === overlayEl,否则点到菜单内部也会关掉 - 关闭函数里统一移除
active类,不要单独操作display值,避免状态不一致
常见错误:overlay.addEventListener('click', hideMenu) 没做 target 判断,结果一点菜单链接就关闭了。
移动端点击区域太小导致点不中的问题
默认 <button></button> 在 iOS 上最小点击区域是 44×44px,很多初学者写的汉堡图标按钮远小于此,用户反复点击无响应。
- 给触发按钮加
min-width: 44px、min-height: 44px - 如果用 icon 字体(如 Font Awesome),确保
font-size足够大,或用padding扩展可点区域 - 在真机调试时,打开 Safari 的「开发 → 远程自动化」看实际点击热区,比模拟器更准
遮罩层本身也要有足够触控反馈:iOS 上若 .overlay 没设 cursor: pointer(虽不影响功能,但影响心理预期),用户可能怀疑没点上。











