为什么需要设计令牌?
如果你在 SCSS 中硬编码颜色值 #FDF8F5,当需要支持深色模式时,你得在几百个地方找到它们并修改。
设计令牌(Design Tokens)是解决方案:把颜色、间距、字号等以命名变量的形式统一管理。
幻梦的令牌体系
:root {
/* ===== 断点 ===== */
--xs: 0;
--sm: 576px;
--md: 768px;
--lg: 992px;
--xl: 1200px;
--xxl: 1440px;
/* ===== 间距尺度 ===== */
--s1: 4px; --s2: 8px; --s3: 12px;
--s4: 16px; --s5: 20px; --s6: 24px;
--s7: 28px; --s8: 32px; --s9: 36px;
--s10: 40px; ... --s24: 96px;
/* ===== 字体 ===== */
--ff-body: 'Inter', 'Noto Sans SC', sans-serif;
--ff-code: 'JetBrains Mono', monospace;
--fs-xs: 0.75rem;
--fs-sm: 0.875rem;
--fs-base: 1rem;
--fs-5xl: 3rem;
/* ===== 圆角 ===== */
--br1: 8px; --br2: 12px; --br3: 16px;
/* ===== 阴影 ===== */
--sh1: 0 2px 8px rgba(0,0,0,0.08);
--sh2: 0 4px 16px rgba(0,0,0,0.12);
/* ===== 过渡 ===== */
--tr1: 0.2s ease;
--tr2: 0.3s ease;
--tr3: 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
色彩令牌
最复杂的部分是色彩。幻梦定义了两套色彩体系(浅色/深色),但共用同一套语义变量名:
/* 浅色模式下的语义映射 */
:root, [data-theme="light"] {
--cbg1: #FDF8F5; /* 页面背景 */
--cbg2: rgba(255, 255, 255, 0.72); /* 卡片背景 */
--ctp: #2E2825; /* 正文颜色 */
--cp1: #8B6F5E; /* 主色-最深 */
--cp5: #D4A574; /* 主色-中间 */
--cp9: #F5E6D3; /* 主色-最浅 */
}
/* 深色模式下的语义映射 */
[data-theme="dark"] {
--cbg1: #0E0A08;
--cbg2: rgba(30, 24, 20, 0.72);
--ctp: #EDE0D8;
--cp1: #1C1210;
--cp5: #8B6F5E;
--cp9: #FDF3EE;
}
关键设计:不直接使用颜色值,始终使用语义变量。 切换 data-theme 属性,全局颜色自动更新。
使用方式
.card {
background: var(--cbg2);
color: var(--ctp);
border: 1px solid var(--cbd);
padding: var(--s6);
border-radius: var(--br2);
box-shadow: var(--sh1);
transition: transform var(--tr2), box-shadow var(--tr2);
}
优势
- 主题切换:改一个属性,全局生效
- 一致性:所有卡片使用相同的圆角和阴影
- 可维护性:调整全局间距尺度,只需改一处
- 开放性:用户可以在站点覆盖任意 token
好的设计系统就像好的厨房——所有的材料、工具都摆在固定位置。做菜的时候,你不会边切洋葱边找盐。
评论