Writing

网站的可访问性 (Accessibility)

文章發表於

前言

我还记得刚踏入职场时,常常在 X 上看到许多国外大神分享他们的产品已经符合无障碍标准,又或是他们的设计系统全面支持 A11y 等等的关键字。

当时只觉得:“又有新东西出现!!真的学不动了...”且心想,这该不会又是个短暂的风潮,撑不过一季就退烧吧?

直到刚加入一家美国初创后,初期收到的任务大多还算简单,但让我讶异的是这些任务几乎都是跟无障碍 (Accessibility) 有关的修正或优化,像是让键盘能顺利操作、让屏幕阅读器能正确朗读内容等等。

这才发现,原来公司近期正全面推动网站的无障碍支持,也才开始理解,美国法律对网站的可访问性(Accessibility)有一定的要求,如果网站做得不够完善,是有被用户提告的风险。

根据 2021 年的资料,美国约有 4,250 万名身心障碍者,占总人口的 13%。这个族群涵盖了在听力、视力、认知、行走、自我照顾或独立生活等方面有困难的人。回头看台湾,根据 卫生福利部统计 有近 120 万人是身心障碍者,占总人口的 4.2%。

从身心障碍者的角度来看,如果一个产品无法让他们顺利使用,那是否为一种不公平;而从商业的角度来说,缺乏可访问性的产品,则意味着直接流失这一群潜在用户。那时我才知道可访问性如此重要,也才开始认真学习相关的知识。

什么是可访问性?

许多可访问性的功能不仅仅是身障使用者受益,也对所有使用者带来了更好的可用性和包容性。以“高对比色彩”为例,不只能帮助视力较差的使用者,也对其他情境中的使用者同样有益,像是在阳光强烈的户外使用手机,或是在灯光昏暗的房间里操作装置时,都能提升可读性与能见度,减轻眼睛疲劳,进而提高整体清晰度与使用效率。

重要的原则

  1. 可感知性 (Perceivable)

    信息与用户界面必须能够被所有人以某种形式感知。也就是说,不论使用者通过哪种感官或辅助工具,都应该能接收到内容。

  2. 可操作性 (Operable)

    所有使用者都应能操作界面与进行导航。举例来说,网站必须支持键盘操作,不能只依赖鼠标,确保每个人都能顺利使用功能。

  3. 可理解 (Understandable)

    信息内容与界面互动方式应容易理解。举例来说,系统应能协助朗读内容、提供摘要,帮助有认知障碍的使用者理解页面。

  4. 强健 (Robust)

    内容必须具备良好的兼容性,能被多种用户代理(User Agent)与辅助技术正确解析与呈现,确保系统具备跨平台与未来的可延展性。

可访问性的四个最佳实践

以下列出四个在实现阶段特别需要留意的重点,这些原则皆参考 WCAG (Web Content Accessibility Guidelines) 的规范。我们也会在后续设计系统的元件开发中,针对这些部分特别强化与实现。

颜色对比度

提供足够的对比度,能确保使用者清楚看见文字与图像内容。特别是在文字置于图片上时,必须确保两者之间的对比度足够,才能维持良好的可读性。

以下图为例,图中上方的颜色对比度是 1.61:1,而下方则是符合 WCAG 的 8.39:1,可以明显看出下方的文字更容易阅读。

语义化标签

语义化标签是指使用 HTML 标签来描述网页的内容,让浏览器和屏幕阅读器能够更好地理解网页的内容。对于无障碍设计来说,尽量使用 <header><nav><main><footer> 来包装内容,主要是因为如果使用 <div><span> 来包装内容,屏幕阅读器会无法判断这些元素的意义。

无障碍树 (Accessibility Tree)

在一般的浏览器渲染流程中,浏览器会先解析网页标记语言(例如 HTML),建立一棵 DOM 树(Document Object Model),其中包含页面上的所有元素、属性与文字节点。同时,浏览器也会解析 CSS,产生 CSSOM。DOM 与 CSSOM 结合后,产生用于排版的 Render Tree,接着经过版面配置(layout)与绘制(paint)步骤,最终显示到屏幕上。

与此流程“并行”的还有无障碍树(Accessibility Tree):浏览器会依据 DOM 结构、ARIA 属性及计算后的样式,建立这棵树,并提供给屏幕阅读器等辅助技术存取。藉由无障碍树,身心障碍者得以感知、理解并操作我们的网站内容。

无障碍 API(Accessibility API)

当我们想把元件的语义、名称与状态暴露给无障碍树时,就需要利用浏览器/操作系统提供的无障碍 API。每个暴露的节点会被包装成一个 Accessible Object,其中最常见的四大属性如下:

属性作用常用实现方式
Role(角色)指出元素在界面中的语义角色,如 buttoncheckboxlinkrole="button"role="checkbox"
Name(名称)让使用者知道“这是什么”<label>aria-labelaria-labelledby
State/Property(状态/属性)告知目前状态,如已勾选、已展开、禁用…aria-checkedaria-expandeddisabled
Description(描述)额外说明用途或限制aria-describedby

示例代码

  1. 自定义按钮元件的角色 (Role)

    <!-- div 原本没有语义,需加 role 与 tabindex -->
    <div role="button" tabindex="0">点我</div>
  2. 提供名称 (Name)

    <!-- 通过 label 绑定 -->
    <label for="search">搜索:</label>
    <input id="search" type="text" />
    <!-- 或改用 aria-label 直接指定 -->
    <input type="text" aria-label="搜索关键字" />
  3. 自定义核取方块的状态 (State)

    <div role="checkbox" aria-checked="false" tabindex="0">订阅电子报</div>

    备注: 原生 <input type="checkbox"> 已内置可存取性信息,一般不需再加 aria-checked

  4. 额外描述 (Description)

    <label for="username">用户名:</label>
    <input id="username" type="text" aria-describedby="usernameHelp" />
    <p id="usernameHelp">用户名需包含 6–12 个字符,且不得含特殊符号。</p>

如果想要了解更多关于无障碍 API 的详细信息,可以参考 WICG AOM Explainer

键盘焦点 (Keyboard Focus)

键盘焦点是浏览器目前接收键盘输入的元素。当使用者以键盘浏览网站时,焦点就像他们的游标;所有可互动元件都必须能通过键盘操作(例如 Enter、Space、Tab 等键)存取。此外,焦点的移动顺序应按照由上而下、由左至右的 DOM 排序,确保使用体验流畅。

另一点需特别留意:当使用者点击按钮开启 Modal 窗口时,应立即将键盘焦点移入 Modal;在关闭 Modal 后,则需把焦点还给原本的按钮。后续的文章会实现相关元件,完善这套焦点管理流程。

Accessibility 测试工具

  1. VoiceOver - macOS 内建的屏幕阅读器
  2. NVDA - 支持 Windows 的屏幕阅读器
  3. TalkBack - 支持 Android 的屏幕阅读器

延伸阅读

  1. W3
  2. Saleforce
  3. WebAIM
  4. MDN
  5. Cloudscape.design
  6. Accessibility Tree
  7. WICG
如果您喜欢这篇文章,请点击下方按钮分享给更多人,这将是对笔者创作的最大支持和鼓励。
Buy me a coffee