mcpField
F
frontend-ui-design

frontend-ui-design

github.com/pixel-process-ug设计与 UI3119 次安装33 周前更新
代码仓库

关于 frontend-ui-design

frontend-ui-design 是用于规划和实现前端界面的技能,面向前端开发者。它涵盖组件架构、响应式布局、无障碍、状态管理与性能决策。

主要功能

  1. 01选择组件架构
  2. 02规划响应式设计
  3. 03WCAG 无障碍指导
  4. 04选择状态管理方案
  5. 05性能优化检查清单
  6. 06集成设计系统

适用场景

  1. 01规划新的前端组件
  2. 02检查不同设备的响应式表现
  3. 03明确键盘和屏幕阅读器支持
  4. 04选择界面数据的状态处理方式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pixel-process-ug/superkit-agents --skill frontend-ui-design

安装后在 Claude Code 中输入/frontend-ui-design确认已加载。

详细介绍

前端 UI 设计

概述

指导前端用户界面的设计与实现,确保架构一致、无障碍、响应式且高性能。本技能涵盖组件模式、设计系统集成、状态管理方案选择和 WCAG 合规,帮助打造可测试、无障碍且高性能的组件。

开始时宣布:“我正在使用 frontend-ui-design 技能来设计 UI。”

阶段 1:需求调研

提出以下问题,了解 UI 需求:

#问题确定内容
1我们要构建什么组件或页面?范围和复杂度
2使用什么框架/库?(React、Vue、Svelte 等)代码模式
3是否已有设计系统或组件库?约束条件
4必须支持哪些设备?(手机、平板、桌面)响应式策略
5有哪些无障碍要求?(WCAG 等级)无障碍标准
6这个组件需要什么数据?状态管理方案

需求调研后停止——在设计前先总结约束条件和方案。

阶段 2:选择组件架构

架构模式决策表
模式适用场景不适用场景
原子设计从零构建组件库向现有系统添加单个组件
复合组件由多个部分组成且需要布局灵活性的组件简单的单一用途组件
Hooks 模式在不同 UI 中复用相同逻辑与某个特定组件绑定的逻辑
容器/展示组件组件需要隔离测试或多个数据源逻辑很少的简单组件
原子设计层级
层级描述示例
原子最小的构建单元,单一用途Button、Input、Label、Icon
分子组合在一起协同工作的原子SearchBar(Input + Button)、FormField(Label + Input + Error)
有机体由分子组成的复杂部分Header(Logo + Nav + SearchBar)、ProductCard
模板使用占位内容的页面布局DashboardLayout、AuthLayout
页面填充真实数据的模板HomePage、SettingsPage
复合组件示例
<Select value={selected} onChange={setSelected}>
  <Select.Trigger />
  <Select.Options>
    <Select.Option value="a">Option A</Select.Option>
    <Select.Option value="b">Option B</Select.Option>
  </Select.Options>
</Select>

适用场景:组件包含多个必须协同工作的子部分,但使用者需要灵活安排布局。

Hooks 模式示例
function useDialog() {
  const [isOpen, setIsOpen] = useState(false);
  const open = () => setIsOpen(true);
  const close = () => setIsOpen(false);
  return { isOpen, open, close };
}

适用场景:多个 UI 不同的组件需要使用相同逻辑。

架构选择后停止——继续之前,先确认所选模式。

阶段 3:响应式设计

移动优先断点
断点目标设备最小宽度
sm手机横屏640px
md平板768px
lg桌面1024px
xl大屏桌面1280px
2xl超宽桌面1536px
响应式策略决策表
需求使用不使用
布局随视口尺寸变化媒体查询容器查询
组件随父容器尺寸变化容器查询媒体查询
文本在断点之间平滑缩放clamp() 流式排版固定字号
图片适配视口srcset + sizes单张固定图片
流式排版
font-size: clamp(1rem, 0.5rem + 1.5vw, 1.5rem);

阶段 4:无障碍(WCAG 2.1 AA)

语义化 HTML 决策表
需求使用不使用
导航<nav><div class="nav">
按钮操作<button><div onClick>
页面区块<main>、<section>、<aside><div>
标题按顺序使用 <h1>-<h6><div class="heading">
项目列表<ul>、<ol>嵌套的 <div>
表单标签<label for="...">仅使用占位文本
ARIA 使用规则
规则适用时机
优先使用语义化 HTML始终如此 — ARIA 是后备方案
aria-label为没有可见文本的元素提供标签
aria-describedby将描述性文本与元素关联
aria-live播报动态内容更改
aria-expanded可切换的区域(手风琴、菜单)
role仅在没有语义化元素时使用
键盘导航要求
  • 所有交互元素都可聚焦(原生支持或使用 tabindex="0")
  • 可通过键盘操作(Enter、Space、Escape、方向键)
  • 显示可见的焦点指示器(没有替代样式时,绝不使用 outline: none)
  • Tab 顺序符合逻辑,并与视觉顺序一致
  • 为模态框和对话框设置焦点陷阱
