【问题标题】:Make screenreader say button alt-attribute instead of innerText让屏幕阅读器说按钮 alt-attribute 而不是 innerText
【发布时间】:2019-01-17 04:27:32
【问题描述】:

是否可以强制屏幕阅读器阅读 alt 属性而不是按钮内的文本?

示例html:<button alt="user menu">DrKawashima</button>

在 MacOS 中使用内置的辅助功能屏幕阅读器进行测试时,我发现它只显示“DrKawashima”,并且从未使用过 alt 属性。

有没有办法向屏幕阅读器提示我宁愿让它说“用户菜单”?

【问题讨论】:

    标签: accessibility screen-readers


    【解决方案1】:

    最好的办法是在<button>aria-hidden 中使用样式化的<span> 标签

    <button aria-label="screen reader text">
      <span aria-hidden="true">Visual Text</span>
    </button>

    编辑:正如评论中所讨论的,这不是最好的方法。 作为语音控制用户无法激活此按钮。

    andrewmacpherson 的回答为此提供了一个更具包容性的解决方案。

    【讨论】:

    • 此方法失败WCAG Success Criterion 2.5.3: Label in Name。语音控制用户无法通过说“单击可视文本” 来激活此按钮。可见文本不构成计算的可访问名称的一部分,因为 aria-label 完全覆盖了按钮内容。
    • 这里使用aria-hidden是一个红鲱鱼。无论嵌套跨度上是否存在aria-hidden 属性,计算出的按钮的可访问名称都是“屏幕阅读器文本”。
    • 你说得对,我没有考虑过这种情况。 andrewmacpherson 的回答提供了更好的方法。
    【解决方案2】:

    是的,这是可能的 - 但要小心完全覆盖按钮的可见文本。

    tl;dr - 我在这里推荐方法 4。

    您的问题涉及屏幕阅读器,但还有其他类型的辅助技术需要考虑。特别是使用语音控制的视力正常的人(例如 Dragon Naturally speak)。注意地址WCAG Success Criterion 2.5.3: Label in Name

    辅助技术处理元素的computed accessible name

    • 屏幕阅读器将读取计算出的可访问名称。请记住,屏幕阅读器的基本目的是阅读屏幕上的内容 - 谨防试图向屏幕阅读器用户呈现不同的界面。
      • 当盲人屏幕阅读器用户和有视力的人都在谈论同一个屏幕时,可能会出现混淆。例如,电话技术支持人员可能会说“单击显示 DrKawashima 的按钮”。但如果这被覆盖,屏幕阅读器会说该按钮称为“用户菜单”,而用户找不到他们被告知要按下的按钮。
      • 视力正常的人也使用屏幕阅读器。例如,患有阅读障碍的人可能喜欢阅读一些内容以使生活更轻松。当计算出的可访问名称与可见文本不同时,屏幕阅读器实际上是在向用户谎报屏幕上所说的内容。
    • 语音控制将尝试将用户所说的内容与计算出的可访问名称相匹配。如果按钮具有可见文本,则此文本出现在元素的计算可访问名称内很重要。期望语音控制用户可以通过说出可见文本来激活按钮。在您的示例中,说“单击 DrKawashima”应该激活按钮。如果计算的可访问名称是“用户菜单”,这将不起作用。
      • 有一个解决方法。 Dragon Naturally speak 有一个使用数字突出显示所有按钮的工具:说 “单击按钮”,查找数字,然后说 “选择 2”。然而,这是一个多步骤的过程,需要用户付出额外的努力。

    请注意,计算出的可访问名称和可见文本不必完全匹配。相反,可见文本必须构成可访问名称的部分

    让我们看一些例子:

    1. 按钮上带有 alt 属性的示例根本不起作用,因为按钮没有 alt 属性。这不是有效的 HTML: &lt;button alt="user menu"&gt;DrKawashima&lt;/button&gt;.

      • 可见文本是“DrKawashima”
      • 计算出的可访问名称是“DrKawashima”。 alt 属性无效。
      • 这会通过 WCAG“名称中的标签”,因为可见文本和计算出的可访问名称完全相同。
      • 但是它无法通知屏幕阅读器用户该按钮的用途;有视力的用户可能会从随附的图标或头像图像中推断出这一点。
    2. aria-label 属性可用于完全覆盖按钮内容:&lt;button aria-label="user menu"&gt;DrKawashima&lt;/button&gt;

      • 可见文本是“DrKawashima”。
      • 计算出的可访问名称是“用户菜单”。 aria-label 属性完全覆盖按钮内容。
      • 此方法失败 WCAG“名称中的标签”,因为可见文本不构成可访问名称的一部分。语音控制用户无法通过说“单击 DrKawashima”来激活按钮。
    3. aria-label 属性可用于完全覆盖按钮内容,同时复制可见文本:&lt;button aria-label="DrKawashima, User menu"&gt;DrKawashima&lt;/button&gt;

      • 可见文本是“DrKawashima”。
      • 计算出的可访问名称是“DrKawashima,用户菜单”。 aria-label 属性完全覆盖按钮内容,但它复制了可见文本。
      • 这通过了 WCAG“名称中的标签”。可以通过说“单击 DrKawashima” 激活按钮,因为可见文本位于计算出的可访问名称内。
      • 这种方法很简单,但可能很脆弱,因为您必须管理两个字符串。
    4. 包括一些视觉上隐藏的文本,为屏幕阅读器用户提供一些额外的上下文。例如,使用 HTML5Boilerplate 的 .visuallyhidden 类,或 Bootstrap 的 .sr-only 类: &lt;button&gt;DrKawashima&lt;span class="visuallyhidden"&gt;, User menu&lt;/span&gt;&lt;/button&gt;

      • 可见文本是“DrKawashima”
      • 计算出的可访问名称是“DrKawashima,用户菜单”。这是按钮内容的结果。
      • 这通过了 WCAG“名称中的标签”。可以通过说“单击 DrKawashima” 激活按钮,因为可见文本位于计算出的可访问名称内。
      • 这是最简单的解决方案,非常强大。
    5. aria-labelledby 属性可以通过引用 2 个元素 ID 来构建可访问的名称: &lt;button aria-labelledby="user-menu-visible-label user-menu-suffix"&gt;&lt;span id="user-menu-visible-label"&gt;DrKawashima&lt;/span&gt;&lt;span id="user-menu-suffix" class="visuallyhidden"&gt;, User menu&lt;/span&gt;&lt;/button&gt;

      • 可见文本是“DrKawashima”
      • 计算出的可访问名称是“DrKawashima,用户菜单”。这是将aria-labelledby 引用的两个元素连接起来的结果。
      • 这通过了 WCAG“名称中的标签”。可以通过说“单击 DrKawashima” 激活按钮,因为可见文本位于计算出的可访问名称内。
      • 这很健壮,但需要执行更多工作,因为您需要管理 ID 引用。

    【讨论】:

    • 我非常感谢这个完美的答案。在阅读本文之前,我已经实施了选项 2。但我不知道“名称中的标签”标准。现在我将使用选项 4。
    【解决方案3】:

    'alt' 不是按钮元素中允许的属性。 alt 属性适用于 area、img 和 input type="image"。查看更多关于主题 https://www.w3.org/TR/html5/dom.html#translatable-attributeshttps://www.w3.org/TR/html5/dom.html#global-attributes-2

    【讨论】:

    • 这解释了为什么提问者的方法不起作用,但它没有回答是否可能的问题。
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多