7.0 KiB
7.0 KiB
shadcn UI 配色系统完整指南
概述
shadcn UI 使用基于 CSS 变量的分层配色系统,通过语义化的变量名来管理整个应用的色彩方案。系统分为亮色主题(:root)和暗色主题(.dark)两套配色。
🎨 颜色层级分类
1. 核心系统颜色 (Core System Colors)
主要交互色 (Primary Colors)
--primary: 应用主题色,用于最重要的交互元素- 亮色:
hsl(349.5238 100% 87.6471%)- 粉红色 - 暗色:
hsl(330 100.0000% 80%)- 粉红色
- 亮色:
--primary-foreground: 主要色上的文字/图标颜色- 亮色:
hsl(0 0% 0%)- 黑色 - 暗色:
hsl(0 0% 0%)- 黑色
- 亮色:
用途: 按钮、链接、选中状态、重要高亮等主要交互元素
次要交互色 (Secondary Colors)
--secondary: 次要按钮和元素背景色- 亮色:
hsl(197.4000 71.4286% 72.5490%)- 蓝色 - 暗色:
hsl(120 60.0000% 50%)- 绿色
- 亮色:
--secondary-foreground: 次要色上的文字/图标颜色- 亮色:
hsl(0 0% 0%)- 黑色 - 暗色:
hsl(0 0% 0%)- 黑色
- 亮色:
用途: 次要按钮、标签、分页器等辅助交互元素
强调色 (Accent Colors)
--accent: 悬停和强调状态- 亮色:
hsl(60 100% 50%)- 黄色 - 暗色:
hsl(197.4000 71.4286% 72.5490%)- 蓝色
- 亮色:
--accent-foreground: 强调色上的文字/图标颜色- 亮色:
hsl(0 0% 0%)- 黑色 - 暗色:
hsl(0 0% 0%)- 黑色
- 亮色:
用途: 悬停状态、选中背景、高亮区域
2. 背景和前景色 (Background & Foreground)
基础背景色
--background: 应用主背景色- 亮色:
hsl(200 23.0769% 97.4510%)- 浅蓝灰 - 暗色:
hsl(220.0000 14.7541% 11.9608%)- 深蓝灰
- 亮色:
--foreground: 主要文字颜色- 亮色:
hsl(0 0% 20%)- 深灰 - 暗色:
hsl(0 0% 89.8039%)- 浅灰
- 亮色:
卡片背景色
--card: 卡片和弹出层背景- 亮色:
hsl(0 0% 100%)- 纯白 - 暗色:
hsl(197.1429 6.9307% 19.8039%)- 深蓝灰
- 亮色:
--card-foreground: 卡片上的文字颜色- 亮色:
hsl(0 0% 20%)- 深灰 - 暗色:
hsl(0 0% 89.8039%)- 浅灰
- 亮色:
弹出层背景色
--popover: 弹出层、下拉菜单背景- 亮色:
hsl(0 0% 100%)- 纯白 - 暗色:
hsl(197.1429 6.9307% 19.8039%)- 深蓝灰
- 亮色:
--popover-foreground: 弹出层文字颜色- 亮色:
hsl(0 0% 20%)- 深灰 - 暗色:
hsl(0 0% 89.8039%)- 浅灰
- 亮色:
3. 弱化和辅助色 (Muted & Support)
弱化元素
--muted: 弱化背景色- 亮色:
hsl(50.4000 26.8817% 81.7647%)- 浅黄灰 - 暗色:
hsl(0 0% 26.6667%)- 深灰
- 亮色:
--muted-foreground: 弱化文字颜色- 亮色:
hsl(0 0% 43.1373%)- 中灰 - 暗色:
hsl(0 0% 63.9216%)- 中浅灰
- 亮色:
用途: 禁用状态、占位符、不重要的信息
4. 边框和输入色 (Border & Input)
--border: 边框颜色- 亮色:
hsl(0 0% 83.1373%)- 浅灰 - 暗色:
hsl(0 0% 26.6667%)- 深灰
- 亮色:
--input: 输入框边框色- 亮色:
hsl(0 0% 83.1373%)- 浅灰 - 暗色:
hsl(0 0% 26.6667%)- 深灰
- 亮色:
5. 危险和警告色 (Destructive)
--destructive: 危险操作色(删除、警告等)- 亮色:
hsl(0 84.2365% 60.1961%)- 红色 - 暗色:
hsl(0 84.2365% 60.1961%)- 红色
- 亮色:
--destructive-foreground: 危险色上的文字颜色- 亮色:
hsl(0 0% 100%)- 白色 - 暗色:
hsl(0 0% 100%)- 白色
- 亮色:
用途: 删除按钮、错误提示、警告信息
6. 焦点和环色 (Ring)
--ring: 焦点环颜色- 亮色:
hsl(349.5238 100% 87.6471%)- 粉红色 - 暗色:
hsl(330 100.0000% 80%)- 粉红色
- 亮色:
用途: 键盘焦点环、表单验证高亮
7. 图表色 (Chart Colors)
--chart-1: 图表主色 (粉色系)--chart-2: 图表次要色 (蓝色/绿色系)--chart-3: 图表第三色 (黄色/蓝色系)--chart-4: 图表第四色 (黄色系)--chart-5: 图表第五色 (黄绿色系)
8. 侧边栏色 (Sidebar Colors)
--sidebar: 侧边栏背景色--sidebar-foreground: 侧边栏文字色--sidebar-primary: 侧边栏主要交互色--sidebar-primary-foreground: 侧边栏主要文字色--sidebar-accent: 侧边栏强调色--sidebar-accent-foreground: 侧边栏强调文字色--sidebar-border: 侧边栏边框色--sidebar-ring: 侧边栏焦点环色
🏗️ 使用优先级和层级
1. 主要色 (Primary) - 最高优先级
- 主按钮
- 重要链接
- 选中状态
- 进度指示器
- 主要数据展示
2. 次要色 (Secondary) - 中等优先级
- 次要按钮
- 标签和徽章
- 分页组件
- 辅助交互元素
3. 强调色 (Accent) - 低优先级
- 悬停状态
- 选中背景
- 高亮区域
- 过渡效果
4. 弱化色 (Muted) - 最低优先级
- 禁用状态
- 占位符文本
- 辅助信息
- 背景装饰
🎯 实际应用示例
按钮组件
// 主要按钮
<button className="bg-primary text-primary-foreground hover:bg-primary/90">
主要操作
</button>
// 次要按钮
<button className="bg-secondary text-secondary-foreground hover:bg-secondary/80">
次要操作
</button>
// 危险按钮
<button className="bg-destructive text-destructive-foreground hover:bg-destructive/90">
删除
</button>
卡片组件
<div className="bg-card text-card-foreground border border-border rounded-lg p-4">
<h2 className="text-foreground">卡片标题</h2>
<p className="text-muted-foreground">辅助信息</p>
</div>
输入框组件
<input className="bg-background text-foreground border border-input focus:ring-2 focus:ring-ring"
placeholder="占位符文本" />
🌓 主题切换原理
系统通过 CSS 变量实现主题切换:
/* 亮色主题 */
:root {
--background: hsl(200 23.0769% 97.4510%);
--foreground: hsl(0 0% 20%);
/* ... */
}
/* 暗色主题 */
.dark {
--background: hsl(220.0000 14.7541% 11.9608%);
--foreground: hsl(0 0% 89.8039%);
/* ... */
}
当 HTML 元素添加 .dark 类时,所有使用这些变量的组件都会自动切换颜色。
🎨 定制建议
1. 保持语义化
- 保持变量名的语义含义,不要为了视觉效果而改变变量用途
primary始终用于主要交互,destructive始终用于危险操作
2. 确保对比度
- 确保
*-foreground颜色与对应的背景色有足够的对比度 - 在两个主题下都要测试可读性
3. 渐进增强
- 先定义好核心颜色,再扩展其他颜色
- 使用 HSL 色彩空间便于调整饱和度和亮度
4. 一致性原则
- 保持相同类型的组件使用相同的颜色变量
- 避免在组件中硬编码颜色值
🔧 维护工具
检查颜色使用
# 查找所有使用 primary 变量的地方
grep -r "bg-primary\|text-primary\|border-primary" src/
主题切换测试
- 在浏览器开发者工具中切换 HTML 元素的 class
- 检查所有组件的颜色是否正确切换
- 验证对比度和可读性
本文档基于 shadcn UI 标准配色系统编写,适用于 React + Tailwind CSS 项目。