UI はローカライズ済みです。スキルの紹介と説明文書は選択した言語へ AI が自動翻訳し、コード・コマンド・パス・専門用語は原文のままです。原作者の文書が優先されます。
スキルを探す
デザイン · SKILL.md

web-design-guidelines

web-design-guidelines

当用户需要审查 UI 代码、进行可访问性检查、设计审计或对照最佳实践检查网站时使用。此 Skill 对照 Web Interface Guidelines 和 WCAG 2.2 标准检查合规性,输出结构化的审查结果。

Independent GitHub snapshot · Automated classification · Original documentation governs

スキルの説明

GitHub

name: web-design-guidelines description: 当用户需要审查 UI 代码、进行可访问性检查、设计审计或对照最佳实践检查网站时使用。此 Skill 对照 Web Interface Guidelines 和 WCAG 2.2 标准检查合规性,输出结构化的审查结果。 argument-hint:

⚠️ 性能提示: 此 Skill 包含完整的 WCAG 2.2 检查清单。对于快速审查,可以只使用"快速检查清单";对于完整审计,使用"详细检查清单"。


Web Interface Guidelines & Accessibility Checker

概述

此 Skill 提供两种审查模式:

  1. 快速审查:基于 Vercel Web Interface Guidelines 的即时检查
  2. 完整审计:基于 WCAG 2.2 AA 标准的全面合规性检查

快速审查(Web Interface Guidelines)

工作流程

  1. 从源 URL 获取最新指南:

    https://raw.githubusercontent.com/vercel-labs/web-interface-guidelines/main/command.md
    
  2. 读取指定的文件(或提示用户提供文件/模式)

  3. 对照获取的规则检查

  4. 使用简洁的 file:line 格式输出结果

使用方式

当用户提供文件或模式参数时:

  1. 从上述 URL 获取指南
  2. 读取指定的文件
  3. 应用所有规则
  4. 按照指南中指定的格式输出结果

如果未指定文件,询问用户要审查哪些文件。


完整审计(WCAG 2.2 AA)

WCAG 2.2 新增成功准则

WCAG 2.2 在 2.1 基础上增加了 9 个新成功准则:

2.4.11 焦点外观(最小)(Focus Appearance (Minimum))- AA

要求:焦点指示符必须满足以下所有条件:

  • 对比度:至少 3:1(焦点与相邻颜色)
  • 区域:指示符面积至少等于 1 CSS 像素环的面积
  • 不被其他内容遮挡

检查点:

  • 所有交互元素(链接、按钮、输入框)有可见焦点状态
  • 焦点指示符对比度 ≥ 3:1
  • 焦点样式不会被其他内容遮挡
/* ✅ 合规的焦点样式 */
:focus {
  outline: 2px solid #005fcc;
  outline-offset: 2px;
}

/* ✅ 高对比度焦点 */
:focus {
  outline: 3px solid #000000;
  background: #ffff00;
}

2.4.12 焦点不被隐藏(Focus Not Obscured)(最小)- AA

要求:焦点指示符不能被其他内容完全遮挡

检查点:

  • 固定元素(header、nav)不会遮挡焦点
  • 模态框打开时焦点元素可见
  • 滚动时焦点元素保持在视口中

2.5.7 拖动动作(Dragging Movements)- AA

要求:所有使用拖动操作的功能都应提供单指针替代方案

检查点:

  • 滑块有 +/- 按钮替代拖动
  • 拖放列表有上/下按钮替代拖动
  • 拖动操作有清晰的视觉反馈
// ❌ 不合规:只有拖动
<SortableList items={items} />

// ✅ 合规:提供替代方案
<SortableList items={items} />
<SortableList items={items} mode="buttons" />

2.5.8 目标大小(最小)(Target Size (Minimum))- AA

要求:触摸目标至少 24x24 CSS 像素

检查点:

  • 按钮最小尺寸 24x24px
  • 移动端触摸目标 ≥ 44x44px(WCAG 2.2 AAA)
  • 目标之间有足够间距
/* ✅ 合规的触摸目标 */
button {
  min-height: 44px;
  min-width: 44px;
  padding: 12px 16px;
}

详细 WCAG 2.2 AA 检查清单

1. 可感知性(Perceivable)

1.1.1 非文本内容 - 所有文本

  • 所有图片有 alt 文本
  • 复杂图像有长描述
  • 图标按钮有 aria-label
  • 表单有可见标签
<!-- ✅ 合规 -->
<img src="chart.png" alt="2024年用户增长图表,显示同比增长25%" />

<!-- ❌ 不合规 -->
<img src="chart.png" />

1.3.1 信息和关系

  • 语义化 HTML 结构
  • 标题层级正确(h1 → h2 → h3)
  • 表单关联正确的 label
  • 列表使用 ul/ol
