符合无障碍标准的树形导航需严格遵循WAI-ARIA 1.1规范:根容器设role="tree",节点用role="treeitem"并配aria-expanded、aria-level、aria-selected等属性,子列表用role="group";键盘支持方向键、Space/Enter等操作,焦点样式清晰可辨。

用HTML构建符合无障碍标准的树形导航(Treeview),核心是遵循WAI-ARIA 1.1规范中的tree角色模型,正确使用role="tree"、role="treeitem"、role="group",并配合aria-expanded、aria-level、aria-selected等属性,同时确保键盘操作(方向键、空格、Enter)可用、焦点管理清晰、语义结构完整。
基础语义结构与ARIA角色
树形导航不是靠CSS或JS“模拟”出来的视觉效果,而是要有明确的语义层级。根容器必须声明role="tree",每个可展开/折叠的节点用role="treeitem",子列表用role="group"包裹(不能用ul替代group,因为ul无ARIA树语义)。
-
<div role="tree">作为最外层容器,代表整棵树 - 每个顶层节点:
<div role="treeitem" aria-expanded="true" aria-level="1"> - 其子节点列表必须是
<div role="group">,而非ul或div无角色 - 嵌套子项同样用
role="treeitem",并按实际层级设置aria-level="2"、aria-level="3"等
关键ARIA属性与状态管理
仅加角色不够,还需动态维护状态属性,让屏幕阅读器能实时感知节点展开/选中/禁用等变化。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
-
aria-expanded:仅用于有子节点的treeitem,值为true或false;叶子节点不加此属性 -
aria-selected:标识当前选中项(如高亮状态),值为true或false;未选中时可省略或设为false -
aria-disabled:对不可交互节点设为true,并配合tabindex="-1"移出焦点流 -
aria-labelledby或aria-label:为每个treeitem提供明确可读的名称,尤其当图标或缩略文字存在时
键盘交互支持(无需额外说明“应支持”,而是直接实现)
树形控件必须原生支持标准键盘操作,这是无障碍强制要求。JavaScript需监听并响应以下行为:
立即学习“前端免费学习笔记(深入)”;
- → / ↓:移动到下一个同级或第一个子节点(若已展开)
- ← / ↑:收起当前节点(如有子项且已展开),或跳转到父级
- Space / Enter:切换
aria-expanded状态(对可展开项)或触发选中逻辑(对叶子项) - Home / End:跳转到第一个/最后一个
treeitem - 所有可交互节点必须有
tabindex="0",保证键盘可达;非交互容器(如group)保持tabindex缺失或-1
视觉与焦点样式协同设计
屏幕阅读器依赖ARIA,但 sighted 键盘用户依赖视觉反馈。必须提供清晰的焦点指示,且不能仅靠默认浏览器轮廓(outline)。
- 为
[role="treeitem"]:focus定义明显背景色或边框,确保在各种背景下可见 - 使用
outline: none时,务必用box-shadow或border等替代方案提供同等可识别性 - 展开/折叠图标(如▶/▼)需用
aria-hidden="true"隐藏,状态变化通过aria-expanded传达,避免冗余播报 - 选中态(
aria-selected="true")应有独立视觉样式,并与焦点态可区分(例如焦点蓝框 + 选中灰底)


















