跳到主要内容

原子化 CSS 专题导览

专题导览

原子化 CSS 专题导览

把演进历史、生态底座、工程实践、AI 工作流和 Demo 对照收成一张总图,先帮读者看清全局,再决定去哪一页深挖。

先看全局脉络再挑方案与工具最后落到工程约束

为什么读这份专题

  • 如果你刚接触原子化 CSS,这组文档会帮你先建立判断标准,再看工具细节,不会一上来就陷进类名和术语里。
  • 如果你已经在用 Tailwind,这里重点回答三个实际问题:为什么团队会选它、怎样避免写乱、怎样让 AI 生成的代码还能被人读懂。
  • 如果你正在维护多端或组件库项目,这里的内容会把 tokens、variants、merge、样式隔离这些概念串成一条完整链路,而不是零散技巧。

你会获得什么

  • 一条更贴近现实的脉络:从样式方案的常见演进路径,到为什么 Tailwind 会成为近几年最常见的落地选择之一。
  • 一套落地方法:怎么建立 tokens、怎么组织 variants、什么时候该用 cva/tailwind-variants、什么时候该停下来做约束。
  • 一份可执行清单:如何评审 class、如何避免动态类失控、如何验证产物体积、如何把 AI 输出纳入可交付流程。
  • 一组可直接参考的示例:React/Vue 的写法、组件封装方式,以及团队内部分享时能直接复用的对照材料。

这组文档适合谁

  • 正在评估 Tailwind、UnoCSS、CSS Modules 等方案,想先看清取舍再决定的人。
  • 已经在用 Tailwind,但发现代码开始变长、变乱、变难审阅,希望建立团队规范的人。
  • 要做多端、小程序、组件库或 AI 辅助开发,想把“类名写法”升级成“工程工作流”的人。

建议阅读方式

第一次看

按这个顺序读:

  1. 样式方案的演化
  2. Tailwind 设计理念
  3. 原子化 CSS 最佳实践

先把“为什么会走到这一步”和“什么时候值得用”看明白,再进入具体技巧。

带着问题看

阅读建议:第一次读,优先把前 3 篇读完;已经在项目里踩过坑的人,可以直接从「最佳实践」和「merge / variants」开始。

导航总览

章节适合什么时候看你会带走什么
样式方案的演化需要选型、做分享、统一团队认知时明白原子化 CSS 是一条重要分支,但当前业界仍是多种方案并行共存
Tailwind 设计理念想理解 Tailwind 本质时看清 tokens、JIT、variants、组件 API 是怎样串起来的
原子化 CSS 最佳实践要把 Tailwind 用稳时建立一套可执行的约束、评审标准和常见场景写法
tailwind-merge、cva、tailwind-variants 精要组件开始出现变体和扩展点时理解 merge、变体工厂和组件封装的边界
样式隔离方案与原理微前端、组件库、嵌入场景判断什么时候该用 prefix、Modules、Shadow DOM 等方案
AI 友好提示与 Demo 运行指南想让 AI 参与产出 UI 时把提示模板、校验链和运行示例接到工程里
各样式方案 Demo 与产物对照需要演示或做对照实验时直接看不同方案的代码、产物和差异

代码示例链接

重点示例

CSS 演进代码合集css-history —— 按阶段收录 Raw CSS、预处理器、CSS-in-JS、Tailwind 等写法与产物截图,便于讲稿/对照演示时直接引用。

React/Vue 代码快速预览

import { Button } from '@/components/ui/button'
import { cn } from '@/lib/utils'

export function Hero() {
return (
<div className="grid gap-4 rounded-2xl border bg-card/80 p-6 shadow-sm md:grid-cols-2">
<div className="space-y-3">
<p className="text-xs uppercase tracking-[0.2em] text-muted-foreground">Atomic CSS</p>
<h1 className="text-2xl font-semibold">让设计系统与类名对齐</h1>
<p className="text-sm text-muted-foreground">`cva`/`tailwind-variants` 集中声明 variants,`tailwind-merge` 兜底合并,搭配 tokens 保持一致。</p>
<div className="flex gap-2">
<Button>开始体验</Button>
<Button variant="secondary" className={cn('gap-1')}>
预览代码
</Button>
</div>
</div>
<div className="rounded-xl border bg-muted/60 p-4 text-xs leading-relaxed">
<pre className="whitespace-pre-wrap">
{`const button = cva('inline-flex items-center px-4 py-2', {
variants: { intent: { primary: 'bg-primary text-primary-foreground', ghost: 'hover:bg-accent' } },
compoundVariants: [{ intent: 'primary', size: 'lg', class: 'shadow-lg' }],
})`}
</pre>
</div>
</div>
)
}