关于 a11y-debugging
a11y-debugging 是一项用于调试网页无障碍问题的技能,面向使用浏览器工具检查页面的开发者。它结合 Lighthouse 审计、无障碍树、键盘测试和页面脚本检查来定位问题。
主要功能
- 01运行 Lighthouse 无障碍审计
- 02检查无障碍树与标题层级
- 03检查控件名称、表单标签和图片替代文本
- 04测试键盘焦点与弹窗焦点管理
- 05检查触控目标尺寸和颜色对比度
适用场景
- 01排查网页中缺少标签的表单控件
- 02核对页面标题结构与阅读顺序
- 03检查弹窗打开后的键盘焦点行为
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ gsmlg-dev/ code-agent --skill a11y-debugging安装后在 Claude Code 中输入/a11y-debugging确认已加载。
附带文件references/a11y-snippets.md
详细介绍
核心概念
无障碍树与 DOM:以视觉方式隐藏元素(例如,CSS opacity: 0)对屏幕阅读器的影响,与 display: none 或 aria-hidden="true" 不同。take_snapshot 工具返回页面的无障碍树,它呈现了辅助技术“看到”的内容,因此是语义结构最可靠的事实来源。
阅读 web.dev 文档:如果需要查阅特定的无障碍指南(例如 https://web.dev/articles/accessible-tap-targets),可以在 URL 后追加 .md.txt(例如 https://web.dev/articles/accessible-tap-targets.md.txt),以获取干净的原始 Markdown 版本。这样更容易阅读!
工作流模式
1. 自动化审计(Lighthouse)
首先运行 Lighthouse 无障碍审计,获取全面的基线结果。此工具会提供总体评分,并列出具体的不合格元素及修复建议。
- 运行审计:
- 将
mode设为"navigation",以刷新页面并捕获加载问题。 - 设置
outputDirPath(例如/tmp/lh-report),以保存完整的 JSON 报告。
- 将
- 分析摘要:
- 检查
scores(范围为 0-1)。评分 < 1 表示存在违规。 - 查看
audits.failed数量。
- 检查
- 查看报告(重要):
- 解析:不要逐行读取整个文件。使用
jq等命令行工具或一行 Node.js 命令筛选失败项:# 提取失败的审计项及其详情 node -e "const r=require('./report.json'); Object.values(r.audits).filter(a=>a.score!==null && a.score<1).forEach(a=>console.log(JSON.stringify({id:a.id, title:a.title, items:a.details?.items})))" - 这样可以高效提取不合格元素的
selector和snippet,而无需将完整报告加载到上下文中。
- 解析:不要逐行读取整个文件。使用
2. 浏览器问题与审计
Chrome 会自动检查常见的无障碍问题。使用 list_console_messages 检查这些原生审计结果:
types:["issue"]includePreservedMessages:true(用于捕获页面加载期间发生的问题)
这样通常无需手动调查,就能发现标签缺失、ARIA 属性无效及其他严重错误。
3. 语义与结构
无障碍树会显示标题层级和语义地标。
- 导航到页面。
- 使用
take_snapshot捕获无障碍树。 - 检查标题级别:确保标题级别(
h1、h2、h3等)符合逻辑,且没有跳级。快照会包含标题角色。 - 内容顺序调整:确认 DOM 顺序(决定无障碍树的顺序)与视觉阅读顺序一致。使用
take_screenshot检查视觉布局,并与快照结构进行对比,以发现导致逻辑顺序混乱的 CSS 浮动或绝对定位。
4. 标签、表单与文本替代内容
- 在
take_snapshot输出中查找按钮、输入框和图片。 - 确保交互元素具有无障碍名称(例如,如果按钮只包含图标,其名称不应只是
"")。 - 无关联标签的输入框:确认所有表单输入框都关联了标签。使用
evaluate_script执行 references/a11y-snippets.md 中的 “查找无关联标签的表单输入框”代码片段。 - 检查图片是否具有
alt文本。
5. 焦点与键盘导航
在没有视觉反馈的情况下测试“键盘陷阱”和正确的焦点管理,需要跟踪当前获得焦点的元素。
- 使用
press_key工具,通过"Tab"或"Shift+Tab"移动焦点。 - 使用
take_snapshot捕获更新后的无障碍树。 - 在快照中查找标记为已聚焦的元素,确认焦点已移至预期的交互元素。
- 如果打开了模态框,焦点必须移入其中,并一直“困”在模态框内,直到模态框关闭。
6. 点击目标和视觉效果
根据 web.dev 的建议,点击目标应至少为 48x48 像素,并留有足够的间距。由于无障碍树不会显示尺寸,请使用 evaluate_script,并运行 references/a11y-snippets.md 中的 “Measure Tap Target Size”代码片段。
将快照中的元素 uid 作为参数传递给 evaluate_script。
7. 颜色对比度
要验证颜色对比度,请先检查原生无障碍问题:
- 使用
types: ["issue"]调用list_console_messages。 - 在输出中查找“Low Contrast”问题。
如果原生审计未报告问题(某些无头环境中可能会出现这种情况),或者你需要手动检查特定元素,请使用 evaluate_script,并运行 references/a11y-snippets.md 中的 “Check Color Contrast”代码片段。
8. 全局页面检查
使用 references/a11y-snippets.md 中的 “Global Page Checks”代码片段,验证组件测试中经常遗漏的文档级无障碍设置。
故障排除
如果标准无障碍查询失败,或 evaluate_script 代码片段返回意外结果:
- 视觉检查:如果自动化脚本无法确定对比度(例如,文字位于渐变图像或复杂背景上),请使用
take_screenshot截取该元素。虽然模型无法根据图像测量精确的对比度,但可以通过视觉评估可读性并发现明显问题。