【问题标题】:How to make screen reader reads aria-label inside <span>?如何让屏幕阅读器在 <span> 中读取 aria-label?
【发布时间】:2021-09-13 20:33:01
【问题描述】:

当鼠标悬停在菜单栏中的“故事”按钮上时,我希望屏幕阅读器能够阅读文本“故事,菜单项”。我尝试在span 中添加aria-labelaria-describedby,但屏幕阅读器仍在阅读“故事”文本,而不是“故事、菜单项”文本。

原码:

<li role="menuitem">
     <span class="">Stories</span>
</li>

我尝试过但不起作用的事情:

(1) 添加aria-label

 <li role="menuitem">
         <span class="" aria-label="stories, menu item">Stories</span>
 </li>

(2) 添加aria-describedby

 <li role="menuitem">
         <span class="" aria-describedby="stories, menu item">Stories</span>
 </li>

【问题讨论】:

  • @AryanBeezadhur 谢谢,但title 也不起作用,它仍在为屏幕阅读器阅读“故事”
  • 您是否注意到上面aria-describedby 的示例在标签内仍然有aria-label?这只是您复制/粘贴到您的问题中的错误,还是您的实际代码中的错误?
  • @jontlymon 不,这是我的实际代码。它们不应该在span 标签内吗?
  • @jontlymon 对不起,这是一个错字。我已经编辑了代码
  • 这看起来好像你陷入了反模式。如果屏幕阅读器没有读出有关角色的上下文,这可能表明您没有正确连接它。我建议看看this answer that recommends against trying to create a menuitem。它的要点是这种类型的菜单遵循您需要遵循和实施的特定规则和行为 - 如果您不准备这样做,请不要使用此角色。请记住,没有 ARIA 比糟糕的 ARIA 更好。

标签: html accessibility screen-readers accessible


【解决方案1】:

发生了一些奇怪的事情。

首先,在您的 OP 中,您询问了当“鼠标悬停在”元素上时是否阅读文本。大多数屏幕阅读器用户不会使用鼠标,也不会将鼠标悬停在元素上。 NVDA 屏幕阅读器有一个鼠标悬停选项,因此将鼠标移到元素上会阅读它,但该功能主要适用于有视力的测试人员。我从来没有发现鼠标悬停 NVDA 功能的用途。

所以我猜你的问题更多是关于当用户导航到该项目时,你希望它阅读额外的文本。不仅仅是视觉上显示的内容。

尽管您在说明中提到了“按钮”,但您发布的代码实际上并没有键盘可聚焦元素。我暂时忽略这一点,并假设您有一个可聚焦的元素,最好是原生语义 HTML 元素。

另一个奇怪的地方是您想要宣布“菜单项”(可能是因为您没有听到宣布的内容)但该文本应该根据您的元素的role 宣布,即“menuitem”。您不必强制宣布元素的角色。使用语义 html 元素或正确使用 role 时,您可以免费获得它。在这种情况下,如果获得焦点的元素具有role="menuitem",则应宣布“菜单项”。在您的情况下,您的代码示例可能过于简化,但就目前而言,&lt;li&gt; 具有 menuitem 角色,但 &lt;li&gt; 不是接收焦点的元素。 &lt;li&gt;(按钮?)内部的元素正在接收焦点。

最后,问题的症结在于&lt;span&gt; 上的aria-label 通常不受支持,除非该跨度有作用。请参阅https://www.w3.org/TR/using-aria/#label-support 上的倒数第三个要点。但同样,您不应该强制宣布“菜单项”。

旁注:您的第三个示例使用aria-describedby,该属性的值应该是空格分隔的ID 列表。它不应该是文字字符串。

【讨论】:

    【解决方案2】:

    您可以只为屏幕阅读器添加一些附加文本:

    <li role="menuitem">
        Stories<span class="screen-reader-only">, menu item</span>
    </li>
    

    来自 Bootstrap 3 的 CSS:

    .screen-reader-only {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        border: 0;
    }
    

    改编自this answer

    【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多