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

点击按钮才显示的全屏遮罩菜单怎么写
直接用 display: none 配合 JS 切换最稳妥,别一上来就用 visibility: hidden 或 opacity: 0 —— 它们不阻断点击穿透,用户可能误点背后按钮。
关键结构只有三块:(全屏遮罩)、
(菜单内容)、一个触发用的
。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 判断,结果一点菜单链接就关闭了。
移动端点击区域太小导致点不中的问题
默认 在 iOS 上最小点击区域是 44×44px,很多初学者写的汉堡图标按钮远小于此,用户反复点击无响应。
- 给触发按钮加
min-width: 44px、min-height: 44px
- 如果用 icon 字体(如 Font Awesome),确保
font-size 足够大,或用 padding 扩展可点区域
- 在真机调试时,打开 Safari 的「开发 → 远程自动化」看实际点击热区,比模拟器更准
遮罩层本身也要有足够触控反馈:iOS 上若 .overlay 没设 cursor: pointer(虽不影响功能,但影响心理预期),用户可能怀疑没点上。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!