如何处理 WAI ARIA 角色="listbox"

how to handle WAI ARIA role="listbox"

我有一个选项列表,您可以从中选择一个。对于所有意图和目的,HTML 的 <select> 元素涵盖了这一点。由于我们需要不同的视觉呈现方式,因此我考虑使用 WAI ARIA role="listbox"。我不清楚如何使用 aria-activedescendantaria-selectedaria-checked

关于 focus/active 状态的问题:

关于keyboard interaction的问题:

关于验证的问题:

如果列表框有 [aria-required="true"],则必须执行某种验证。特别是如果已选择(或选中)一个选项。

How would best I tell the option element itself that it is active (has "virtual focus") to represent that visually?

通常,您会添加 aria-selected="true",然后使用属性 selectors 制作一些 CSS 来处理它,例如div[role=option][aria-selected=true] { ... },或者动态添加一个css class?

[aria-checked] and [aria-selected]

我想这更像是一个哲学问题。 aria-selected 更接近于 select 所拥有的内容......但是话又说回来(特别是对于 multi-select 小部件)你可以想象列表框实际上是一个系列复选框,在这种情况下,您将使用 aria-checked。两者都没有明确的对错(一旦你 div 进入更复杂的 ARIA 小部件,你会发现很多东西)。

Is there a trick to avoid having to put IDs on every option simply so it can be referenced by aria-activedescendant

嗯...或许您可以通过脚本为页面加载的所有选项动态生成 ID?或者 - 但未经测试 - 你可以有类似 "roving" ID 的东西,它根据激活的选项在选项周围移动(adding/removing 相关选项的 ID)。

aria-checked 确实更像是一个非常密切相关的选项列表,带有可以打开或关闭的实际可见复选框。这在 Windows 世界中最为常见。 Explorer 可以设置为这种伪多 select 模式,或者某些应用程序使用它来激活或停用一组帐户。在 Mac 上,你可以想到 Adium 中的帐户列表,可以检查(活动)或不检查。 selection 将始终存在,并且可以选中或不选中它们的一个或多个复选框。

aria-selected 始终是指示选项 selected 状态的正确选项。例如当使用箭头键遍历列表时,aria-selected="true" 从一个项目移动到另一个项目,而其他人则必须得到 aria-selected="false"。正如帕特里克所说,您还可以使用它来生成一些漂亮的 CSS.

至于键盘交互:向上和向下箭头将 select 一个项目,如果项目也是可检查的,space 将切换当前 [=58] 的已检查或未检查状态=]编辑项目。

在真正的 multi-select 中,例如 html:select @size>1,并且 multiselectable 为真,交互将是:

  • 方向键select单个项目。
  • Ctrl+箭头键可以将焦点从一个项目移动到另一个项目,但还不能 select 那个项目。
  • Ctrl+Space 将 select 项目。
  • Shift+updown 箭头将 select 连续的项目。

这又是标准的 Windows 范例,例如,可以在资源管理器的详细信息视图中观察到。

至于验证:onBlur 就足够了,或者您可以通过更改 selection/focused 项目动态地进行验证,确保至少有一个项目被 selected,或任何验证你需要。

aria-invalid="true" 足以让屏幕阅读器知道,但错误消息和可能的视觉指示会让每个人都知道出了什么问题。