关于 capacitor-accessibility
用于改善 Capacitor 应用无障碍体验的技能,面向审查 iOS 和 Android WebView 界面的团队。除 HTML 和 ARIA 实践外,也检查原生层行为、屏幕阅读器、文字缩放、焦点和触控区域。
主要功能
- 01逐屏开展无障碍审查
- 02使用 axe 检查并在设备上验证
- 03VoiceOver 与 TalkBack 指引
- 04Dynamic Type 与 Android 字体缩放
- 05检查 WebView 和原生视图无障碍
适用场景
- 01准备 Capacitor 应用无障碍评审
- 02排查屏幕阅读器未播报的问题
- 03验证系统大字号下的布局
- 04为难以访问的原生视图提供替代内容
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ cap-go/ capgo-skills --skill capacitor-accessibility安装后在 Claude Code 中输入/capacitor-accessibility确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonreferences/native.mdtesting.md详细介绍
Capacitor 应用中的无障碍功能
UI 是 WKWebView / Android WebView 中的 Web 内容,因此标准语义化 HTML 和 ARIA 就能解决大部分问题。本技能介绍 WebView 和原生层的行为与浏览器不同之处。
适用场景
在以下情况触发:
- 用户要求支持 VoiceOver/TalkBack、进行无障碍审计,或符合 WCAG 2.2 / EAA / ADA。
- iOS「更大字体」设置无法放大文本,或 Android 大字体导致布局错乱。
- 屏幕阅读器无法播报页面变化、Toast 或加载状态。
- 屏幕阅读器无法访问原生视图(地图、相机预览、视频播放器)。
- 用户需要
@capacitor/screen-reader或@capacitor/text-zoom。
请勿用于:
- Ionic 组件 API/主题 ->
ionic-design;Konsta/Tailwind ->konsta-ui、tailwind-capacitor。 - 刘海屏/主屏幕指示条下方的内容 ->
safe-area-handling。 - 键盘遮挡输入框 ->
capacitor-keyboard。 - E2E 测试基础设施 ->
capacitor-testing。
流程
- 盘点屏幕并列出待办清单(身份验证、主标签页、表单、模态框、媒体、设置)。逐一审计。
- 在 Web 构建版本上进行自动化检查:运行 axe(在测试中使用
@axe-core/playwright,或运行npx @axe-core/cli@latest http://localhost:5173),并优先修复违规项(名称、角色、对比度、标签)。 - 对每个屏幕进行设备检查:使用 VoiceOver 和 TalkBack、最大字号、「减少动态效果」以及蓝牙键盘(iPad)。参阅
references/testing.md中的检查项。 - 修复以下 Capacitor 特有的陷阱。
- 按屏幕报告发现的问题,注明 WCAG 条款、严重程度和修复方法。进行大型重构前,请先询问;更改设计令牌(颜色、字号)前也请先询问。
Capacitor 专属陷阱
- 默认情况下会忽略 iOS 动态字体。 无论“设置 > 辅助功能 > 更大字体”中的设置如何,WKWebView 都会以固定大小渲染
px/rem文本。可选方案:- CSS:使用
html { font: -apple-system-body; },其他所有内容都用rem/em设置大小(WebKit 会将其映射为用户的内容大小类别,并实时更新)。 - 或者在启动时和
resume时,从@capacitor/text-zoom调用TextZoom.getPreferred(),然后调用TextZoom.set({ value })。在 iPad 上,这需要在capacitor.config.*中设置ios.preferredContentMode: 'mobile'。 选择其中一种,不要同时使用,否则文本会缩放两次。
- CSS:使用
- Android 字体缩放会自动生效。 Android WebView 会随系统字体大小缩放文本,因此固定高度的容器、
line-clamp和绝对定位布局在 200% 缩放时会溢出。使用adb shell settings put system font_scale 2.0测试,并针对内容重排进行设计(WCAG 1.4.4、1.4.10)。 - 捏合缩放。
zoomEnabled默认为false,许多模板还会附带user-scalable=no。用户仍可通过陷阱 1/2 缩放文本;如果依赖缩放功能,请设置zoomEnabled: true并移除user-scalable=no。 - SPA 导航不会自动播报。 路由变化不会触发页面加载播报。导航后设置
document.title,将焦点移至主标题(<h1 tabindex="-1">),或更新礼貌型实时区域。不要将ScreenReader.speak用作主要机制:它仅在屏幕阅读器启用时才会播报,并会绕过用户的详细程度设置。 - WebView 下方或上方的原生视图。
@capacitor/google-maps会在透明的 WebView 区域后方渲染原生地图;摄像头预览插件也采用相同方式。屏幕阅读器看到的是 WebView,而非原生视图。请在 HTML 中提供无障碍替代内容(标记列表、文字摘要、带标签的拍摄按钮)。 - 原生插件 UI。 官方插件中的对话框、操作表、分享表和选择器默认具备无障碍支持;你自己的插件中的自定义原生屏幕需要设置
accessibilityLabel/contentDescription(参见references/native.md)。 - 触控目标。 Apple HIG 最小尺寸为 44x44 pt;Material 为 48x48 dp;WCAG 2.2 2.5.8 最小尺寸为 24x24 CSS px。图标按钮需要添加内边距,而不只是放一个小型 SVG。
- 动态效果和对比度。 两种 WebView 都支持
prefers-reduced-motion和prefers-contrast媒体查询。启用减少动态效果时,禁用视差效果和自动播放的过渡;测试“提高对比度”。 - 状态变化。 对于 Toast(
@capacitor/toast为原生 Toast,且会播报)、内联错误和加载指示器:网页 Toast 使用role="status"/aria-live="polite",加载区域使用aria-busy;仅在错误时使用role="alert"。 - 原生界面往返后的焦点。 原生模态界面(摄像头、分享、身份验证浏览器)关闭后,焦点可能会落在
<body>上。在appStateChange/Promise 解析时,将焦点恢复到触发控件。
验证
- axe:每个经过审计的路由上,严重和高危违规项均为零。
- VoiceOver(iOS)和 TalkBack(Android):每个控件都有可朗读的名称、角色和状态;滑动顺序与视觉顺序一致;路由变化会播报,或焦点移至标题。
- 最大字体:运行
xcrun simctl ui booted content_size accessibility-extra-extra-extra-large和adb shell settings put system font_scale 2.0;不得有文字裁切或重叠,正文不得出现水平滚动。 - Grep:运行
grep -rnE "user-scalable=no|maximum-scale=1" index.html src/和grep -rn "outline: *none\|outline: *0" src/(每处都必须有对应的:focus-visible替代样式)。 - 测试后重置:运行
adb shell settings put system font_scale 1.0、xcrun simctl ui booted content_size large。
错误处理
| 症状 / 消息 | 修复方法 |
|---|---|
在 Web 上,ScreenReader.isEnabled 被拒绝 / 不可用 | Web 不支持此功能(无法检测屏幕阅读器);请使用 Capacitor.isNativePlatform() 进行判断。 |
在 Web 上,speak 抛出异常 | 浏览器不支持 SpeechSynthesis;仅在原生平台上调用,或通过 'speechSynthesis' in window 检测功能是否可用。 |
"TextZoom" plugin is not implemented on web | text-zoom 仅支持原生平台;请在 Web 上跳过。 |
| iPad 上的文本缩放不起作用 | 设置 ios.preferredContentMode: 'mobile'。 |
| iOS 上的文本缩放了两次 | 同时使用了 -apple-system-body 和 TextZoom;保留其中一种。 |
| VoiceOver 读出“button”,但没有名称 | 仅包含图标的控件缺少 aria-label 或可见文本。 |
参考资料
仅在涉及相关主题时加载:
references/testing.md:VoiceOver / TalkBack 手势、Accessibility Inspector、Android Accessibility Scanner、adb/simctl 设置命令、Playwright 中的 axe、逐屏检查清单。references/native.md:用于自定义原生插件视图的 Swift / Kotlin 无障碍 API、从原生代码发布播报。
评论
支持 Markdown