NVDA 不会读取带有 aria-label 的 aria-describedby

NVDA doesn't read aria-describedby with aria-label

我有一个简单的按钮。

.icon {
    border: 1px solid black;
    display: inline-block;
    height: 25px;
    text-indent: -999em;
    vertical-align: middle;
    width: 25px;
}

    <a role="button" href="javascript:void(0);" aria-label="select product" aria-describedby="navigation">
        <span id="navigation" class="icon >Enter to open, tab to navigate</span>
    </a>

当我切换到此 link 时,我想听到 "select product button, Enter to open",但 NVDA 只读取 "select product button",没有导航消息。

有人知道如何修复它或以某种方式为按钮提供额外的导航消息吗?

我假设这会打开某种下拉菜单?我没有 NVDA 可以用来测试,但我可以将其重新构建为我知道适用于该场景的东西。

有几个更新要进行:

  1. 如果是按钮,请使用 <button> 而不是覆盖另一个元素。 (我认为按钮是正确的,因为它在页面上做了一些事情,而不是去其他地方。)
  2. Enter 是您在 NVDA(和 Jaws)上激活东西的方式,但它在其他屏幕阅读器上是不同的。最好不要告诉人们如何使用他们的屏幕阅读器,你必须假设他们知道(至少对于基础知识)否则他们不可能走到这一步。
  3. 与其提供标签,不如使用 aria-haspopup 来指示按钮的功能。

例如(改编自HeydonWorks):

<div class="product-selector">  
  <button aria-haspopup="true">
    <span>Select product</span>
  </button>
  <ul class="pop-up" aria-hidden="true" aria-label="Product Menu">
    <li><a href="#">Test item</a></li>
  </ul>
</div>

显然你需要 CSS/JS 来使弹出窗口工作,并且 aria-haspopup 和 aria-hidden 应该首先由 JS 添加。在 VoiceOver 中读出为 "Select product, pop-up button",我认为您会在 NVDA 中得到类似的东西。

注意:如果弹出窗口按源代码顺序在按钮下方立即打开,这是一个很好的方法,因为它将是屏幕阅读器的下一步。如果弹出窗口在页面的其他位置打开,您最好使用 link(没有角色=按钮)并将焦点移动到带有 .focus() 的弹出窗口。

1.为什么在您的示例中未使用 aria-describedby aria-describedby 用于附加不重要的信息。通常 title 属性会自动匹配到 aria-describedby。 (注意:如果缺少标签或内容,则 title 与 a11y 名称匹配(即:与 aria-label 相同)。由于它是额外用途,大多数开发人员正在使用对于不重要的事情,屏幕阅读器经常不会自动宣布它(屏幕阅读器用户可能有快捷方式和设置来强制阅读这些内容。)。但也有例外:例如,大多数屏幕阅读器会自动阅读对话框的描述。

2。为什么你对 aria-describedby 的用法是错误的: 您描述了用户应如何激活此控件,但这显然没有必要。实际上这是aria角色和属性的主要功能。如果你用语义标记描述一个元素,它会告诉用户如何与之交互,你不需要用文字来重复它。例如:<button>role="button" 表示如果您按回车键或 space 或进行(鼠标)单击,它将执行此控件的默认操作(如果是本机 button 元素这可以通过 click 事件简单地完成。

3。您可以使用 aria-haspopup="true",但如果您这样做,您 必须 添加额外的 JS: 上面的观点也解释了为什么简单地添加 <button aria-haspopup="true"> 就像另一个答案所描述的那样,在屏幕阅读器中听起来对你来说很棒,但这并不总是最好的做法。

事实上 <button aria-haspopup="true" aria-label="Settings"> 读作 "Settings, Menubutton",这在语义上可能是您想要的。但是从描述来看并不意味着,这个按钮首先打开了一个submenu/popupmenu。这意味着,它的行为类似于菜单按钮。如果您按 "cursor down"(它也允许 space/enter),菜单按钮也会执行它的默认操作。

这意味着带有子菜单的链接教程是胡说八道。如果您按下光标或 space 它不会打开子菜单。

有趣的部分也来了。如果您创建一个 <button aria-haspopup="true" aria-label="Settings">(包括所有菜单按钮交互(即:space、输入、光标向下...),然后打开一个 role="dialog" 并将焦点移到此对话框中。它不会是用户所期望的,但它完全是 fine/accessible,因为您的控件的行为与描述的一样,并且一旦用户切换到对话框,他就会收到通知,他不在菜单中,但是在对话框中并可以相应地与之交互。