【问题标题】:Chrome ignores aria-labelledbyChrome 忽略 aria-labelledby
【发布时间】:2019-08-23 23:30:11
【问题描述】:

我最近发现,当可聚焦元素中包含一些内容并分配了 aria-labelledby 属性时,MacOS 的 VoiceOver 不会读取标签内的内容,而是读取焦点组件的内容

在不同的浏览器上尝试过:在 Safari (11.1.1) 中按预期工作,但在 Chrome (76.0.3809.100) 中失败。 还尝试改变两个元素的角色。

<p id="header">This text should be read</p>

<div tabindex="0" aria-labelledby="header">
  <span>Click me</span>
  <p>This text should not be read</p>
</div>

https://jsfiddle.net/2d9jn4hs/

当您在启用 VoiceOver 的情况下专注于 div 时,我希望听到 This text should be read 但会听到 Click me This text should not be read

有什么建议吗?

【问题讨论】:

    标签: html accessibility wai-aria voiceover screen-readers


    【解决方案1】:

    看一下“Practical Support: aria-label, aria-labelledby and aria-describedby”,尤其是倒数第三个:

    不要在spandiv 上使用aria-labelaria-labelledby,除非给定role。当 aria-label 或 aria-labelledby 处于交互式角色(例如链接或按钮)或 img 角色时,它们会覆盖 div 或 span 的内容。除了地标(上面讨论过)之外的其他角色被忽略。

    强调的文字“他们 [aria-labelled] 覆盖了 div 或 span 的内容”,听起来像是您正在寻找的行为。

    因此,您需要为“可点击”事物指定 role,最好是交互式角色,例如 Widget Role

    【讨论】:

    • 耶!像魅力一样工作。我看到那段并尝试分配角色,但显然是错误的。一个通用的 role="group" 成功了。
    • 这实际上有点奇怪,因为(如果我没猜错的话)它已经分配了一个隐含的role='group'
    • 您发布的示例包含 p、div 和 span 元素。这些都没有隐含的作用。您认为哪个元素具有隐含的群体角色?
    • 这个问题只出现在MAC上,windows操作系统没问题。通过添加角色属性,我设法修复了画外音。这个解决方案做得很好。
    • @SergiuMare 是的,不幸的是,操作系统和屏幕阅读器组合的行为方式差异很大,但有充分的证据表明,非语义元素上的 aria-label 通常会被忽略,直到您提供角色。
    【解决方案2】:

    首先你想达到什么目的?

    在我看来,Chrome 的行为符合预期,而 Safari 在这里失败了。

    编辑 - 实际上在重新阅读之后,由于您的措辞,我无法判断哪个行为正确....但是您的期望是错误的,您确实应该听到click me This text should not be read

    我不希望不阅读可聚焦 div 中的文本....想象一下,通过向没有视力障碍的人显示一组文本,然后向盲人显示一组完全不同的信息,您可以做多少险恶的事情人们。 (虽然这是完全可能的......)

    我的建议.....重新考虑您要达到的目标,并使每个人的信息都相同。

    如果您需要为屏幕阅读器添加额外信息,请尝试下面的“视觉隐藏”类,它允许您完全隐藏有视力的用户的信息,但仍让屏幕阅读器用户阅读。

    .visually-hidden { 
        position: absolute !important;
        height: 1px; 
        width: 1px;
        overflow: hidden;
        clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ <- if you REALLY must support ie7 and 6!
        clip: rect(1px, 1px, 1px, 1px);
        white-space: nowrap;
    }
    

    【讨论】:

    • 好的,所以我的用例是:我有一个包含各种视觉信息和标题的模式。它在按钮单击时打开,当它打开时,我专注于模式,我希望屏幕阅读器不阅读模式内的所有内容,而只阅读标题。问题是,当我使用 aria-label 时,它完全符合我的要求。但是当我使用aria-labelledby(在我看来几乎是同一件事)时,它会做一些不同的事情。
    • 您为什么不希望它读取模态?前几天我与某人进行了类似的对话,他希望屏幕阅读器在某一行后停止阅读。这与屏幕阅读器在您想要“提前阅读”时的行为方式相反,因此您知道会发生什么。这是你想要达到的目的还是我误解了?
    • 这实际上是设计使然 - aria-label 是一种为输入等标签设计的方法,因此被设计为自信。 aria-labelledby 是为图表、复杂图像等设计的补充(附加)信息。您只想添加一些额外信息。
    • 焦点 div 没有任何作用这一事实可能会影响结果。如果它是一个按钮(它可能在这里假设),则只读取焦点元素内的文本而不读取其他内容是一种常见行为,因为按钮除了其文本之外没有标签。无论如何,我建议为任何可聚焦的 div 或 span 设置一个角色。
    猜你喜欢
    • 2020-10-31
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2014-04-05
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多