nav中a标签默认inline导致横排无间距,应使用flex布局控制对齐与间距,小屏需响应式折叠,并兼顾可访问性与兼容性。
HTML5 的 本身只是语义容器,不带任何样式。里面放 默认是 display: inline,所以天然横排——但问题在于:没对齐、没间隔、hover 无反馈、移动端易错位。
实操建议:
或其子容器(如
)设 display: flex,比纯 inline 更可控justify-content: space-between 或 space-around 管理水平间距,避免手动加
加 display: block 或 inline-block,才能设置宽高、padding 和 hover 效果text-decoration: none 去掉下划线,否则横排时视觉杂乱IE10+、所有现代浏览器都支持 display: flex,比老式 float 或 inline-block + font-size: 0 清理间隙的方式更干净。
常见错误现象:加了 flex 但子项还是换行——大概率是容器宽度不够或子项 flex-shrink: 1 导致压缩。
立即学习“前端免费学习笔记(深入)”;
实操建议:
直接设 display: flex; align-items: center; 垂直居中文字 或 )加 flex: 0 0 auto 防止被压缩变形gap: 1rem 控制项间距(Chrome 100+ / Firefox 104+ 支持),老版本退回到 margin-right
flex-wrap: nowrap(默认值),防止小屏下意外折行纯横排在手机上必然溢出或文字重叠,@media 切换不是可选项,是必做项。
使用场景:导航项 ≤ 5 个时可用汉堡菜单;≥ 6 个建议配合 JS 控制显隐,否则纯 CSS 的 checkbox hack 在 iOS Safari 有 focus 失效问题。
实操建议:
设为 display: block,内部 flex 改为 flex-direction: column
max-width 而非 min-width 写断点,比如 @media (max-width: 768px) 更符合移动优先逻辑 控制菜单显隐,确保 的 for 属性和 id 匹配,否则点击无效position: fixed + transform 组合有渲染延迟,悬停类名切换要加 will-change: transform
只顾视觉横排,容易漏掉 tabindex、role 或焦点轮廓(outline),导致屏幕阅读器无法识别导航结构或键盘用户卡死。
性能影响不大,但合规性和实际体验落差极大。
实操建议:
必须有 aria-label,比如 aria-label="主菜单",否则 VoiceOver 只读“导航”二字 保持自然 tab 顺序,不要用 tabindex="1" 手动干预outline: none 时,必须提供等效的焦点样式,例如 &:focus { outline: 2px solid #007bff; }
aria-hidden="true" 避免重复朗读
来电咨询