语义和屏幕阅读器

您有没有想过,屏幕阅读器等辅助技术如何知道要向用户读出什么内容?答案是这些技术依赖于开发者使用语义 HTML 来标记其网页。但什么是语义?屏幕阅读器如何使用语义呢?

功能可见性和语义

在深入了解语义之前,了解另一个术语:功能可见性会很有帮助。可供性 (affordance) 是指能够或为其用户提供执行某项操作的机会的任何对象。Teapot 就是一个典型的例子:

茶壶的标识名是一种自然的使用方法。

这种茶壶不需要使用说明手册,而是以实际设计向用户传达操作方法。它有一个句柄,而且由于您已经看到世界上其他具有类似句柄的对象,因此您可以推断应该如何获取并操作它。

在构建图形界面时,我们使用 CSS 等方式为界面添加视觉效果。例如,您可以为按钮添加阴影和边框,使其类似于现实世界中的按钮。

但是,如果用户看不到屏幕,那么这些可见内容就无法传递给他们。因此,您需要确保界面的构建方式可以向辅助技术传达这些相同的功能。这种以非视觉方式呈现界面元素的功能选项称为“语义”

使用语义 HTML

要传达适当语义,最简单的方式是使用语义丰富的 HTML 元素。

使用 CSS,可以为 <div><button> 元素设置样式,使其传达相同的视觉效果,但在使用屏幕阅读器时,这两种体验截然不同。<div> 只是通用的分组元素,因此屏幕阅读器只会读出 <div> 的文本内容。<button> 以“按钮”的形式公布,向用户发出更强烈的信号,表明这是他们能够与之互动的内容。

要解决这个问题,最简单且通常的最佳解决方案是完全避免使用自定义交互控件。例如,将行为类似于按钮的 <div> 替换为实际的 <button>

语义属性和无障碍树

一般来说,每个 HTML 元素都具有以下一些语义属性:

  • 角色或类型
  • 名称
  • 一个(可选)
  • state(可选)

元素的角色描述其类型,例如,对于 divspan 元素,角色是“按钮”“输入”,甚至是仅“组”。

元素的“名称”是其计算出的标签。屏幕阅读器通常会读出元素的名称及其角色,例如“注册,按钮”。确定元素名称的算法会考虑多种因素,例如元素内是否有任何文本内容、该元素是否具有 titleplaceholder 等属性、该元素是否与实际的 <label> 元素相关联,以及该元素是否具有 aria-labelaria-labelledby 等 ARIA 属性。

某些元素可能具有。例如,<input type="text"> 的值可能反映用户在文本字段中输入的任何内容。

某些元素可能还具有状态,用于传达其当前状态。state例如,<select> 元素可以处于展开状态或收起状态,具体取决于它处于打开还是关闭状态。

无障碍功能树

对于 DOM 中的每个节点,浏览器都会确定该节点在语义上是否“有趣”,并将其添加到无障碍功能树中。当辅助技术(如屏幕阅读器)为用户提供备用界面时,通常是通过遍历此无障碍树来实现的。

您可以使用 Chrome 的开发者工具检查元素的语义属性,并探索其在无障碍功能树中的位置。

后续步骤

对语义及其如何辅助屏幕阅读器导航有一定了解后,您就会忍不住以不同的方式看待您构建的网页。在下一节中,我们将退后一步,考虑如何使用有效的标题和地标来传达页面的整个轮廓。