屏幕阅读器如何处理由标签(而非空格)分隔的文本?

How do screen readers handle text separated by tags (not spaces)?

出于文体原因,我有如下 HTML 标记:

h1 {
  font-family: 'Heebo', sans-serif;
  font-weight: 900;
}

h1 span {
  font-weight: 100;
  color: yellow;
}
<link href="https://fonts.googleapis.com/css?family=Heebo:100,900" rel="stylesheet">
<h1>Big<span>yellow</span>bananas</h1>

这使我能够以不同的方式设置 yellow 的样式,并且由于它的样式不同,我可以删除单词之间的空格,使文本看起来不错,但仍可供人们阅读。然而,这让我开始思考。搜索引擎和屏幕阅读器如何处理此类文本?假设他们将标题视为单个字符串 Bigyellowbananas 而不是 Big yellow bananas,保持视觉效果但提高可访问性的正确方法是什么?

我猜是 zero-width 个空格,但我不确定。

您说得对,缺少空格会导致屏幕阅读器和盲文设备出现问题。标题将被读作“Bigyellowbananas”,并在盲文设备上显示为一个词。

您可以通过在标题上使用 aria-label 来解决此问题。

<h1 aria-label="big yellow bananas">Big<span>yellow</span>bananas</h1>

aria-label 覆盖屏幕阅读器和盲文设备标题中的文本。

其实要看屏幕reader是否单字读。 Jaws 肯定会将您的文本作为一个单词来阅读,而 VoiceOver 会阅读三个单词,甚至可能在它们之间进行夸张的停顿。

理想情况下,为了安全起见,您应该在单词之间放置一个实际的 spaces,以确保所有内容在任何地方都能被很好地阅读。 space 是在 </span> 之前还是在 <span> 之后并不重要。事实上,如果你删除所有 HTML 标签,很明显你应该把 spaces.

放在哪里

不幸的是,我不是 CSS 专家,但我很确定有一个代码具有正确 space 的解决方案。例如,您不能为这样的事情更改您的代码吗?

<h1>My<span class="space"> </span><span class="big">yellow</span><span class="space"> </span></h1>

其中 .space 实际上可能是 .sr-only,将宽度减小到 1px,发送 off-screen 或任何其他相同类型的常用 CSS 技巧。

在我看来,

ARia-label 并不是一个完整的证明解决方案。它通常用于元素交互,但在只有文本而没有交互的上下文中,它不能保证始终有效。 一些屏幕 reader 需要一个角色,否则如果没有角色,它们将忽略 aria-label。但是,在这里 <h1 role="heading"> 是一种不好的做法,您明确地赋予了某些隐含的角色(这可能会带来其他麻烦)。 role="text"role="presentation" 更糟糕,当从一个标题导航到另一个标题或列出页面的所有标题时,它们都会使标题被完全跳过。

回到主要问题,注意 VoiceOver 并不总是正确的预期行为。考虑一下:

<p>This is <span style="color: blue;">blue</span>.</p>

Jaws 或 NVDA 没问题,但我已经看到 VoiceOver 在此类代码上明确地说 "period",夸张地将 "blue" 从句子中分离出来。 但是,在那种情况下,我认为没有一种简单的方法可以更改 HTML 以便在任何地方都有正确的读数。