<!-- ✅ 合规 -->
<label for="email">邮箱地址</label>
<input type="email" id="email" name="email" />

<!-- ❌ 不合规 -->
<span>邮箱地址</span>
<input type="email" aria-label="邮箱" />

1.4.3 对比度(最小)

文本对比度要求:

  • 普通文本:4.5:1
  • 大文本(18px+ 或 14px bold):3:1
  • UI 组件和图形对象:3:1

检查工具:

  • Chrome DevTools > Lighthouse
  • WebAIM Contrast Checker -axe DevTools
/* ✅ 合规 */
.text-primary {
  color: #1a1a1a; /* 对比度 16:1 on #ffffff */
}

.text-secondary {
  color: #5c5c5c; /* 对比度 7:1 on #ffffff */
}

1.4.4 文本大小调整

  • 文本可放大至 200% 而不丢失信息
  • 使用相对单位(rem, em)而非固定单位(px)
  • 避免 text-size-adjust 限制
/* ✅ 合规 */
body {
  font-size: 1rem; /* = 16px default */
  line-height: 1.5;
}

h1 {
  font-size: 2rem; /* = 32px */
}

1.4.11 非文本对比度

UI 组件对比度要求:

  • 边框:3:1
  • 焦点指示符:3:1
  • 填充区域:3:1
/* ✅ 合规 */
.input {
  border: 1px solid #767676; /* 对比度 4.5:1 */
  background: #ffffff;
}

.input:focus {
  border-color: #005fcc; /* 对比度 4.7:1 */
}

1.4.12 文本间距

内容放大 200% 时不丢失信息:

  • 字间距 ≥ 0.12em
  • 词间距 ≥ 0.16em
  • 行高 ≥ 1.5
/* ✅ 合规 */
p {
  letter-spacing: 0.12em;
  word-spacing: 0.16em;
  line-height: 1.5;
}

1.4.13 内容悬停(Content Hover on Hover)

  • 可悬停内容可关闭
  • 悬停可见,无需精确定位
  • 悬停状态可被用户触发

2. 可操作性(Operable)

2.1.1 键盘

所有功能可通过键盘操作:

  • 所有交互元素可通过 Tab 访问
  • 焦点顺序符合逻辑
  • 自定义组件有键盘支持

测试方法:

  1. 拔掉鼠标
  2. 只用 Tab、Enter、Space、方向键操作
  3. 确保所有功能可用
// ✅ 合规的键盘支持
<div
  role="button"
  tabIndex={0}
  onClick={handleClick}
  onKeyDown={(e) => {
    if (e.key === 'Enter' || e.key === ' ') {
      e.preventDefault();
      handleClick();
    }
  }}
>
  点击我
</div>

2.1.2 无键盘陷阱

  • Tab 键可在所有区域自由移动
  • Escape 键可关闭模态框/下拉菜单
  • 没有意外的焦点循环

2.4.1 跳过块

  • 提供"跳转到主要内容"链接
  • 跳过链接在焦点时可见
<!-- ✅ 合规 -->
<a href="#main-content" class="skip-link">
  跳转到主要内容
</a>

<main id="main-content">
  <!-- 主要内容 -->
</main>

<style>
.skip-link {
  position: absolute;
  top: -100px;
}
.skip-link:focus {
  top: 0;
}
</style>

2.4.3 焦点顺序

  • 焦点顺序符合视觉和逻辑顺序
  • DOM 顺序与视觉顺序一致
  • 使用 tabindex 调整时注意顺序

2.4.4 链接目的(语境)

  • 链接文本描述目的
  • 避免"点击这里"、"阅读更多"
  • 同页面多个链接到同一目的地时文本相同
<!-- ✅ 合规 -->
<a href="/pricing">查看定价方案</a>

<!-- ❌ 不合规 -->
<a href="/pricing">点击这里</a>

2.4.6 标题和标签

  • 标题描述主题或目的
  • 标签描述输入目的
  • 不要用占位符代替标签
<!-- ✅ 合规 -->
<label for="search">搜索产品</label>
<input type="search" id="search" placeholder="输入关键词..." />

<!-- ❌ 不合规 -->
<input type="search" placeholder="搜索产品" />

2.4.7 焦点可见

  • 焦点指示符始终可见
  • 不使用 outline: none 除非有替代方案

2.5.3 标签名称(Label in Name)

  • 可访问名称包含可视文本
  • 图标按钮有可见标签
<!-- ✅ 合规 -->
<button>
  <svg aria-hidden="true"><!-- ... --></svg>
  <span>提交</span>
</button>

<!-- ❌ 不合规 -->
<button aria-label="提交"></button>

