用途
aria-required-children 是一条无障碍检查规则,用于确保 ARIA 复合组件角色包含其必需的子角色。屏幕阅读器(如 NVDA 和 VoiceOver)通过在这些必需的子角色之间移动来导航复合组件(菜单、标签页、树等)。如果 tablist 中包含的是 div 元素而不是 role='tab',用户将完全听不到标签页。只有当 role='list' 内存在 role='listitem' 子元素时,JAWS 才会播报“list of 5 items”。缺少正确的嵌套,整个组件对仅使用键盘的用户和屏幕阅读器用户都会变得不可感知。
主要能力
- 容器角色强制要求特定的子角色:tablist → tab,list/listbox → listitem/option,menu/menubar → menuitem,tree → treeitem,grid/rowgroup → row。
- 缺少必需的子元素会破坏无障碍树,导致屏幕阅读器无法枚举项目或播报数量。
- 对容器内纯结构性的包装元素使用 role='none' 或 role='presentation',以避免无效嵌套。
- 适用于 WAI-ARIA 1.2 中复合组件角色的必需拥有元素。
使用方式
检查:识别所有具有 ARIA 容器角色的元素(tablist、list、listbox、menu、menubar、tree、treegrid、grid、rowgroup、radiogroup)。对每个元素,按 WAI-ARIA 规范验证其是否包含必需的子角色:tablist 必须拥有 tab 元素;list 必须拥有 listitem;listbox 必须拥有 option;menu/menubar 必须拥有 menuitem、menuitemcheckbox 或 menuitemradio;tree 必须拥有 treeitem;grid 必须拥有 row(row 拥有 gridcell);radiogroup 必须拥有 radio。标记任何缺少必需子元素的容器角色。
修复:对每个缺少必需子元素的容器角色:(1) 为每个子元素添加正确的角色——例如,为 role='tablist' 内的每个标签按钮添加 role='tab'。(2) 如果容器与必需子元素之间存在用于布局的包装 div 元素,为这些包装元素添加 role='none' 或 role='presentation'。(3) 尽可能优先使用原生 HTML 等价物:用 <ul>/<li> 代替 role='list'/role='listitem',用 <select>/<option> 代替 role='listbox'/role='option'。
代码审查:审查渲染后的标记以及影响“确保 ARIA 角色包含必需子角色”的交互状态。标记违反规则的具体元素、角色、标签、焦点行为或键盘交互,并说明如何通过浏览器无障碍工具或辅助技术验证修复。
适用场景
适用于使用复合角色的自定义 ARIA 组件,包括 tablist、list、listbox、menu、menubar、tree、treegrid、grid、rowgroup、row、radiogroup。
限制
该规则与 aria-required-parent 不同,后者检查相反方向。完整实现细节、代码示例和框架特定指南见 references/rule.md。规则页面:https://frontendchecklist.io/rules/accessibility/aria-required-children