<nav> 标签必须包裹至少两个带真实跳转地址(如 href="/")的链接,采用 ul+li+a 结构,配 aria-label 或 aria-labelledby 明确用途,禁止嵌套及混入非导航内容。

用 <nav> 标签定义主导航区域,关键不是“加个标签”,而是让这个区域真正符合“主导航”的语义行为:它得是用户最常用来跳转核心页面的那组链接,且能被屏幕阅读器准确识别、搜索引擎合理归类。
只包裹真实跳转链接,至少两个有效 href
nav 的语义成立前提是内容可信——必须包含至少两个带真实跳转地址的链接,比如:
-
href="/"、href="products.html"、href="#features"都算有效 -
href="#"或href="javascript:void(0)"不会被读屏器当作导航项,等于空包 - 单个“返回顶部”链接不能单独构成 nav;它属于操作控件,不是主导航路径
结构要清晰,优先用 ul + li + a 组合
读屏器会把 <ul> 自动识别为“列表”,并播报项数(如“导航列表,共 5 项”),而平铺写 <a>首页</a><a>产品</a> 会被当成连续文本流,失去结构感。
正确示例:
立即学习“前端免费学习笔记(深入)”;
<nav aria-label="主导航">
<ul>
<li><a href="/" aria-current="page">首页</a></li>
<li><a href="/products">产品</a></li>
<li><a href="/about">关于我们</a></li>
</ul>
</nav>
必须配 aria-label 或 aria-labelledby
一个页面可能有多个 nav(比如顶部菜单、文章目录、页脚快捷入口),光靠 <nav> 标签本身无法区分用途。不加标识,读屏器只会报“navigation”,用户不知道该进哪个。
- 用
aria-label="主导航"明确角色,避免泛称如“菜单”或“导航” - 如果旁边已有可见标题(如
<h2 id="toc">本文目录</h2>),可用aria-labelledby="toc" - 禁止嵌套 nav:
<nav><nav>...</nav></nav>是无效 HTML,浏览器会自动修正,行为不可控
别往 nav 里塞非导航内容
nav 表达的是“去哪里”,不是“做什么”。以下内容一律排除:
- 搜索框(
<form>、<input>) - 登录/注册按钮
- Logo 图片(可放 header,但不属于 nav 内容)
- 语言切换下拉、纯图标按钮(无文字说明)、广告链接
- 页脚的友情链接、文章末尾的“上一篇/下一篇”——这些属于次要链接,用
<div>或<footer>更合适



















