标准 · ARIA

角色 复合控件

menubar

将容器标记为持久菜单栏 — 即桌面应用中始终可见的水平「文件/编辑/查看」风格菜单条。与弹出式的 menu 不同。在 Web 上几乎从不是正确的选择。

何时使用

适用于模仿桌面应用主菜单(文件、编辑、查看……)的持久性应用风格菜单栏。最合理的使用场景是基于 Web 的创作工具、IDE 及全屏生产力应用。

如果您的「菜单栏」实际上是网站页眉导航,则它不是 menubar。请使用包含 <a> 链接 <ul><nav>。menubar 角色要求单一制表位、方向键导航和 Escape 关闭 — 这些都与用户对网站页眉的预期不符。

menubar 的子元素通常为 role="menuitem" 触发器,并通过 aria-haspopup="menu" 打开子菜单。

键盘与焦点规范

根据 APG menubar 模式

  • Tab 键进入菜单栏时聚焦于第一个或上次聚焦的菜单项;再次按 Tab 则移出菜单栏。
  • 左/右方向键在顶层菜单栏项之间移动焦点(支持循环切换)。
  • 下方向键(或 Enter/Space)打开聚焦项的子菜单并将焦点移至其第一个 menuitem。
  • 上方向键打开子菜单并将焦点移至最后一个 menuitem。
  • 在子菜单内按 Escape 关闭子菜单并将焦点返回对应的菜单栏项。
  • 首字母快速跳转:输入字母可跳转到以该字母开头的下一个菜单项。

使用漫游 tabindex 管理焦点。

常见错误

  • 在网站主 <nav> 上使用 role="menubar"。宣告的角色与用户预期不匹配。
  • 每个菜单项都设置了 tabindex="0",导致 Tab 键遍历所有菜单栏项。该模式应使用单一制表位。
  • 子菜单仅在悬停时打开,而不响应下方向键。
  • 触发子菜单的菜单栏项上缺少 aria-haspopup/aria-expanded
  • 在子菜单内按 Escape 收起菜单后焦点丢失 — 必须将焦点返回父级菜单栏项。

示例

<ul role="menubar" aria-label="Document">
  <li role="menuitem" tabindex="0"  aria-haspopup="menu" aria-expanded="false">File</li>
  <li role="menuitem" tabindex="-1" aria-haspopup="menu" aria-expanded="false">Edit</li>
  <li role="menuitem" tabindex="-1" aria-haspopup="menu" aria-expanded="false">View</li>
  <li role="menuitem" tabindex="-1" aria-haspopup="menu" aria-expanded="false">Help</li>
</ul>