调色枢 设计指南 CSS 色彩变量:构建可扩展的设计 Token 系统

CSS 与开发

CSS 色彩变量:构建可扩展的设计 Token 系统

学习如何使用 CSS 自定义属性管理颜色、构建设计 Token 体系、实现深色模式,并在大型项目中保持色彩一致性。

⏱ 7 分钟阅读 · 设计指南
核心要点
  • 在 :root 中定义一次,通过 var() 到处引用
  • 使用三层结构:基础 → 语义 → 组件 Token
  • 深色模式只需一个 @media 或 data-theme 切换
  • 不要在 Token 名称中编码十六进制值

基础语法

CSS 自定义属性以双横线前缀定义,通过 var() 使用。它们像任何 CSS 属性一样层叠,并在 JavaScript 修改时实时更新:

:root {
  --color-brand: #4f6ef7;
  --color-text:  #1a1a1a;
  --color-bg:    #ffffff;
}

button {
  background: var(--color-brand);
  color: var(--color-text);
}

三层 Token 体系

原始十六进制值是基础层。语义化 Token 是让系统可维护的关键:

  • 基础 Token — 实际颜色值:--blue-500: #3b82f6
  • 语义 Token — 角色映射:--color-action: var(--blue-500)
  • 组件 Token — 具体用途:--button-bg: var(--color-action)

这三层结构让你只需重新赋值语义 Token,就能切换整套主题,而无需修改任何组件。

用 CSS 变量实现深色模式

:root {
  --bg:   #ffffff;
  --text: #1a1a1a;
}
@media (prefers-color-scheme: dark) {
  :root {
    --bg:   #111111;
    --text: #f5f5f5;
  }
}

或使用 data-theme 属性实现用户手动切换:

[data-theme="dark"] { --bg: #111; --text: #f5f5f5; }

命名规范

统一命名能防止团队协作混淆。常见模式:

  • --color-[角色]-[变体] — 如 --color-surface-raised
  • --[组件]-[属性] — 如 --button-border-radius
  • 基于色阶:--gray-100--gray-900
避免这样做

不要在名称中编码十六进制值(如 --blue-color)。当你修改值之后,名称就会产生误导。

备用值

var() 接受可选备用值:var(--color-brand, #4f6ef7)。在组件库中使用,确保即使消费方项目未定义所有 Token,组件也能正常工作。

导出工作流

在设计工具中定义色板 → 导出为 CSS 变量文件 → 将该文件作为唯一事实来源。React、Vue、Svelte 或纯 HTML,所有平台消费同一份 Token 文件。

将色板导出为 CSS 变量

生成带角色注释和深色模式的生产就绪 CSS 自定义属性

导出 CSS →