nav标签已隐式携带role="navigation",无需手动添加;必须用aria-label或aria-labelledby区分多个nav用途,内部应使用ul/ol结构并确保链接语义正确。

nav 标签本身已隐式携带 role="navigation",无需再手动添加 aria-role="navigation" 或 role="navigation"。所谓“aria-navigation”并不存在——WAI-ARIA 规范中没有这个属性,它是常见误解或拼写混淆(可能误将 aria-label、aria-labelledby 或 role 名称混在一起)。
nav 的 role 是自动生效的,不是靠 ARIA “赋予”的
浏览器和读屏器在解析 <nav> 时,会自动将其映射为 role="navigation"。这是 HTML5 内置语义,等价于显式写 <nav role="navigation">,但后者属于冗余声明,反而可能干扰某些旧版辅助技术的默认行为。
- ✅ 正确做法:直接用
<nav aria-label="主导航"> - ❌ 错误做法:写
<nav role="navigation" aria-label="主导航">(role 重复) - ❌ 更错做法:写
<nav aria-role="navigation">(无效属性,被忽略)
真正起作用的是 aria-label 或 aria-labelledby
当页面存在多个 <nav>(如顶部主导航、面包屑、页脚链接),仅靠 role="navigation" 无法区分它们的功能。读屏器只会报“导航”,用户不知道哪个是主菜单、哪个是路径提示。
- 中文场景推荐值:
aria-label="主导航"、aria-label="面包屑导航"、aria-label="页脚快捷链接" - 英文场景统一用:
aria-label="Main navigation"、aria-label="Breadcrumb"(注意不是复数形式) - 禁用空泛词:
"Navigation"、"Menu"、"Links"—— 这些不提供上下文,等于没标
结构必须配合语义容器,不能只靠 role
role 只是“角色说明”,不解决结构问题。一个可访问的导航还需正确嵌套:
- 用
<ul>或<ol>包裹链接:前者用于无强顺序的导航(如主导航),后者用于有层级/路径关系的(如面包屑),读屏器会播报“第1项”“第2项” - 每个跳转目标必须是
<a href>或<button>,禁用<div onclick>等伪链接 - 当前页链接保留
href,仅加aria-current="page"(值固定为"page",不可写"true"或"active")
多个 nav 共存时,漏标一个就等于“消失一个”
如果页面有三个 <nav>,只给其中两个加 aria-label,那么第三个对读屏用户来说就是“静默区域”:焦点能停住,但听不到任何提示,也无法通过地标导航快速跳转。
- 检查方法:用 NVDA 或 VoiceOver 按
D(地标列表)键,确认每个导航都出现在列表中且名称可区分 - 替代方案:若导航上方有可见标题(如
<h2 id="main-nav-title">网站导航</h2>),可用aria-labelledby="main-nav-title"关联,比隐藏文本更可靠

















