如果我有以下 HTML:
<html>
<body>
<h2>
Buy our awesome product!
</h2>
</body>
</html>
...Apple VoiceOver 会说:
“标题级别 2,购买我们出色的产品”
这很棒,值得期待。
但是,如果我把它改成这样:
<html>
<body>
<h2>
Buy our <i>awesome</i> product!
</h2>
</body>
</html>
Apple VoiceOver 会说:
“标题级别 2、3 项,购买我们的...真棒...产品...购买我们的...真棒...产品”
(添加“3 个项目”,在元素之间暂停,并且重要的是,重复标题)
我希望 VoiceOver 的发音方式与不使用斜体时完全相同。
当然,我希望不要让它说“3 项”并删除停顿,但是 主要担心的是它重复了标题。我尝试过使用 ,使用类,并将所有内容都包含在
可能相关或有帮助,我发现这个问题似乎只出现在标题中。如果我对以下代码运行 VoiceOver,它只会被读取一次,就好像斜体或单独的元素根本不存在一样:
<p>
Buy our <i>awesome</i> product!
</p>
我在 Chrome 和 Safari 上都会出现此问题。我没有测试过其他浏览器。
如果可能的话,我更喜欢 HTML/CSS 解决方案,并避免使用 javascript hack,因为我不是 javascript 专业人士。
披露:
<i>
之外的样式来专门设置标题的某些元素的样式,但上面是一个更简单的示例,并产生相同的结果。在我看来,这是一个 VoiceOver 错误,而且不容易解决。
去年,我使用 VoiceOver 运行了各种 测试用例,发现避免您在 VoiceOver 中描述的体验的唯一方法是使用
role="text"
。这将阻止 VoiceOver 将每个子元素视为单独的标题,如 YouTube 上 Patrick H Lauke 的演示和解释所示。例如:
<h2><span role="text"><span style="display: block;color: red;">This is styled text</span> and this is a new line</span></h2>
当
role="text"
(非官方规范)应用于容器元素时,它将强制 VoiceOver 重新计算标题元素的可访问名称,将其减少为单个元素。这适用于 macOS 和 iOS。
我还使用aria-label
进行了测试,尝试在 VoiceOver 中解决这些问题,但没有找到合适的解决方案。
但是,VoiceOver 现在似乎在我测试的每项技术中都有更一致的体验。虽然 VoiceOver 现在将标题读取为单个公告,但它也始终公告元素内有多个项目。我正在进一步测试这一点。您可能想尝试我在
我的测试用例<html>
<body>
<h2 aria-label="Buy our awesome product!">
<span aria-hidden="true">
Buy our <i>awesome</i> product!
</span>
</h2>
</body>
</html>
在我看来,这是一个 VoiceOver 错误,而且不容易解决。
去年,我使用 VoiceOver 运行了各种 测试用例,发现避免您在 VoiceOver 中描述的体验的唯一方法是使用
role="text"
。这将阻止 VoiceOver 将每个子元素视为单独的标题,如 YouTube 上 Patrick H Lauke 的演示和解释所示。例如:
<h2><span role="text"><span style="display: block;color: red;">This is styled text</span> and this is a new line</span></h2>
当
role="text"
(非官方规范)应用于容器元素时,它将强制 VoiceOver 重新计算标题元素的可访问名称,将其减少为单个元素。这适用于 macOS 和 iOS。
我还使用aria-label
进行了测试,尝试在 VoiceOver 中解决这些问题,但没有找到合适的解决方案。
但是,VoiceOver 现在似乎在我测试的每项技术中都有更一致的体验。虽然 VoiceOver 现在将标题读取为单个公告,但它也始终公告元素内有多个项目。我正在进一步测试这一点。您可能想尝试我在
我的测试用例<html>
<body>
<h2 aria-label="Buy our awesome product!">
<span aria-hidden="true">
Buy our <i>awesome</i> product!
</span>
</h2>
</body>
</html>