Back

设计令牌(Design Tokens)简明入门

设计令牌(Design Tokens)简明入门

如果你曾经更新过品牌色,然后花了一个小时在样式表里到处搜寻那些硬编码的 #3B82F6,那么你已经理解了设计令牌所要解决的问题。本文将介绍什么是设计令牌、它们与普通 CSS 变量有何区别,以及如何在前端样式工作流中开始使用它们。

关键要点

  • 设计令牌是具名的、可复用的值,以平台无关的格式承载设计决策,使同一套定义能够从单一可信源驱动 Web、iOS 和 Android 的样式。
  • 基础令牌(Primitive Tokens)保存原始值,而语义令牌(Semantic Tokens)引用基础令牌并附加使用意图,形成一个灵活的双层体系,可以干净地扩展。
  • 设计令牌和 CSS 变量相关但有所不同:令牌是源(通常是 JSON),而 CSS 变量是通过 Style Dictionary 等工具生成的众多可能输出之一。
  • 你可以从简单的颜色和间距基础令牌起步,随着设计体系的成熟,再逐步加入语义令牌并构建工具链。

什么是设计令牌?

设计令牌是具名的、可复用的值,用于表示你的设计决策——例如颜色、间距、排版、边框圆角和阴影。你不再直接在组件中写 padding: 16px,而是引用一个像 space-4 这样持有该值的令牌。

从本质上看,每个设计令牌只是一个名称与一个值的配对。但作为一种方法论,它的意义远不止于此。设计令牌社区组(DTCG) 是致力于推动统一规范的 W3C 社区组,他们将其描述为一种以平台无关的格式来表达设计决策的方式,使其能够在不同的学科、工具和技术之间共享。

“平台无关”这一点很关键。同一组令牌定义可以转换为 Web 端的 CSS 自定义属性、iOS 端的 Swift 常量,或 Android 端的 XML 值——全部来自单一可信源。

常见的设计令牌类别

大多数设计系统将令牌组织为以下几个类别:

  • 颜色(Color) —— 品牌色板、文字颜色、背景、边框
  • 间距(Spacing) —— padding、margin、gap 值
  • 排版(Typography) —— 字体族、字号、字重、行高
  • 边框圆角(Border radius) —— 组件的圆角处理
  • 阴影(Shadow) —— 层级与深度效果

基础令牌 vs. 语义令牌

这种区分是使用设计系统令牌时最有用的概念之一。

基础令牌(也称为 base 或 global 令牌)是不带使用语义的原始值:

{
  "color-blue-500": { "$value": "#3B82F6", "$type": "color" },
  "space-4": { "$value": "16px", "$type": "dimension" }
}

语义令牌 引用基础令牌并附加意图。它告诉你某个值应该用在哪里,而不仅仅是它是什么:

{
  "color-action-primary": { "$value": "{color-blue-500}", "$type": "color" },
  "spacing-component-padding": { "$value": "{space-4}", "$type": "dimension" }
}

当你更改 color-blue-500 时,所有指向它的语义令牌都会自动更新。这才是这个体系的真正威力所在。

设计令牌 vs. CSS 变量

CSS 变量和设计令牌相关,但并非同一回事。

方面设计令牌CSS 变量
作用范围平台无关仅限 CSS
格式JSON(或类似格式)原生 CSS
工具链需要构建步骤浏览器原生支持
最适用于多平台设计系统仅 Web 的主题化

设计令牌是。CSS 变量通常是输出。像 Style Dictionary 这样的工具会把你的令牌定义转换为各平台所需的格式。

一个简单的实用示例

以下是使用 DTCG 风格语法定义的一组小型令牌:

{
  "color-blue-500": { "$value": "#3B82F6", "$type": "color" },
  "color-text-primary": { "$value": "{color-blue-500}", "$type": "color" },
  "space-4": { "$value": "16px", "$type": "dimension" }
}

通过 Style Dictionary 处理后,CSS 输出如下:

:root {
  --color-blue-500: #3B82F6;
  --color-text-primary: var(--color-blue-500);
  --space-4: 16px;
}

现在,你的组件使用 var(--color-text-primary) 而不是硬编码的十六进制值。只需修改一次令牌,所有地方就会同步更新。

在设计端,Figma 变量 遵循同样的”基础到语义”模式,使设计和代码更易于保持一致。

起步要小,扩展要有意识

你不需要在第一天就建立完整的令牌体系。先从颜色和间距的基础令牌开始,当模式逐渐显现时再加入语义层,等手工流程成为瓶颈时再引入工具链。

结语

设计令牌不仅仅是组织 CSS 的一种方式——它们是设计师与开发者之间的共同语言。一旦这门语言确立起来,产品中的一致性就不再是你需要手动去强制执行的事情,而是变成了系统自动为你处理的事情。

常见问题

不需要。即便没有正式的设计系统,你也可以从单个 JSON 文件或样式表中一组扁平的基础令牌(颜色和间距)起步。令牌往往会成为后续设计系统赖以生长的基础,因此尽早引入它们实际上会让日后构建更大的体系变得更容易。

大多数工具类框架允许你从共享的令牌源生成其主题值。在 Tailwind CSS v4 中,设计令牌通常通过 @theme 变量暴露,进而自动生成对应的工具类。像 Style Dictionary 这样的工具可以帮助这些值在 Web 和其他平台之间保持同步。

当你发现某个基础令牌在许多组件中被反复用于特定用途时——比如某种蓝色被一致地用于操作按钮——就该加入语义令牌了。当你需要主题化(例如暗黑模式)时,语义令牌就变得必不可少,因为它们让你能够切换语义,而无需在整个代码库中重命名每一处基础令牌引用。

可以。主题通常通过将语义令牌重新映射到不同的基础令牌来工作。在浅色主题下,color-text-primary 可能指向深灰色;而在深色主题下则指向浅灰色。组件只引用语义令牌,因此切换主题不需要修改任何组件,只需切换一套不同的令牌映射即可。

Truly understand users experience

See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..

OpenReplay