nav标签仅声明导航意图,语义化取决于dom就绪时内容真实、结构合规、属性准确;需确保首屏加载即含完整有效链接,href必须真实有效,多nav须用aria-label区分,当前页状态须用aria-current="page"动态维护。

nav 标签本身不“生成”菜单,它只声明导航意图;动态菜单能否语义化,取决于 DOM 就绪时的内容是否真实、结构是否合规、属性是否准确。
确保 DOM 加载完成时 nav 内已有有效链接
SPA 或框架(如 Vue/React)中常见错误:初始渲染空
- 必须等菜单数据就绪,再将完整 结构一次性注入 DOM
- 避免用 v-if / *ngIf 控制整个
- 服务端渲染(SSR)或静态生成(SSG)更稳妥——首屏 HTML 即含可访问的导航结构
href 必须真实存在且指向有效目标
语义化导航的核心是“可跳转”。伪链接(href="#"、href="javascript:void(0)")、按钮模拟跳转(<button onclick="goTo('about')"></button>)在辅助技术中不被视为导航目标。
- 前端路由场景下,
<a href="/about"></a>必须真实渲染到 DOM 中,不能仅靠 JS 拦截后内部跳转 - 若用 React Router 的
<link>,确认其最终输出的是带href属性的原生<a></a>节点 - 锚点链接(如
href="#section2")允许,但需确保对应 ID 在页面中真实存在且可聚焦
多导航必须用 aria-label 明确区分用途
同一页面多个
- 主导航:
<nav aria-label="主导航"></nav> - 侧边文档目录:
<nav aria-label="文章章节导航"></nav> - 页脚链接组:
<nav aria-label="页脚服务链接"></nav> - 禁止省略 label,也禁止用 title 或 placeholder 替代
当前页状态必须由 JS 动态维护 aria-current
视觉高亮(如加 class="active")对键盘和屏幕阅读器用户无效。aria-current 是唯一被广泛支持的语义化当前页标识。
- 每次路由切换后,JS 必须主动查找匹配链接,设置
aria-current="page" - 值只能是
"page"、"step"或"location",不可写true或空字符串 - 不要只加属性不移除——上一页的 aria-current 必须清除,否则出现多个“当前页”











