辅助功能:使用触发按钮向下拉菜单添加视觉标签

Accessibility: adding visual labelling to a dropdown menu with a trigger button

我正在构建一个包含日期输入字段和时间下拉选择器的用户表单。它需要可访问并符合 WCAG。 我认为如果我们有一个视觉标签来伴随表单控件,对于有视力的用户来说会更直观。 为了让屏幕 reader 用户能够访问视觉标签中的内容,我需要明确 link 表单控件的标签。

由于下拉菜单不是搜索字段下拉菜单,它只有一个触发按钮。

代码沙箱: https://codesandbox.io/s/competent-solomon-3nm8pe?file=/src/App.js:394-1066

期望的行为:

使用屏幕 reader,用户将导航到开始时间下拉菜单,屏幕 reader 将宣布:'菜单按钮,子菜单,开始时间,12:00 PM' 或类似的内容。我们希望获得视觉标签以及下拉菜单的当前值。

问题:

当按钮包含文本内容时,NVDA 等屏幕 reader 不需要任何进一步的标签,因为通常没有必要。添加更多标签,导致屏幕 reader 公告不按预期运行。比如读取了aria-label或者aria-labelledby的内容,不读取按钮里面的内容。对于按钮角色,屏幕 readers 似乎不支持这种行为。

示例:

{/* works: start time, edit field, blank */}
<label id="form-label-4">Start date</label>
<input type="date" aria-labelledby="form-label-4"></input>

{/* does not work: start time, button */}
<label id="form-label-2">Start time</label>
<button aria-labelledby="form-label-2">12:00 PM</button>

{/* works, but not the desired effect: button, 13:00 PM. end time */}
<label id="form-label-3">End time</label>
<button aria-describedby="form-label-3">13:00 PM</button>

{/* does not work: button, start time */}
<button aria-label="Start time">13:00 PM</button>

怎样才能达到预期的效果?

问题是您试图为按钮组件分配标签和值,但这不是按钮的设计目的 - 它意味着有标签和可能的状态(例如,用于切换按钮)。您已经创建了一个按钮菜单,其行为类似于 select-only 组合框,但在语义上不是组合框。

在我看来,你有两个选择:

  1. Re-write 开始时间和结束时间按钮菜单作为 select-only 组合框。您可以参考 WAI-ARIA Practices example 以了解此组件在屏幕 reader 上的行为方式 reader。

  2. 您可以将第二个 non-visible 标签添加到带有所选时间的按钮,然后 link 使用 aria-describedby 将其添加到按钮。这将按您想要的顺序公布标签、角色和值:

<label id="form-label-2">Start time</label>  
<label id="form-label-3">12:00 PM<label>  
<button aria-labelledby="form-label-2" aria-describedby="form-label-3">12:00 PM</button>