描述
listbox 角色用于标识一个元素,该元素创建一个列表,用户可以从该列表中选择一个或多个静态项目,类似于 HTML <select> 元素。与 <select> 不同,列表框可以包含图像。列表框包含子元素,这些子元素的角色是 option,或其角色是 group 的元素,这些元素又包含角色是 option 的子元素。
强烈建议使用 HTML select 元素,如果只能选择一个项目,则使用一组单选按钮,如果可以选择多个项目,则使用一组复选框,因为需要管理所有后代的焦点,这涉及到大量的键盘交互,而原生 HTML 元素免费提供了此功能。
角色为 listbox 的元素具有隐式 aria-orientation 值 vertical。
当列表通过 Tab 键获取焦点时,如果未选择任何其他项目,则列表中的第一个项目将被选中。上下箭头键用于导航列表,按 Shift + 上/下箭头键将移动并扩展选择。键入一个或多个字母将导航列表项目(相同的字母将导航到以该字母开头的每个项目,不同的字母将导航到以整个字符串开头的第一个项目)。如果当前项目具有关联的上下文菜单,按 Shift+F10 将启动该菜单。如果列表项目是可勾选的,Space 键可用于切换 复选框。对于可选择的列表项目,Space 键用于切换其选择状态,Shift+Space 键可用于选择连续项目,Ctrl+箭头键可在不选择的情况下移动,Ctrl+Space 键可用于选择非连续项目。建议使用复选框、链接或其他方法来选择所有项目,Ctrl+A 可用作此操作的快捷键。
当列表框角色添加到元素或此类元素变为可见时,屏幕阅读器在列表框获得焦点时宣布其标签和角色。如果列表中的某个选项或项目获得焦点,它将在之后宣布,如果屏幕阅读器支持,还会指示该项目在列表中的位置。随着焦点在列表中移动,屏幕阅读器会宣布相关项目。
关联的 ARIA 角色、状态和属性
关联角色
option角色-
需要一个或多个嵌套选项。所有选定的选项都将
aria-selected设置为true。所有未选定的选项都将aria-selected设置为false。如果选项不可选择,则省略aria-selected。 list角色-
包含
listitem元素的段落
状态和属性
aria-activedescendant-
保存列表框中当前活动元素的
id字符串。如果它是选项元素,那么它将是最近交互的选项的id,无论该选项的aria-selected值是true还是不是。即使在多选列表框中,也只取一个id的值。如果id不引用列表框的 DOM 后代,那么该id必须包含在aria-owns属性的 ID 中。 aria-owns-
这是一个以空格分隔的元素 ID 列表,这些元素不是列表框的 DOM 子元素。此处列出的 ID 不能同时列在任何其他元素的
aria-owns属性中。 aria-multiselectable-
如果用户可以同时选择多个选项,则包含并设置为
true。如果设置为true,则每个可选择的选项都应包含aria-selected属性并设置为true或false。不可选择的选项不应具有aria-selected属性。如果为false或省略,则只有当前选定的选项(如果选择了任何选项)才需要aria-selected属性,并且必须将其设置为true。 aria-required-
一个布尔属性,指示必须选择具有非空字符串值的选项。
aria-readonly-
用户无法更改哪些选项被选中或未选中,但列表框在其他方面可操作。
aria-label-
一个人类可读的字符串值,用于标识列表框。如果存在可见标签,则应使用
aria-labelledby来引用该标签。 aria-labelledby-
标识以空格分隔的元素 ID 列表中的可见元素,这些元素 ID 标识列表框。如果不存在可见标签,则应使用
aria-label来包含标签。(注意:“labelled”是基于辅助功能 API 约定的正确拼写。) aria-roledescription-
一个人类可读的字符串值,更清晰地标识列表框的角色。屏幕阅读器通常会在读取标签(如果有)之后,而不是说“列表框”时向用户读取此值。
键盘交互
-
当单选列表框获得焦点时
- 如果在列表框获得焦点之前没有选中任何选项,则第一个选项获得焦点。可选地,第一个选项可以自动选中。
- 如果在列表框获得焦点之前已选中某个选项,则焦点将设置在该选定选项上。
-
当多选列表框获得焦点时
- 如果在列表框获得焦点之前没有选中任何选项,则焦点将设置在第一个选项上,并且选择状态没有自动改变。
- 如果在列表框获得焦点之前已选中一个或多个选项,则焦点将设置在列表中第一个选中的选项上。
-
向下箭头
:将焦点移动到下一个选项。可选地,在单选列表框中,选择也可以随焦点移动。
-
向上箭头
:将焦点移动到上一个选项。可选地,在单选列表框中,选择也可以随焦点移动。
-
Home
(可选):将焦点移动到第一个选项。可选地,在单选列表框中,选择也可以随焦点移动。强烈建议包含超过五个选项的列表支持此键。
-
End
(可选):将焦点移动到最后一个选项。可选地,在单选列表框中,选择也可以随焦点移动。强烈建议包含超过五个选项的列表支持此键。
-
所有列表框都建议使用预输入(Type-ahead),特别是包含超过七个选项的列表框。
- 键入一个字符:焦点移动到下一个以键入字符开头的项目。
- 快速键入多个字符:焦点移动到下一个以键入字符字符串开头的项目。
-
多选:作者可以实现两种交互模型中的任何一种来支持多选:一种推荐模型,不需要用户在导航列表时按住修饰键(如 Shift 或 Control),另一种替代模型,在导航时需要按住修饰键以避免丢失选择状态。
- 推荐选择模型 — 无需按住修饰键
- 空格键:更改焦点选项的选中状态。
- Shift + 向下箭头(可选):将焦点移动到下一个选项并切换其选中状态。
- Shift + 向上箭头(可选):将焦点移动到上一个选项并切换其选中状态。
- Shift + 空格键(可选):选择从最近选择的项目到焦点项目的连续项目。
- Control + Shift + Home(可选):选择当前聚焦的选项以及直到第一个选项的所有选项。可选地,将焦点移动到第一个选项。
- Control + Shift + End(可选):选择当前聚焦的选项以及直到最后一个选项的所有选项。可选地,将焦点移动到最后一个选项。
- Control + A(可选):选择列表中的所有选项。可选地,如果所有选项都已选中,它也可以取消选择所有选项。
- 推荐选择模型 — 无需按住修饰键
所需的 JavaScript 功能
在单选列表框中选择一个选项
当用户选择一个选项时,必须发生以下情况:
- 取消选择之前选中的选项,将
aria-selected设置为false,或者完全删除该属性,从而改变新取消选中的选项的外观使其看起来未选中。 - 选择新选中的选项,将选项上的
aria-selected="true",并改变新选中的选项的外观使其看起来被选中。 - 将列表框上的
aria-activedescendant值更新为新选中选项的 ID。 - 视觉上处理选项的失焦、聚焦和选中状态
在多选列表框中切换选项的状态
当用户点击某个选项,当焦点在该选项上时按下 Space 键,或以其他方式切换选项的状态时,必须发生以下情况:
- 切换当前聚焦选项的
aria-selected状态,如果其状态为 false,则将其更改为 true;如果其状态为 true,则将其更改为 false。 - 改变选项的外观以反映其选中状态
- 更新列表框上的
aria-activedescendant值,将其设置为用户刚刚交互的选项的 ID,即使他们将该选项切换为未选中状态。
示例
示例 1:使用 aria-activedescendant 的单选列表框
下面的代码片段使用 aria-activedescendant,展示了如何将列表框角色直接添加到 HTML 源代码中。
<p id="listbox1label" role="label">Select a color:</p>
<div
role="listbox"
tabindex="0"
id="listbox1"
aria-labelledby="listbox1label"
aria-activedescendant="listbox1-1">
<div role="option" id="listbox1-1" class="selected" aria-selected="true">
Green
</div>
<div role="option" id="listbox1-2">Orange</div>
<div role="option" id="listbox1-3">Red</div>
<div role="option" id="listbox1-4">Blue</div>
<div role="option" id="listbox1-5">Violet</div>
<div role="option" id="listbox1-6">Periwinkle</div>
</div>
const listbox = document.getElementById("listbox1");
listbox.addEventListener("click", listItemClick);
listbox.addEventListener("keydown", listItemKeyEvent);
listbox.addEventListener("keypress", listItemKeyEvent);
这本可以通过原生 HTML <select> 和 <label> 元素更轻松地处理。
<label for="listbox1">Select a color:</label>
<select id="listbox1">
<option selected>Green</option>
<option>Orange</option>
<option>Red</option>
<option>Blue</option>
<option>Violet</option>
<option>Periwinkle</option>
</select>
更多示例
- 可滚动列表框示例:单选列表框,可滚动以显示更多选项,类似于 HTML
<select>带有大于一的size属性。 - 带分组选项的列表框示例:带分组选项的单选列表框,类似于 HTML
<select>,其中size属性设置为大于"1",并且选项使用optgroup元素进行分组。 - 可重排选项的列表框示例:单选和多选列表框的示例,附带工具栏,其中可以添加、移动和删除选项。
最佳实践
- 为了实现键盘可访问性,作者应该 管理此角色所有后代的焦点。
- 建议作者在列表未获得焦点时对选定内容使用不同的样式,例如,非活动选择通常会显示为较浅的背景颜色。
- 如果列表框不属于其他小部件,它应该设置
aria-labelledby属性。 - 如果一个或多个条目不是列表框的 DOM 子元素,则需要设置额外的
aria-*属性(请参阅 ARIA 最佳实践)。 - 如果存在有效理由 展开 列表框,则
combobox角色可能更合适。
规范
| 规范 |
|---|
| 无障碍富互联网应用程序 (WAI-ARIA) # listbox |
| 未知规范 |
另见
- HTML
<select>元素 - HTML
<label>元素 - HTML
<option>元素 - ARIA:
combobox角色 - ARIA:
option角色 - ARIA:
list角色 - ARIA:
listitem角色 - ARIA 最佳实践 – 列表框