【问题标题】:Screen reader stops when it reaches a span element屏幕阅读器在到达 span 元素时停止
【发布时间】:2021-01-12 11:42:59
【问题描述】:

我正在做一些屏幕阅读器可用性测试,我想知道是否有人可以向我解释为什么屏幕阅读器在到达 <span /> 元素时会停止。

例子:

<h1><span class="style1">Today</span> is a wonderful <span class="style2">day</span></h1>

屏幕阅读器将阅读“今天”然后停止,而不是阅读整个 &lt;h1 /&gt; 文本。

注意:我使用的是 iPad 上“设置”>“通用”>“辅助功能”菜单中可用的语音。

【问题讨论】:

标签: html accessibility voiceover


【解决方案1】:

正如@vanita 和我三年前在Making an h2 tag with a strong tag inside accessible 中的评论所指出的,这就是 VoiceOver 的工作原理。元素之间可能存在一些语义意义,因此 VoiceOver 将在每个元素上停止。

虽然有一个解决方法,但它没有记录在案,只影响 VoiceOver(不影响 JAWS 或 NVDA)。使用role="text"。但是,由于它没有记录在案,因此您冒着在未来某个时候无法使用它的风险。

请谨慎使用它,因为您不想丢失标题的语义含义。让我们从最初的问题开始,如下所示:

<h1>hello <strong>there</strong> world</h1>
<h1>hello <span class="myclass">there</span> world</h1>

嵌入元素是语义()还是非语义()都没有关系。

role="text" 应该直接放在

上,因为那样会删除标题的语义含义:
<h1 role="text">hello <strong>there</strong> world </h1> <!-- DO NOT DO THIS -->

相反,将所有内部文本嵌入 并在内部跨度上指定 role="text"

<h1><span role="text">hello <strong>there</strong> world</span></h1>

这将导致“hello there world”被读取为一个元素,并且仍然会说整个事情是一个标题。

【讨论】:

    【解决方案2】:

    这就是一些屏幕阅读器在遇到其他元素中的元素时的行为方式。经常使用屏幕阅读器等辅助技术的人可能会习惯这一点,所以我建议保持原样。

    【讨论】:

    • 这真的是这个问题的普遍接受的答案吗?
    • 直到真正有创意的人想出更好的解决方案,我猜它是。
    【解决方案3】:

    另一种解决方法是使用替代的隐藏内容。

    例如:
    &lt;h1&gt;This is a &lt;b&gt;bolder&lt;/b&gt; word.&lt;/h1&gt;
    VO 可能只会读出“This is a”并停止

    添加隐藏内容:

    <div>
      <h1 aria-hidden="true">This is a <b>bolder</b> word.</h1>
      <span class="hidden-text"> This is a bolded word.</span>
    </div>
    

    .hidden-text 的 CSS 样式:

    .hidden-text{
      position absolute;
      opacity: 0;
    }
    

    您将它们包装在同一个 div 中的原因是它允许焦点框的语音正确定位该区域。

    这对我有用,我希望它也对你有用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 2019-11-13
      相关资源
      最近更新 更多