Tailwind CSS 设计令牌:用 CSS 变量构建可主题化的个人站
硬编码颜色的维护噩梦
<p className="text-zinc-400">...</p>
深色模式时要改成 dark:text-zinc-500,组件一多就 类名爆炸。更好的做法:语义化令牌 + CSS 变量。
全局变量定义
globals.css:
:root {
--background: #fafafa;
--foreground: #18181b;
--muted: #71717a;
--accent: #0d9488;
--border: #e4e4e7;
--card: #ffffff;
}
.dark {
--background: #09090b;
--foreground: #fafafa;
--muted: #a1a1aa;
--accent: #2dd4bf;
--border: #27272a;
--card: #18181b;
}
组件侧统一:
<p className="text-[var(--muted)]">副标题</p>
<div className="border border-[var(--border)] bg-[var(--card)]" />
与 next-themes 配合
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
{children}
</ThemeProvider>
attribute="class" 在 <html> 上切换 dark,触发 .dark { ... } 变量覆盖。
surface 工具类
@layer components {
.surface {
@apply rounded-xl border border-[var(--border)] bg-[var(--card)];
}
}
首页卡片、博客列表共用 .surface,改令牌即全站换肤。
color-mix 做 hover
className="hover:border-[color-mix(in_srgb,var(--accent)_35%,var(--border))]"
无需为 hover 再定义第三个变量。
Tailwind v4 @theme(可选)
若升级到 v4,可把变量映射进 @theme:
@theme {
--color-background: var(--background);
--color-foreground: var(--foreground);
}
则可用 bg-background 等语义类,与 ZhuBook 当前 var(--*) 写法二选一,团队统一即可。
小结
个人站 UI 不必上完整 Design System,但 语义色 + CSS 变量 是性价比最高的主题方案;ZhuBook 全站已按此收敛,新增页面请避免再引入 zinc-* 硬编码。
相关阅读
- TypeScript 2026 实战:从类型体操到可维护工程2026-05-18
- Next.js App Router 数据获取:Server Component、缓存与流式渲染2026-05-17
- React Server Components 入门:心智模型与边界2026-05-12
本站评论 (0)
- 暂无评论,来说第一句吧。