关于 accessibility
面向前端开发者的无障碍设计技能,提供 WCAG 2.2 AA 相关的 HTML、表单、键盘交互和测试实践。
主要功能
- 01语义化 HTML 与 ARIA
- 02键盘导航与焦点管理
- 03表单标签和错误处理
- 04颜色对比度要求
- 05使用 axe-playwright 测试
适用场景
- 01检查页面结构与 ARIA 标记
- 02设计键盘可操作的界面
- 03完善表单验证和错误提示
- 04在 E2E 测试中检测无障碍问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ exceptionless/ exceptionless --skill accessibility安装后在 Claude Code 中输入/accessibility确认已加载。
详细介绍
无障碍(WCAG 2.2 AA)
核心原则
- 使用语义化 HTML 元素和 ARIA 地标
- 优先支持键盘导航,并显示焦点状态
- 在布局中为主要内容提供跳转链接
- 使用包容、以人为本的语言
语义化 HTML
使用 <header>、<nav aria-label="...">、<main id="main-content">、<section aria-labelledby="...">、<footer>。始终遵循标题层级(h1 → h2 → h3)。
跳转链接
<a href="#main-content" class="sr-only focus:not-sr-only focus:absolute ...">
Skip to main content
</a>
表单无障碍
- 为每个控件添加标签:使用
<label for="email">,或为仅含图标的输入框添加aria-label - 必填字段:使用
required aria-required="true",并显示*(aria-hidden="true") - 错误消息:通过
aria-describedby关联,并设置aria-invalid={hasError} - 验证失败时:聚焦第一个无效输入框
- 切勿仅为阻止验证而禁用提交
<input id="email" aria-invalid={hasError} aria-describedby={hasError ? 'email-error' : undefined} />
{#if hasError}
<p id="email-error" class="text-destructive">Please enter a valid email address</p>
{/if}
键盘导航
- 自然 Tab 顺序遵循 DOM 顺序 — 避免使用正数
tabindex - 对隐藏或非活动元素使用
tabindex="-1" - 对话框:打开时聚焦第一个可交互元素,关闭时将焦点还给触发元素
- 非按钮的可交互元素必须处理
Enter和Space键事件
图标按钮
始终添加 aria-label,并对辅助技术隐藏图标:
<button aria-label="Delete event">
<TrashIcon aria-hidden="true" />
</button>
图标与可见文本同时出现时,只需隐藏图标:<PlusIcon aria-hidden="true" />。
ARIA 模式
用于动态更新的实时区域:
<div aria-live="polite" aria-atomic="true">{#if loading}Loading events...{/if}</div>
<div role="alert">Error: Failed to save changes</div>
可展开内容:在触发元素上使用 aria-expanded 和 aria-controls,并在面板上使用 hidden。
颜色与对比度
- 最低对比度:普通文本为 4.5:1,大号文本和 UI 组件为 3:1
- 不要仅依赖颜色 — 同时使用图标或文本
<span class="text-destructive"><AlertIcon aria-hidden="true" /> Error: Invalid input</span>
测试
在 E2E 测试中使用 axe-playwright(AxeBuilder({ page }).analyze())检测无障碍违规问题。
评论
支持 Markdown