产品与设计
构建或修改 UI 时保证可访问性:对比度、键盘、焦点与状态
当任务涉及构建或编辑 UI 时,用可执行规则确保界面对不同视力、操作方式和设备的用户都可用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
构建或修改 UI 时保证可访问性:对比度通用
解决思路
- 加载本技能时与 antislop.md 核心一起使用:核心提供机制(目的测试、三个层级、Delivery Gate),本技能提供人类侧深度(对比度、键盘、焦点、状态、移动端细节)。
- 每条规则都按 Tell(模式)、Why(排除了谁、为何显得未完成)、Fix(应怎么做)三段式执行,并引用核心规则编号 R-XX。
- 把可访问性当作核心承诺的一部分(UI 要经得起考验,C-4),而不是最后附加的检查清单;在核心 Delivery Gate 之外,同时运行本文件末尾的 Human Skill Checklist。
- 对任何无法用肉眼确认的颜色配对,使用本技能自带的对比度检查器(公式 + 参考表 + 脚本)。
- 低对比度文本:满足 WCAG AA 最低要求(R-25)——普通文本 4.5:1,大文本(18px+)3:1;计算比值,不要凭肉眼判断。
- 文字覆盖在照片或渐变上:在文字后面加 scrim 或纯色块,然后验证最差位置而非最佳位置;文字区域任何一部分不达标则整个处理不达标。
- 灰底灰字幻觉:绝不断言某配对通过 AA;运行对比度检查器或套用公式;两者都不可用时查参考表(例如 #555555 在黑色上为 2.8:1,不通过)。
- 非文本对比度:每个组件边界和状态指示器与相邻颜色达到 3:1(WCAG 1.4.11);图标搭配满足 4.5:1 的文本标签。
- 对比度检查器脚本:脚本位于本技能文件夹(contrast-check.py,与 SKILL.md 同级);macOS/Linux 用 python3,Windows 用 python;命令示例:python3 "${CLAUDE_SKILL_DIR}/contrast-check.py" "#FFFFFF" "#777777";若 ${CLAUDE_SKILL_DIR} 不可用,直接把脚本路径指向本技能文件夹;脚本缺失时不要阻塞,公式和表已足够。
- 对比度公式(WCAG 2.x):1) 对比度 = (L1 + 0.05) / (L2 + 0.05),L1 为较亮相对亮度,L2 为较暗;2) 单通道转 0-1(c = hex / 255),若 c <= 0.03928 则 c_lin = c / 12.92,否则 c_lin = ((c + 0.055) / 1.055)^2.4;3) L = 0.2126*R + 0.7152*G + 0.0722*B;4) 比值保留两位小数,普通文本 4.5:1、大文本 3:1(18px+,R-25),最大比值 21.0。
- 参考表作为 sanity check 而非替代:黑底白字 21.00 通过/通过;白底黑字 21.00 通过/通过;白字 #333333 12.63 通过/通过;白字 #666666 5.74 通过/通过;#777777 白底 4.48 不通过/通过;白字 #888888 3.54 不通过/通过;白字 #999999 2.85 不通过/不通过;#555555 黑底 2.82 不通过/不通过;未列出的或接近阈值的配对必须走公式或脚本。
- 移除焦点轮廓:禁止 outline: none 或 outline: 0 且无替代焦点样式(R-32);保留或替换为可见的 :focus-visible 样式,与相邻颜色达到 3:1。
- 仅鼠标模式:菜单不能只在 hover 打开,下拉不能只点击打开而不支持键盘打开,拖放必须有键盘替代(R-32);每个交互元素都要能通过 Tab、Enter、Space 到达和操作。
- Tab 顺序错乱:保持源码顺序与视觉顺序一致,长页面加 skip links,不要给真实内容 tabindex="-1",除非是对话框等受控焦点陷阱的一部分(R-32)。
- 焦点指示器弱或不可见:每个交互元素在每个主题下都要有可见焦点指示器,与相邻颜色 3:1(R-32、R-34);在深色和浅色模式下都检查。
- 仅用颜色反馈:每个颜色信号都搭配文本、图标或图案;错误状态文本优先,例如 "Password must be at least 8 characters",而不只是红色边框(C-4)。
- 缺失 UI 状态:每个数据视图都有空、加载、错误三种状态(R-27),且每种都可感知、有信息量:明确的空消息、带文字的加载状态、说明发生了什么及如何继续的错误状态。
- 文字无法缩放:使用随缩放重排的流式字体,文字容器不要 overflow: hidden 裁剪,在窄视口 200% 缩放下验证布局(R-35,WCAG 1.4.4)。
- 移动端键盘遮挡表单:输入框获得焦点时滚动到键盘上方可见,底部留足 padding 使聚焦字段永不被遮挡;用真机或模拟键盘测试(R-03)。
- 运行 Human Skill Checklist(与核心 Delivery Gate 一起,全部必须为 yes):1) 每个文本与背景配对(含图片和渐变上的文字)都经对比度检查器验证(R-25);2) 每个交互组件边界和状态指示器与背景达到 3:1;3) 焦点指示器可见、高对比,且在每个主题的每个交互元素上都有(R-32、R-34);4) 每个交互元素都可通过键盘到达和操作,对话框可用 Escape 关闭,没有无替代的 outline: none(R-32、R-26);5) 每个数据视图的空、加载、错误状态都存在且可感知,不是仅靠颜色(R-27、C-4);6) 文字可缩放到 200% 而不被裁剪,移动端键盘永不遮挡聚焦输入框(R-35)。
适用边界 · 注意事项
- 任务不涉及构建或编辑 UI 时,不需要加载本技能。
- 布局机制(断点、缩放、网格、溢出、点击目标)属于 antislop-layoutmobile 的范畴,本技能只保留会排除人的移动端细节:缩放和屏幕键盘。
- 对比度检查器脚本缺失时不要阻塞工作,公式和参考表本身已完整。