2.5.4 动作操纵(Motion Actuation)

  • 功能不依赖特定手势
  • 提供替代操作方式

3. 可理解性(Understandable)

3.1.1 页面语言

  • HTML 有 lang 属性
  • lang 属性值正确
<!-- ✅ 合规 -->
<html lang="zh-CN">

3.2.1 焦点变化

  • 焦点变化不自动触发上下文变化
  • 用户主动触发而非自动转移
<!-- ❌ 不合规 -->
<select onchange="this.form.submit()">

<!-- ✅ 合规 -->
<select onchange="confirm('确认选择?') && this.form.submit()">

3.2.2 输入变化

  • 输入变化不自动提交
  • 用户主动触发提交

3.3.1 错误识别

  • 表单提交时识别错误
  • 错误有文本描述
  • 错误指向具体字段
<!-- ✅ 合规 -->
<label for="email">邮箱</label>
<input type="email" id="email" aria-describedby="email-error" />
<span id="email-error" role="alert">
  请输入有效的邮箱地址
</span>

<!-- ❌ 不合规 -->
<input type="email" aria-invalid="true" />

3.3.2 标签或说明

  • 有输入说明时关联到输入
  • 使用 aria-describedby
<!-- ✅ 合规 -->
<label for="username">用户名</label>
<p id="username-hint">4-20个字符,可包含字母数字下划线</p>
<input id="username" aria-describedby="username-hint" />

4. 健壮性(Robust)

4.1.1 解析

  • HTML 有效且无重复 ID
  • 使用验证工具检查

4.1.2 名称、角色、值

  • UI 组件有正确的名称、角色、值
  • 使用原生 HTML 元素而非自定义 ARIA
<!-- ✅ 合规 -->
<button>提交</button>

<!-- ❌ 不合规 -->
<div onclick="submit()">提交</div>

4.1.3 状态消息

  • 状态变化有文本通知
  • 使用 aria-live 区域
<!-- ✅ 合规 -->
<div aria-live="polite" aria-atomic="true">
  {statusMessage}
</div>

快速检查清单(日常使用)

必需项(必须通过)

  • 所有图片有 alt 文本
  • 所有表单输入有标签
  • 颜色对比度 ≥ 4.5:1
  • 键盘可访问所有功能
  • 焦点指示符可见
  • 链接文本描述目的

推荐项(强烈建议)

  • 有跳过导航链接
  • 标题层级正确
  • 错误消息有描述
  • 目标大小 ≥ 44px
  • 支持 prefers-reduced-motion

测试工具推荐

自动化工具

  • axe DevTools:浏览器扩展,实时检测可访问性问题
  • Lighthouse:Chrome DevTools 内置,生成审计报告
  • WAVE:WebAIM 开发,视觉化显示问题
  • Accessibility Insights:微软开发,深度检测

手动测试

  • 键盘测试:拔掉鼠标,只用键盘操作
  • 屏幕阅读器测试:NVDA (Windows)、VoiceOver (macOS)
  • 缩放测试:放大至 200% 检查布局

修复优先级

P0 - 立即修复

  • 关键功能键盘不可用
  • 主要内容无 alt 文本
  • 对比度严重不足
  • 表单错误无法识别

P1 - 尽快修复

  • 焦点指示符不明显
  • 链接文本不明确
  • 标题层级混乱
  • 目标大小过小

P2 - 计划修复

  • 增强色盲支持
  • 优化移动端体验
  • 添加更多说明文本
  • 优化动画体验

报告模板

# 可访问性审计报告

## 概述
- **审计日期**: YYYY-MM-DD
- **审计范围**: [页面/组件/功能]
- **符合标准**: WCAG 2.2 AA

## 发现问题

### P0 - 立即修复
| 问题 | 位置 | 影响 | 建议修复 |
|------|------|------|---------|
| ... | ... | ... | ... |

### P1 - 尽快修复
| 问题 | 位置 | 影响 | 建议修复 |
|------|------|------|---------|
| ... | ... | ... | ... |

### P2 - 计划修复
| 问题 | 位置 | 影响 | 建议修复 |
|------|------|------|---------|
| ... | ... | ... | ... |

## 通过项目
- [ ] 列表
- [ ] 通过
- [ ] 的项目

## 建议
1. ...
2. ...
3. ...

## 参考资料
- [WCAG 2.2 官方文档](https://www.w3.org/TR/WCAG22/)
- [WebAIM 对比度检查](https://webaim.org/resources/contrastchecker/)
- [axe DevTools](https://www.deque.com/axe/)

相关 Skill

  • FrontendImplementation:设计时避免可访问性问题
  • ReactBestPractices:React 组件的无障碍实现
  • Security Specialist:包含安全相关的可访问性要求
保存したスキル