Refactoring UI - Adam Wathan & Steve Schoger

从开发者视角讲解 UI 设计技巧,通过大量实例展示如何将普通界面改造成专业美观的设计。两位作者分别从开发和设计的角度,分享了实用的设计技巧、排版原则、颜色搭配和布局方法,帮助开发者提升 UI 设计能力。
关于作者
Adam Wathan 是开发者兼设计师:
- Tailwind CSS 创作者:流行的实用优先 CSS 框架
- 全栈开发者:擅长 Web 开发和设计
- 技术教育者:通过教程和书籍帮助开发者提升设计能力
Steve Schoger 是 UI 设计师:
- 产品设计师:专注于 Web 和移动应用界面设计
- 设计教育者:致力于帮助开发者提升设计技能
- 内容创作者:在社交媒体分享设计技巧和案例
两位作者的合作结合了开发和设计的视角,让这本书成为开发者学习 UI 设计的最佳入门书籍之一。
核心内容
1. 设计原则
核心设计理念:
1. 信噪比 (Signal-to-Noise Ratio)
- 最大化有用信息的视觉权重
- 减少装饰性元素
- 删除不必要的分割线和背景
2. 视觉层次 (Visual Hierarchy)
- 重要内容更突出
- 使用大小、颜色、间距创建层次
- 让用户一眼看到重点
3. 一致性 (Consistency)
- 相同元素使用相同样式
- 建立可复用的设计模式
- 减少用户的认知负担
4. 亲密性 (Proximity)
- 相关内容放在一起
- 使用间距表示关系
- 分组清晰的元素更易理解
2. 排版技巧
/* 字体大小阶梯 */
/* 使用固定的比例创建层次 */
.text-xs { font-size: 0.75rem; } /* 12px */
.text-sm { font-size: 0.875rem; } /* 14px */
.text-base { font-size: 1rem; } /* 16px */
.text-lg { font-size: 1.125rem; } /* 18px */
.text-xl { font-size: 1.25rem; } /* 20px */
.text-2xl { font-size: 1.5rem; } /* 24px */
.text-3xl { font-size: 1.875rem; } /* 30px */
.text-4xl { font-size: 2.25rem; } /* 36px */
/* 字重对比 */
.font-normal { font-weight: 400; }
.font-medium { font-weight: 500; }
.font-semibold { font-weight: 600; }
.font-bold { font-weight: 700; }
/* 行高建议 */
/* 正文:1.5-1.75 */
/* 标题:1.1-1.3 */
.leading-normal { line-height: 1.5; }
.leading-tight { line-height: 1.25; }
/* 设计技巧 */
/* 1. 限制字体数量(1-2 种) */
/* 2. 使用字重而非字体创建对比 */
/* 3. 确保足够的行高 */
/* 4. 控制每行字符数(45-75 个英文字符 ) */
3. 颜色使用
/* 60-30-10 法则 */
/* 60% 主色(通常是中性色) */
/* 30% 次要色 */
/* 10% 强调色 */
:root {
/* 中性色(用于背景、边框、次要文本) */
--gray-50: #f9fafb;
--gray-100: #f3f4f6;
--gray-200: #e5e7eb;
--gray-300: #d1d5db;
--gray-400: #9ca3af;
--gray-500: #6b7280;
--gray-600: #4b5563;
--gray-700: #374151;
--gray-800: #1f2937;
--gray-900: #111827;
/* 强调色(用于主要操作、链接) */
--primary-500: #3b82f6;
--primary-600: #2563eb;
--primary-700: #1d4ed8;
/* 语义色 */
--success: #10b981;
--warning: #f59e0b;
--danger: #ef4444;
}
/* 文本颜色层次 */
.text-primary { color: var(--gray-900); } /* 标题 */
.text-secondary { color: var(--gray-600); } /* 正文 */
.text-tertiary { color: var(--gray-400); } /* 次要信息 */
/* 设计技巧 */
/* 1. 避免纯黑(#000),使用深灰 */
/* 2. 降低饱和度创建高级感 */
/* 3. 确保足够的对比度(WCAG AA 标准) */
/* 4. 不要仅用颜色传达信息 */
4. 间距系统
/* 4px 基准网格 */
/* 所有间距使用 4 的倍数 */
.space-1 { spacing: 0.25rem; } /* 4px */
.space-2 { spacing: 0.5rem; } /* 8px */
.space-3 { spacing: 0.75rem; } /* 12px */
.space-4 { spacing: 1rem; } /* 16px */
.space-5 { spacing: 1.25rem; } /* 20px */
.space-6 { spacing: 1.5rem; } /* 24px */
.space-8 { spacing: 2rem; } /* 32px */
.space-10 { spacing: 2.5rem; } /* 40px */
.space-12 { spacing: 3rem; } /* 48px */
.space-16 { spacing: 4rem; } /* 64px */
/* 亲密性原则 */
/* 相关内容间距小,无关内容间距大 */
.card {
padding: 1.5rem; /* 卡片内边距 */
}
.card-title + .card-description {
margin-top: 0.5rem; /* 标题和描述关系紧密 */
}
.card + .card {
margin-top: 2rem; /* 卡片之间距离较大 */
}
/* 设计技巧 */
/* 1. 使用一致的间距系统 */
/* 2. 用间距而非分割线分组 */
/* 3. 内边距创造呼吸感 */
/* 4. 外边距定义关系 */
5. 组件设计
<!-- 按钮设计 -->
<!-- 使用层级而非类型区分 -->
<!-- 主要按钮 -->
<button class="px-4 py-2 bg-blue-600 text-white font-medium rounded-lg
hover:bg-blue-700 focus:ring-2 focus:ring-blue-500
focus:ring-offset-2 transition-colors">
立即开始
</button>
<!-- 次要按钮 -->
<button class="px-4 py-2 bg-white text-gray-700 font-medium rounded-lg
border border-gray-300 hover:bg-gray-50
focus:ring-2 focus:ring-blue-500 focus:ring-offset-2
transition-colors">
了解更多
</button>
<!-- 危险按钮 -->
<button class="px-4 py-2 bg-red-600 text-white font-medium rounded-lg
hover:bg-red-700 focus:ring-2 focus:ring-red-500
focus:ring-offset-2 transition-colors">
删除账户
</button>
<!-- 卡片设计 -->
<div class="bg-white rounded-xl shadow-sm border border-gray-200 p-6">
<h3 class="text-lg font-semibold text-gray-900 mb-2">
卡片标题
</h3>
<p class="text-gray-600 mb-4">
卡片描述内容,保持简洁明了。
</p>
<div class="flex items-center justify-between">
<span class="text-sm text-gray-500">更新时间:2 小时前</span>
<a href="#" class="text-sm font-medium text-blue-600 hover:text-blue-700">
查看详情 →
</a>
</div>
</div>
<!-- 表单设计 -->
<div class="space-y-4">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
邮箱地址
</label>
<input
type="email"
class="w-full px-3 py-2 border border-gray-300 rounded-lg
focus:ring-2 focus:ring-blue-500 focus:border-blue-500
transition-colors"
placeholder="you@example.com"
>
<p class="mt-1 text-sm text-gray-500">
我们不会与任何人分享您的邮箱。
</p>
</div>
<!-- 错误状态 -->
<div>
<label class="block text-sm font-medium text-gray-700 mb-1">
密码
</label>
<input
type="password"
class="w-full px-3 py-2 border border-red-300 rounded-lg
focus:ring-2 focus:ring-red-500 focus:border-red-500
transition-colors"
aria-invalid="true"
aria-describedby="password-error"
>
<p id="password-error" class="mt-1 text-sm text-red-600">
密码必须至少 8 个字符。
</p>
</div>
</div>
6. 前后对比案例
改进前 → 改进后
1. 信息卡片
❌ 问题:
- 使用分割线分组
- 颜色过多过饱和
- 间距不一致
- 图标颜色杂乱
✅ 改进:
- 用间距和卡片背景分组
- 使用中性色 + 单一强调色
- 统一间距系统
- 简化图标样式
2. 数据表格
❌ 问题:
- 所有边框可见
- 行间距太小
- 没有视觉层次
- 数字未右对齐
✅ 改进:
- 只保留横向分割线
- 增加行高和内边距
- 表头使用不同背景
- 数字右对齐,文本左对齐
3. 导航栏
❌ 问题:
- 渐变背景过时
- 过多分割线
- 阴影太重
- 链接样式不统一
✅ 改进:
- 纯色背景更现代
- 用间距代替分割
- 轻量阴影或无阴影
- 统一的悬停状态
7. 设计检查清单
视觉设计检查清单:
□ 排版
□ 字体数量 ≤ 2 种
□ 有清晰的字号层次
□ 行高适合阅读
□ 文本对比度足够
□ 颜色
□ 主色、强调色明确
□ 中性色使用得当
□ 没有过饱和的颜色
□ 状态色(成功/警告/错误)清晰
□ 间距
□ 使用一致的间距系统
□ 相关内容间距小
□ 无关内容间距大
□ 有足够的留白
□ 对齐
□ 元素 对齐清晰
□ 文本对齐一致
□ 数字右对齐(表格中)
□ 一致性
□ 相同组件样式一致
□ 交互状态统一
□ 图标风格一致
□ 响应式
□ 移动端可读
□ 触控目标足够大(≥44px)
□ 断点设置合理
经典摘录
好的设计不是关于添加更多,而是关于移除不必要的。
开发者不是天生的设计师,但设计是可以学习的技能。
信噪比是判断设计好坏的最重要标准。
间距是设计中最强大的工具。好的间距让设计看起来专业。
不要使用分割线来分组,用间距。
读书心得
《Refactoring UI》是一本专门为开发者编写的设计书籍。与其他设计书籍不同,它不是讲抽象的设计理论,而是提供具体、实用的技巧。
书中对我帮助最大的是信噪比的概念。很多时候,我们为了让界面"更好看"而添加各种装饰元素,但实际上这些元素往往增加了噪音,降低了信息的传达效率。好的设计应该最大化有用信息的视觉权重。
间距系统的学习让我受益匪浅。使用一致的间距系统(如 4px 基准),不仅让设计更整洁,也让开发更高效。用间距而非分割线来分组,这个简单的技巧就能显著提升界面的现代感。
前后对比案例是最有价值的部分。通过具体的"改进前→改进后"示例,我能清楚地看到每个设计决策的影响。这种学习方式非常直观,也容易应用到实际工作中。
对于需要设计界面的前端开发者来说,这本书是必读之作。它能帮助你:
- 建立基本的设计审美
- 掌握实用的设计技巧
- 理解设计与开发的关系
- 提升整体产品质量
配合 Tailwind CSS 使用,效果更佳。书中的很多理念与 Tailwind 的设计哲学一致。