辅助功能 角色、名称和值

为什么

用户界面组件需要一个角色、一个名称,有时还需要一个值,以确保使用辅助技术的人能够使用它们。 辅助技术的例子有屏幕阅读器、开关控制和语音识别软件。


什么

有两种情况我们不能使用具有内置辅助功能的良好 HTML 元素,即使我们想要:

  • 我们正在努力实现的目标没有原生 HTML 元素。
  • 有一些技术限制阻止我们使用语义正确的元素。

在这两种情况下,我们都需要构建自定义控件。 一个重要的可访问性原则是自定义控件需要一个角色、一个名称,有时还需要一个值。


如何

我们如何确保自定义组件具有角色、名称和值?


角色

Uber 网站导航的屏幕截图,将公司显示为下拉菜单。

在上一节 按钮和链接 中,我们了解到下拉菜单按钮应编码为 <button>。 如果我们的框架不允许我们这样做怎么办? 如果它迫使我们改用 <a> 呢? 如果我们正在使用的库中的导航组件是使用 <a> 构建的? 然后我们需要添加一个角色。

这是通过 role="button" 属性完成的。 现在辅助技术的用户可以理解自定义控件是什么。 <button> 内置了 role="button" ,所以写 <button role="button"> 是多余的。



名称

自定义控件需要一个名称。 在我们的示例中,名称是元素 Company 的内容。只要我们把我们的元素写成 <div role="button">Company</div>,我们就有了一个好名字。 这也称为可访问名称。 我们 <div> 的可访问名称是公司。 好的。

那太容易了。 在下面的登录表单中,我们有几个组件 – 徽标、标题、标签、下拉菜单、输入和按钮。

Ubers 登录页面的屏幕截图,显示徽标、标题、标签、电话前缀下拉列表、输入和按钮。

我们正在仔细查看标签、下拉列表和输入。 从视觉上看,下拉菜单和输入之间没有明显的区别。 下拉列表使用 <select> 进行编码,这是本例的正确元素。 然而,它没有名字:

<select name="countryCode">…<select>

它有一个name 属性。 这与可访问名称不同。 这令人困惑。文章 什么是可访问的名称 ? 进一步解释了这一点。name 属性用于计算机。 在 <form> 中,它被用作提交数据时的参考。此名称 countryCode 不会帮助任何用户。 它不会被辅助技术拾取。

要给 this <select> 一个易于访问的名称,我们必须使用属性 aria-label。通常,我们会将视觉标签连接到 <select> 组件。 在这种情况下,两个组件只有一个视觉标签。

这是一个 <select> 具有易于访问的名称:

<select aria-label="Country calling code" name="countryCode">…<select>

一些组件有一个值或一个状态。 手风琴是打开的或关闭的。 此信息必须是可访问的。

Uber 上手风琴面板的屏幕截图。 一个问题是封闭的,一个是开放的。

手风琴被认为是自定义组件。 此处没有可使用的标准 HTML 元素。 每个手风琴标题应该是 <button>role="button":

<div role="button">When do I get charged for a ride?</div>

好的。 它具有按钮的作用。 它还有一个名字,div的内容。 为了给这个按钮一个值,我们需要告诉辅助技术它是关闭的。 这是通过 aria-expanded="false" 完成的:

<div role="button" aria-expanded="false">When do I get charged for a ride?</div>

现在,我们的手风琴标头具有角色、名称和值。