Communitygithub.com

无障碍(WCAG 2.2)

在 Web、iOS 和 Android 平台上设计、实现和审计符合 WCAG 2.2 Level AA 标准的无障碍用户界面,涵盖语义化 ARIA 角色与标签、无障碍特征与提示、焦点管理、对比度、目标尺寸以及屏幕阅读器支持。

无障碍(WCAG 2.2) 是什么?

该技能确保数字界面对所有用户(包括使用屏幕阅读器、开关控制或键盘导航的用户)而言是可感知、可操作、可理解且健壮的(POUR)。它专注于 WCAG 2.2 成功标准的技术实现。本技能覆盖了 Web、iOS 和 Android 三大平台,提供了从组件角色识别、可感知属性定义、可操作控件实现到可理解逻辑确保和健壮性兼容性验证的完整步骤。通过详细的跨平台映射表,开发者可以清晰地了解如何在 HTML/ARIA、SwiftUI 和 Jetpack Compose 中实现标签、提示、角色声明和实时更新等功能。此外,该技能还列举了常见的反模式(如 div 按钮、仅依靠颜色传达含义)和最佳实践清单(如目标尺寸、焦点管理、模态框焦点锁)。它直接关联前端模式、设计系统等相关技能,适合在构建或审计 UI 的无障碍合规性、键盘导航或屏幕阅读器支持时使用。

兼容平台✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/rhpxgr8pzm-max/claude-skills/tree/HEAD/plugins/tally-dev/skills/accessibility

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

无障碍(WCAG 2.2) 是做什么的?

本技能确保数字界面对于所有用户(包括使用屏幕阅读器、开关控制或键盘导航的用户)是可感知、可操作、可理解且健壮的(POUR)。它专注于 WCAG 2.2 成功标准的技术实现。

何时使用

  • 定义 Web、iOS 或 Android 的 UI 组件规格时。
  • 审计现有代码中的无障碍障碍或合规性差距时。
  • 实现新的 WCAG 2.2 标准,如目标尺寸(最小)和焦点外观。
  • 将高层设计需求映射到技术属性(ARIA 角色、特征、提示)时。

核心概念

  • POUR 原则:WCAG 的基础(可感知、可操作、可理解、健壮)。
  • 语义映射:使用原生元素而非通用容器,以提供内置无障碍支持。
  • 无障碍树:辅助技术实际“读取”的 UI 表示。
  • 焦点管理:控制键盘/屏幕阅读器光标的顺序和可见性。
  • 标签与提示:通过 aria-label、accessibilityLabel 和 contentDescription 提供上下文。

工作原理

第一步:确定组件角色

确定功能用途(例如:这是按钮、链接还是标签?)。在诉诸自定义角色之前,优先使用最语义化的原生元素。

第二步:定义可感知属性

  • 确保文本对比度满足 4.5:1(正常)或 3:1(大文本/UI 元素)。
  • 为非文本内容(图片、图标)添加文本替代方案。
  • 实现响应式重排(缩放至 400% 时功能不丢失)。

第三步:实现可操作控件

  • 确保最小 24x24 CSS 像素 的目标尺寸(WCAG 2.2 SC 2.5.8)。
  • 验证所有交互元素可通过键盘到达,并具有可见的焦点指示器(SC 2.4.11)。
  • 为拖拽动作提供单指针替代方案。

第四步:确保可理解的逻辑

  • 使用一致的导航模式。
  • 提供描述性的错误消息和修正建议(SC 3.3.3)。
  • 实现“冗余录入”(SC 3.3.7),避免重复请求相同的数据。

第五步:验证健壮的兼容性

  • 使用正确的 名称、角色、值 模式。
  • 为动态状态更新实现 aria-live 或实时区域。

无障碍架构图

flowchart TD
  UI["UI 组件"] --> Platform{平台?}
  Platform -->|Web| ARIA["WAI-ARIA + HTML5"]
  Platform -->|iOS| SwiftUI["无障碍特征 + 标签"]
  Platform -->|Android| Compose["语义学 + ContentDesc"]

  ARIA --> AT["辅助技术(屏幕阅读器、开关)"]
  SwiftUI --> AT
  Compose --> AT

跨平台映射

功能Web (HTML/ARIA)iOS (SwiftUI)Android (Compose)
主标签aria-label / <label>.accessibilityLabel()contentDescription
辅助提示aria-describedby.accessibilityHint()Modifier.semantics { stateDescription = ... }
操作角色role="button".accessibilityAddTraits(.isButton)Modifier.semantics { role = Role.Button }
实时更新aria-live="polite".accessibilityLiveRegion(.polite)Modifier.semantics { liveRegion = LiveRegionMode.Polite }

示例

Web:无障碍搜索

<form role="search">
  <label for="search-input" class="sr-only">搜索商品</label>
  <input type="search" id="search-input" placeholder="搜索..." />
  <button type="submit" aria-label="提交搜索">
    <svg aria-hidden="true">...</svg>
  </button>
</form>

iOS:无障碍操作按钮

Button(action: deleteItem) {
    Image(systemName: "trash")
}
.accessibilityLabel("删除项目")
.accessibilityHint("从列表中永久移除该项目")
.accessibilityAddTraits(.isButton)

Android:无障碍开关

Switch(
    checked = isEnabled,
    onCheckedChange = { onToggle() },
    modifier = Modifier.semantics {
        contentDescription = "启用通知"
    }
)

应避免的反模式

  • Div 按钮:使用 <div> 或 <span> 添加点击事件,但未添加角色和键盘支持。
  • 仅靠颜色传达含义:仅通过颜色变化指示错误或状态(例如将边框变红)。
  • 模态框焦点未锁定:模态框未锁定焦点,导致键盘用户可以在模态框打开时导航到背景内容。焦点必须被锁定,并且可以通过 Escape 键或明确的关闭按钮退出(WCAG SC 2.1.2)。
  • 冗余的替代文本:在 alt 文本中使用“图片:…”或“图像:…”(屏幕阅读器已宣布角色“图像”)。

最佳实践清单

  • 交互元素满足 24x24px(Web)或 44x44pt(原生)的目标尺寸。
  • 焦点指示器清晰可见且高对比度。
  • 模态框打开时锁定焦点,关闭时干净地释放焦点(Escape 键或关闭按钮)。
  • 下拉菜单和菜单在关闭时将焦点恢复到触发元素。
  • 表单提供基于文本的错误建议。
  • 所有仅有图标的按钮都有描述性的文本标签。
  • 文本缩放时内容正确重排。

参考资源

相关技能

  • frontend-patterns
  • design-system
  • liquid-glass-design
  • swiftui-patterns

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能