小屏下 nav 元素撑开布局需用媒体查询(如 max-width: 767px)触发汉堡菜单,配合 checkbox 或按钮控制显隐,使用 transform: translateX() 实现平滑滑入,并补充 aria-expanded、inert 等无障碍支持。
nav 元素撑开布局怎么办直接原因是导航项在移动端未做响应式收缩,display: flex 或固定宽度的 ul > li 在窄屏上强行换行或溢出。不改结构只调样式,大概率导致横向滚动、文字截断或父容器高度异常。必须用媒体查询配合 DOM 状态切换,不能只靠 max-width 降字号或缩 padding。
@media 触发汉堡菜单的关键条件触发点不能只写 max-width: 768px —— 实际要覆盖 iPad 竖屏(768px)、iPhone X+ 横屏(812px)等常见断点。更稳妥的是用 max-width: 767px(排除 768px 这个模糊边界),同时确保 HTML 中有可切换的 input[type="checkbox"] 或带 data-menu-open 的按钮,否则 CSS 无法控制显隐。
@media (max-width: 767px) 内把原导航 ul 设为 display: none
.menu-toggle 按钮,用 ~ 或 + 选择器联动隐藏/显示菜单(如 .menu-toggle:checked ~ .nav-menu)visibility: hidden,它仍占布局空间;必须用 display: none 或 height: 0 + overflow: hidden
transform: translateX() 比 left: -100% 更可靠用 left 移动菜单容易受父容器 position 影响,且动画卡顿明显;transform 触发 GPU 加速,滑入更顺滑。但要注意:目标元素需设 position: fixed 或 absolute,否则 transform 不会脱离文档流。
.nav-menu {
position: fixed;
top: 0;
right: 0;
width: 280px;
height: 100vh;
background: #fff;
transform: translateX(100%);
transition: transform 0.3s ease;
}
.menu-toggle:checked ~ .nav-menu {
transform: translateX(0);
}
纯 CSS 汉堡菜单默认不支持 Tab 键聚焦、Enter 触发,也缺少 aria-expanded 状态标记。必须补上:
aria-expanded 值(true/false)inert 属性或 aria-hidden="true" 临时禁用主内容区域的交互没有 JS 配合的纯 CSS 方案,在无障碍层面是残缺的 —— 尤其当菜单含下拉项或表单时,焦
点管理根本无法绕过 JS。