用 CSS 变量搭一层设计 token

2026 / 10 / 11#css#design-token#组件化

症状

拿到一个几千行的样式表,发现间距有 7px 9px 11px 13px 17px,字号有 12.5px 13.5px 14.5px 混着用。这种代码是能跑的,但没法维护 —— 每次调整都是全局搜索替换,而且永远会漏。

token 层长什么样

:root {
  /* 间距 8 档 */
  --sp-1: 4px;  --sp-2: 8px;  --sp-3: 12px; --sp-4: 16px;
  --sp-5: 24px; --sp-6: 32px; --sp-7: 48px; --sp-8: 64px;

  /* 字号 6 档 */
  --fs-1: 11px; --fs-2: 12.5px; --fs-3: 13.5px;
  --fs-4: 15px; --fs-5: 18px; --fs-6: 24px;

  /* 颜色按语义命名,不按色值命名 */
  --bg: #fdf3d9;
  --ink: #17143e;
  --accent: #ed2863;
  --line: rgb(23 21 79 / 26%);
}

组件里只允许写 var(--sp-3),不许出现裸数字。这条规矩是 token 层能不能活下来的关键 —— 一旦允许例外,半年后就回到原点。

颜色按语义命名

不要写 --blue: #303fbd,要写 --accent 或 --link。因为改版时颜色会变,但"这是链接色"这个角色不变。按色值命名等于把当前实现写进了名字里。

明暗切换只需要换一层

html[data-theme="dark"] {
  --bg: #12121a;
  --ink: #e8e8f0;
}

所有组件一行不改。这是 token 化最直接的回报,也是检验 token 层是否做对的试金石 —— 如果切主题要改组件,说明有硬编码漏在外面。

一个容易忽略的点

var() 支持回退值:var(--accent, #ed2863)。在组件库里给关键 token 留回退,能让别人只引入组件、不引入 token 时也不至于渲染异常。

本文为个人学习记录,可能存在错误或已过时,仅供参考。
← 返回笔记列表