【问题标题】: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>
屏幕阅读器将阅读“今天”然后停止,而不是阅读整个 <h1 /> 文本。
注意:我使用的是 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】:
另一种解决方法是使用替代的隐藏内容。
例如:
<h1>This is a <b>bolder</b> word.</h1>
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 中的原因是它允许焦点框的语音正确定位该区域。
这对我有用,我希望它也对你有用!