关于 accessibility-engineer
面向用户界面开发者的无障碍技能。它强调语义化 HTML、键盘操作、有意义的无障碍名称和克制使用 ARIA,并涵盖表单、动态状态、焦点与媒体的实现建议。
主要功能
- 01语义化 HTML 与区域标记指引
- 02键盘导航与焦点管理
- 03无障碍标签与表单错误
- 04有依据地少量使用 ARIA
- 05动态状态与媒体指引
适用场景
- 01检查界面的无障碍性
- 02实现可键盘操作的控件与对话框
- 03构建标签和错误提示清晰的表单
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mae616/ design-skills --skill accessibility-engineer安装后在 Claude Code 中输入/accessibility-engineer确认已加载。
详细介绍
无障碍工程师技能
适用场景
在请求涉及以下内容时应用此技能:
- 无障碍、a11y、WAI-ARIA、屏幕阅读器支持、语义化 HTML、键盘导航、焦点管理
- 无障碍适配、WAI-ARIA、屏幕阅读器适配、语义化 HTML、键盘操作、焦点管理
- 任何 UI 实现(应与其他技能一同应用)
核心原则(最重要)
- 优先使用原生元素。 先用合适的 HTML 元素(
button、a、label、input等)解决问题,再考虑 ARIA。 - 尽量少用 ARIA。 不要为了让内容“看起来”无障碍而添加
role/aria-*。只有确有需要时才添加。 - 可操作 = 可传达。 不只是视觉上可见,辅助技术还必须能获取状态、名称和用途。这是完成的标准。
- 键盘操作是基础。 仅支持鼠标的 UI 并不完整。应先设计焦点移动和操作方式。
实现规则
1) 语义结构
- 保持标题层级顺序(
h1→h2→ ...)。不要为了样式跳过层级。 - 为主要区域设置地标(
header、nav、main、footer,必要时也包括aside)。 - 列表使用
ul/ol/li,定义使用dl/dt/dd,不要用div替代。
2) 无障碍名称
- 按钮、链接和输入框需要有“名称”(屏幕阅读器会读出标签)。
- 优先级:可见文本
- 备选:
aria-label(无法使用可见文本时) - 组合:
aria-labelledby(引用现有元素)
- 仅含图标的按钮/链接必须有名称(例如“搜索”“关闭”)。
3) 表单(必需)
- 将
label与input关联(for/id)。绝不能只用 placeholder 作为标签。 - 以机器可读的方式传达必填/选填、错误和提示信息(例如,使用
aria-describedby关联辅助文本)。 - 错误信息必须说明:哪里出了问题、原因是什么,以及如何修复。
4) 状态与播报(动态 UI)
- 优先使用原生
disabled属性(例如button disabled)。 - 对于切换控件,仅在原生元素无法满足需求时使用
aria-pressed/aria-expanded。 - 使用
aria-live播报异步操作完成或失败的消息,但不要过度使用。
5) 键盘操作与焦点
- 设计 DOM 顺序,确保 Tab 顺序符合逻辑。不要用
tabindex强行改变顺序。 tabindex="0":仅在需要让元素可获得焦点时少量使用。tabindex="-1":仅用于以编程方式移动焦点。- 始终保留可见焦点(
focus-visible)。绝不要隐藏焦点。 - 对话框/模态框:指定打开时焦点移至何处,以及关闭时焦点返回何处。必要时实现焦点陷阱。
6) 图像与媒体
- 根据用途设置
alt(装饰性图像使用空alt="")。 - 对于视频/音频:确认是否提供控件(播放/停止)和替代形式(字幕/文字稿)。不明确时请询问。
反模式(绝不要这样做)
- 使用带
onClick的div充当按钮(会破坏键盘操作/角色语义)。 - 将
role="button"作为变通方案(应使用原生button)。 - 到处添加
aria-label(可见标签已经存在时会造成重复播报)。 - 移除焦点环(焦点不可见就无法操作)。
澄清问题(不要自行假设)
- 此 UI 是否必须支持仅用键盘完成操作?(如果是,请列出操作步骤并达成一致。)
- 对于模态框/抽屉:打开时焦点移至何处?关闭时焦点移至何处?
- 何时播报错误?立即播报,还是提交后播报?
- 视频/音频是否需要字幕或文字替代内容?
输出格式(用于实现)
- 语义结构(地标、标题、列表)
- 键盘操作(Tab 顺序、Enter、Space、Escape)
- ARIA 用法(仅在需要时使用,并说明理由)
- 状态(禁用/加载/错误)与播报(必要时使用 aria-live)
- 无障碍检查清单自评(OK / 需要改进)
评论
支持 Markdown