颜色对比度要求
元素最低比例
普通文本4.5:1
大号文本(18px+ 或 14px+ 粗体)3:1
UI 组件与相邻颜色的对比度为 3:1
通过颜色传达的信息还必须使用图标、图案或文本
屏幕阅读器测试

至少使用一种屏幕阅读器进行测试:

  • macOS:VoiceOver(内置)
  • Windows:NVDA(免费)或 JAWS
  • 验证:内容按逻辑顺序播报,表单错误与输入框关联,动态更新会被播报

阶段 5:状态管理与性能

状态管理决策表
状态类型方案适用时机
本地useState、useReducer状态仅由一个组件或其直接子组件使用
共享Context、Zustand、Jotai状态由多个互不相关的组件共享
服务端TanStack Query、SWR从 API 获取数据,需要缓存或重新验证
表单React Hook Form、Formik需要验证和提交的复杂表单
URL搜索参数、路由器状态应可加入书签或分享的状态
选择启发式
  1. 从 useState 开始 — 只有遇到实际限制时才升级
  2. 如果属性逐层传递超过 2 层,考虑使用 Context 或状态库
  3. 如果要缓存 API 响应,请使用服务端状态库(不要用 Redux 管理服务端状态)
  4. 对于字段数超过 3 个且需要验证的表单,请使用表单库
性能优化清单
技术适用时机
React.lazy() + Suspense路由级代码拆分
在图像上使用 loading="lazy"首屏以下的图像
虚拟化项目数超过 50 的列表
useMemo开销较大的计算
useCallback传递给已记忆子组件的回调
动态 import()按条件加载的大型库
WebP/AVIF 图像所有图像资源
为图像明确指定 width/height防止布局偏移
设计系统集成

设计令牌 — 定义基础值,而非硬编码:

const tokens = {
  color: { primary: '#2563eb', secondary: '#64748b', error: '#dc2626' },
  spacing: { xs: '0.25rem', sm: '0.5rem', md: '1rem', lg: '1.5rem', xl: '2rem' },
  typography: { fontFamily: { sans: 'Inter, system-ui, sans-serif' } },
};

组件变体 — 保持变体 API 一致:

<Button variant="primary" size="md">Save</Button>
<Button variant="outline" size="sm">Cancel</Button>

主题支持:

  • 使用 CSS 自定义属性支持运行时主题切换
  • 至少支持浅色和深色主题
  • 默认遵循 prefers-color-scheme
  • 允许用户覆盖,并将设置存储在 localStorage 中

设计完成后停止 — 提交完整的组件规格说明以供审核。

反模式 / 常见错误

错误错误原因应采取的做法
使用 <div onClick> 而不是 <button>无法通过键盘访问,也没有屏幕阅读器语义使用语义化 HTML 元素
使用 outline: none,但不提供替代样式键盘用户看不到焦点换成可见的焦点样式
使用固定字号(px)无法根据用户偏好缩放使用 rem 和 clamp()
通过 4 层以上逐层传递 props维护起来十分困难使用 Context 或状态库
使用 useEffect + useState 获取数据没有缓存、不会去重,还可能出现竞态条件使用 TanStack Query 或 SWR
过早进行记忆化未经测量便增加了复杂性先进行性能分析,再优化测得的瓶颈
采用桌面优先的响应式设计移动端体验成了事后考虑从移动端优先开始,再逐步增加复杂性
只用颜色传达信息色盲用户无法获取信息添加图标、图案或文字标签
没有加载 / 错误状态用户会看到空白屏幕或难以理解的错误设计加载、错误和空状态

防止自我合理化

  • 不要忽略无障碍要求 —— WCAG 2.1 AA 是最低标准,不是可选项
  • 不要使用带有 onClick 的 <div>,而不使用语义化元素
  • 不要跳过键盘导航测试
  • 不要在了解实际需求之前选择状态管理方案
  • 不要跳过发现阶段 —— 先了解约束条件
  • 不要在测量之前优化性能

集成点

技能关系
api-design上游:API 响应结构决定组件的数据需求
spec-writing上游:规格定义组件的行为要求
planning下游:组件设计转化为实现任务
test-driven-development下游:组件规格驱动测试优先的实现
senior-frontend并行:提供 React/Next.js 专项知识
ui-ux-pro-max上游:UX 设计为组件需求提供依据
ui-design-system并行:设计系统令牌用于组件样式设计
performance-optimization下游:实现后进行性能分析和优化

验证关卡

在宣称 UI 设计已完成之前:

  1. 验证已明确选择组件架构模式并说明理由
  2. 验证已为所有目标断点定义响应式行为
  3. 验证已明确无障碍要求(WCAG 级别、键盘、颜色对比度)
  4. 验证已根据实际需求选择状态管理方案
  5. 验证已设计加载、错误和空状态
  6. 验证用户已批准组件规格

技能类型

灵活 — 根据项目框架和约束调整组件模式、响应式策略和状态管理,同时满足无障碍要求,并坚持先发现后设计的方法。

评论

支持 Markdown