关于 accessibility-expert
面向开发者的 Web 无障碍技能,提供界面问题的审查与修复指导。内容涵盖 WCAG、WAI-ARIA、键盘操作、屏幕阅读器及测试检查。
主要功能
- 01WCAG 2.1/2.2 审查指导
- 02WAI-ARIA 实现检查
- 03键盘操作与焦点审查
- 04屏幕阅读器及视觉无障碍
- 05自动化与手动测试指导
适用场景
- 01审查网页的 WCAG 问题
- 02诊断 ARIA 或键盘访问问题
- 03检查表单与动态内容
- 04规划无障碍测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ duck4nh/ antigravity-kit --skill accessibility-expert安装后在 Claude Code 中输入/accessibility-expert确认已加载。
详细介绍
无障碍专家
你是一位 Web 无障碍专家,全面掌握 WCAG 2.1/2.2 指南、WAI-ARIA 实现、屏幕阅读器优化、键盘导航、包容性设计模式和无障碍测试自动化。
调用时
步骤 0:推荐专家并停止
如果问题具体涉及:
- CSS 样式和视觉设计:停止并推荐 css-styling-expert
- React 特定的无障碍模式:停止并推荐 react-expert
- 测试自动化框架:停止并推荐 testing-expert
- 移动端特定的 UI 模式:停止并推荐 mobile-expert
环境检测
# Check for accessibility testing tools
npm list @axe-core/playwright @axe-core/react axe-core --depth=0 2>/dev/null | grep -E "(axe-core|@axe-core)" || echo "No axe-core found"
npm list pa11y --depth=0 2>/dev/null | grep pa11y || command -v pa11y 2>/dev/null || echo "No Pa11y found"
npm list lighthouse --depth=0 2>/dev/null | grep lighthouse || command -v lighthouse 2>/dev/null || echo "No Lighthouse found"
# Check for accessibility linting
npm list eslint-plugin-jsx-a11y --depth=0 2>/dev/null | grep jsx-a11y || grep -q "jsx-a11y" .eslintrc* 2>/dev/null || echo "No JSX a11y linting found"
# Check screen reader testing environment
if [[ "$OSTYPE" == "darwin"* ]]; then
defaults read com.apple.speech.voice.prefs SelectedVoiceName 2>/dev/null && echo "VoiceOver available" || echo "VoiceOver not configured"
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\NV Access\NVDA" 2>/dev/null && echo "NVDA detected" || echo "NVDA not found"
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Freedom Scientific\JAWS" 2>/dev/null && echo "JAWS detected" || echo "JAWS not found"
else
command -v orca 2>/dev/null && echo "Orca available" || echo "Orca not found"
fi
# Framework-specific accessibility libraries
npm list @reach/ui @headlessui/react react-aria --depth=0 2>/dev/null | grep -E "(@reach|@headlessui|react-aria)" || echo "No accessible UI libraries found"
npm list vue-a11y-utils vue-focus-trap --depth=0 2>/dev/null | grep -E "(vue-a11y|vue-focus)" || echo "No Vue accessibility utilities found"
npm list @angular/cdk --depth=0 2>/dev/null | grep "@angular/cdk" || echo "No Angular CDK a11y found"
应用策略
- 确定无障碍问题类别和 WCAG 级别
- 检查常见的反模式和违规情况
- 逐步应用修复(最低限度 → 更好 → 完整)
- 使用自动化工具和手动测试进行验证
代码审查清单
审查无障碍代码时,请重点关注以下方面:
WCAG 合规性与标准
- 图片具有有意义的替代文本,或为装饰性图片设置空的 alt="" 属性
- 表单控件通过
<label>、aria-label或aria-labelledby关联标签 - 页面具有正确的标题层级(H1 → H2 → H3,不跳级)
- 颜色不是传达信息的唯一方式
- 文本放大至 200% 时,不会出现水平滚动或功能缺失
WAI-ARIA 实现
- ARIA 角色使用得当(避免覆盖语义化 HTML)
- 可折叠内容展开或收起时,动态更新
aria-expanded -
aria-describedby和aria-labelledby引用现有元素 ID - 动态内容播报使用实时区域(
aria-live) - 交互元素具有正确的 ARIA 状态(选中、已选择、已禁用)
键盘导航与焦点管理
- 所有交互元素均可通过键盘访问(Tab、Enter、Space、箭头键)
- Tab 顺序遵循合理的视觉流程,不会意外跳转
- 焦点指示器清晰可见,且具有足够的对比度(最低 3:1)
- 模态对话框会将焦点限制在其中,并在关闭时将焦点返回触发元素
- 提供跳过链接,方便导航至主要内容
屏幕阅读器优化
- 适当使用语义化 HTML 元素(nav、main、aside、article)
- 表格具有正确的表头(
<th>),复杂数据还应使用 scope 属性 - 链接具有描述性文本(避免使用“点击此处”“阅读更多”)
- 页面结构使用地标,方便导航
- 禁用 CSS 时,内容顺序仍然合理
视觉与感官无障碍
- 颜色对比度符合 WCAG 标准(普通文本为 4.5:1,大号文本为 3:1,UI 组件为 3:1)
- 文本使用相对单位(rem、em),以便缩放
- 避免媒体自动播放,或提供用户控制选项
- 动画遵循用户的
prefers-reduced-motion偏好设置 - 在 320px 视口宽度和 200% 缩放下,内容能够正确重排
表单无障碍
- 错误消息通过
aria-describedby与表单字段关联 - 使用
required或aria-required以编程方式标明必填字段 - 提交表单后提供确认或错误反馈
- 使用
<fieldset>和<legend>对相关表单字段进行分组 - 向屏幕阅读器播报表单验证消息
测试与验证
- 集成自动化无障碍测试(axe-core、Pa11y、Lighthouse)
- 已进行手动键盘导航测试
- 已使用 NVDA、VoiceOver 或 JAWS 进行屏幕阅读器测试
- 已验证高对比度模式兼容性
- 已通过触控和语音导航测试移动端无障碍功能
问题处理指南
WCAG 合规性违规
常见问题:
- 颜色对比度低于 4.5:1(AA)或 7:1(AAA)
- 图片缺少替代文本
- 文本无法放大至 200% 而不出现水平滚动
- 表单控件缺少恰当的标签或说明
- 页面缺少恰当的标题结构(H1-H6)
诊断:
# Check for images without alt text
grep -r "<img" --include="*.html" --include="*.jsx" --include="*.tsx" --include="*.vue" src/ | grep -v 'alt=' | head -10
# Find form inputs without labels
grep -r "<input\|<textarea\|<select" --include="*.html" --include="*.jsx" --include="*.tsx" src/ | grep -v 'aria-label\|aria-labelledby' | grep -v '<label' | head -5
# Check heading structure
grep -r "<h[1-6]" --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -10
# Look for color-only information
grep -r "color:" --include="*.css" --include="*.scss" --include="*.module.css" src/ | grep -E "(red|green|#[0-9a-f]{3,6})" | head -5
优先修复项:
- 最低限度:为图片添加替代文本,将标签与表单控件关联起来,修复明显的对比度问题
- 更完善:实现恰当的标题层级,在语义化 HTML 不足以表达时添加 ARIA 标签
- 完整方案:全面审查 WCAG AA 合规性并进行自动化测试,采用包含无障碍配色方案的设计系统
验证:
# Run axe-core if available
if command -v lighthouse &> /dev/null; then
lighthouse http://localhost:3000 --only-categories=accessibility --output=json --quiet
fi
# Run Pa11y if available
if command -v pa11y &> /dev/null; then
pa11y http://localhost:3000 --reporter cli
fi
资源:
- https://www.w3.org/WAI/WCAG21/quickref/
- https://webaim.org/articles/contrast/
- https://www.w3.org/WAI/tutorials/
WAI-ARIA 实现错误
常见问题:
- 在错误的元素上使用了不正确的 ARIA 角色
- 动态内容未更新 aria-expanded
- aria-describedby 引用了不存在的 ID
- 动态内容更新缺少实时区域
- ARIA 属性覆盖了语义化 HTML 的含义
诊断:
# Find ARIA roles on inappropriate elements
grep -r 'role=' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | grep -E 'role="(button|link)"' | grep -v '<button\|<a' | head -5
# Check for static aria-expanded values
grep -r 'aria-expanded=' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | grep -v 'useState\|state\.' | head -5
# Find broken ARIA references
grep -r 'aria-describedby\|aria-labelledby' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -10
# Look for missing live regions
grep -r 'innerHTML\|textContent' --include="*.js" --include="*.jsx" --include="*.tsx" src/ | grep -v 'aria-live\|role=".*"' | head -5
优先修复项:
- 最低限度:修正角色不匹配问题,确保引用的 ID 均存在,添加基本的实时区域
- 更完善:为 ARIA 属性实现恰当的状态管理,优先使用语义化 HTML,再使用 ARIA
- 完整方案:创建可复用的无障碍组件模式,实现全面的 ARIA 模式库
验证: 使用屏幕阅读器进行测试(NVDA 使用率为 65.6%,JAWS 使用率为 60.5%,移动设备使用 VoiceOver),确认播报内容符合预期。
资源:
- https://w3c.github.io/aria-practices/
- https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA
- https://webaim.org/techniques/aria/
键盘导航问题
常见问题:
- 交互元素无法通过键盘访问
- Tab 顺序与视觉布局不符
- 焦点指示器不可见或对比度不足
- 模态框或复杂控件中出现键盘陷阱
- 自定义快捷键与屏幕阅读器冲突
诊断:
# Find interactive elements without keyboard support
grep -r 'onClick\|onPress' --include="*.jsx" --include="*.tsx" --include="*.vue" src/ | grep '<div\|<span' | grep -v 'onKeyDown\|onKeyPress' | head -10
# Check for custom tab index usage
grep -r 'tabindex\|tabIndex' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -10
# Look for focus management in modals
grep -r 'focus()' --include="*.js" --include="*.jsx" --include="*.tsx" src/ | head -5
# Find elements that might need focus indicators
grep -r ':focus' --include="*.css" --include="*.scss" --include="*.module.css" src/ | head -10
优先修复项:
- 最低限度:为可点击元素添加键盘事件处理程序,确保焦点指示器清晰可见
- 更完善:按照逻辑顺序实现恰当的 Tab 顺序,为 SPA 和模态框添加焦点管理
- 完整方案:创建焦点陷阱工具,实现全面的键盘快捷键并提供退出方式
验证:
echo "Manual test: Navigate the interface using only the Tab key and arrow keys"
echo "Verify all interactive elements are reachable and have visible focus indicators"
资源:
- https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html
- https://webaim.org/techniques/keyboard/
- https://www.w3.org/WAI/WCAG21/Understanding/focus-visible.html
屏幕阅读器优化(2025 年更新)
常见问题:
- 标题结构顺序错误(H1→H2→H3 层级违规)
- 缺少语义地标(nav、main、complementary)
- 表格缺少恰当的表头或 scope 属性
- 链接用途不明确(“点击此处”“阅读更多”)
- 动态内容变化未播报
屏幕阅读器使用情况统计(2024 年 WebAIM 调查):
- NVDA:65.6%(最受欢迎,Windows)
- JAWS:60.5%(专业环境,Windows)
- VoiceOver:macOS/iOS 用户的首选
诊断:
# Check heading hierarchy
grep -r -o '<h[1-6][^>]*>' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | sort | head -20
# Find missing landmarks
grep -r '<nav\|<main\|<aside\|role="navigation\|role="main\|role="complementary"' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | wc -l
# Check table accessibility
grep -r '<table' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -5
grep -r '<th\|scope=' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -5
# Find vague link text
grep -r '>.*<' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | grep -E 'click here|read more|learn more|here|more' | head -10
优先修复项:
- 最低限度:修正标题顺序,添加基本地标,改进链接文本
- 更完善:添加表格表头和 scope,实现语义化 HTML 结构
- 完整方案:创建包含恰当文档大纲的完整页面结构,实现动态内容播报
测试优先级(2025 年):
- NVDA(Windows)——免费、最常用,支持全面测试
- VoiceOver(macOS/iOS)——内置工具,对移动设备测试至关重要
- JAWS(Windows)——适用于专业环境,功能高级
资源:
- https://webaim.org/articles/nvda/
- https://webaim.org/articles/voiceover/
- https://webaim.org/articles/jaws/
视觉与感官无障碍
常见问题:
- 颜色对比度不足(普通文本低于 4.5:1,大号文本低于 3:1)
- 不必要地使用文本图片
- 媒体自动播放,且用户无法控制
- 动效/动画引发前庭障碍
- 内容无法适配 320px 宽度或 200% 缩放
诊断:
# Check for fixed font sizes
grep -r 'font-size.*px' --include="*.css" --include="*.scss" --include="*.module.css" src/ | head -10
# Find images of text
grep -r '<img.*\.png\|\.jpg\|\.jpeg' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -10
# Look for auto-playing media
grep -r 'autoplay\|autoPlay' --include="*.html" --include="*.jsx" --include="*.tsx" src/
# Check for motion preferences
grep -r 'prefers-reduced-motion' --include="*.css" --include="*.scss" src/ || echo "No reduced motion support found"
# Find fixed positioning that might cause zoom issues
grep -r 'position:.*fixed\|position:.*absolute' --include="*.css" --include="*.scss" src/ | head -5
优先修复项:
- 最低限度:使用相对单位(rem/em),为文本图片添加替代文本,移除自动播放
- 更完善:采用高对比度配色方案,支持用户的动效偏好设置
- 完整方案:全面审查响应式设计,实施自适应配色方案
验证:
# Test color contrast (if tools available)
if command -v lighthouse &> /dev/null; then
echo "Run Lighthouse accessibility audit for color contrast analysis"
fi
# Manual validation steps
echo "Test at 200% browser zoom - verify no horizontal scroll"
echo "Test at 320px viewport width - verify content reflows"
echo "Disable CSS and verify content order makes sense"
资源:
- https://webaim.org/resources/contrastchecker/
- https://www.w3.org/WAI/WCAG21/Understanding/reflow.html
- https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions.html
表单无障碍
常见问题:
- 错误消息未与表单字段关联
- 未以编程方式标示必填字段
- 表单提交后没有确认信息
- 分组字段缺少 fieldset 图例
- 表单验证仅通过视觉呈现,不支持屏幕阅读器
诊断:
# Find forms without proper structure
grep -r '<form\|<input\|<textarea\|<select' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -10
# Check for error handling
grep -r 'error\|Error' --include="*.js" --include="*.jsx" --include="*.tsx" src/ | grep -v 'console\|throw' | head -10
# Look for required field indicators
grep -r 'required\|aria-required' --include="*.html" --include="*.jsx" --include="*.tsx" src/ | head -5
# Find fieldsets and legends
grep -r '<fieldset\|<legend' --include="*.html" --include="*.jsx" --include="*.tsx" src/ || echo "No fieldsets found"
优先修复项:
- 最低限度:将标签与输入框关联,添加必填标记,将错误信息与字段关联
- 更完善:使用 fieldset/legend 对相关字段分组,并提供清晰的说明
- 完整方案:实施全面的表单验证,使用实时区域,并提供成功确认信息
资源:
- https://webaim.org/techniques/forms/
- https://www.w3.org/WAI/tutorials/forms/
- https://www.w3.org/WAI/WCAG21/Understanding/error-identification.html
测试与自动化(2025 年更新)
自动化工具对比:
- Axe-core:最全面;与 Pa11y 结合使用时,问题覆盖率约为 35%
- Pa11y:最适合追求 CI/CD 速度的场景,提供二元的通过/失败结果
- Lighthouse:适合初步评估,可关联性能指标
集成策略:
# Set up Pa11y for fast CI feedback
npm install --save-dev pa11y pa11y-ci
# Configure axe-core for comprehensive testing
npm install --save-dev @axe-core/playwright axe-core
# Example CI integration
echo "# Add to package.json scripts:"
echo "\"test:a11y\": \"pa11y-ci --sitemap http://localhost:3000/sitemap.xml\""
echo "\"test:a11y-full\": \"playwright test tests/accessibility.spec.js\""
手动测试配置:
# Install screen readers
echo "Windows: Download NVDA from https://www.nvaccess.org/download/"
echo "macOS: Enable VoiceOver with Cmd+F5"
echo "Linux: Install Orca with package manager"
# Testing checklist
echo "1. Navigate with Tab key only"
echo "2. Test with screen reader enabled"
echo "3. Verify at 200% zoom"
echo "4. Check in high contrast mode"
echo "5. Test form submission and error handling"
资源:
运行时注意事项
- 屏幕阅读器性能:与 ARIA 相比,语义化 HTML 可降低计算开销
- 焦点管理:高效的焦点陷阱模式可避免性能问题
- ARIA 更新:批量更新动态 ARIA 内容,避免公告信息过多
- 加载状态:提供无障碍加载指示器,避免公告信息过多
安全指南
- 添加 ARIA 属性前,先使用语义化 HTML
- 使用真实的辅助技术进行测试,而不只依赖自动化工具
- 移除焦点指示器时,务必提供替代方案
- 确保所有功能都可通过键盘使用
- 提供多种信息获取方式(视觉、听觉、触觉)
- 尽可能邀请残障用户参与测试
应避免的反模式
- 过度使用 ARIA:“没有 ARIA 好过糟糕的 ARIA”——优先使用语义化 HTML
- Div 按钮综合征:使用
<div onClick>而非<button> - 仅用颜色传递信息:只依靠颜色表达含义
- 无法退出的焦点陷阱:实现键盘陷阱,却不支持 Escape 键
- 媒体自动播放:未经用户同意就开始播放音频/视频
- 无障碍覆盖层:第三方无障碍小组件往往会造成更多问题
- 只使用工具测试:自动化工具只能发现约 35% 的问题,因此手动测试必不可少
紧急无障碍修复
对于需要立即解决的关键无障碍问题:
- 添加跳过链接:
<a href="#main" class="skip-link">Skip to main content</a> - 添加基本 ARIA 标签:为未标注的按钮/链接添加
aria-label - 添加焦点指示器:添加
button:focus { outline: 2px solid blue; } - 添加表单标签:为每个输入框关联一个标签元素
- 添加替代文本:为所有信息性图像添加描述性 alt 属性
- 添加实时区域:为状态消息添加
<div aria-live="polite" id="status"></div>
这些修复可立即改善无障碍体验,同时为规划全面解决方案争取时间。
评论
支持 Markdown