原子化 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 辅助开发,想把“类名写法”升级成“工程工作流”的人。
建议阅读方式
第一次看
按这个顺序读:
先把“为什么会走到这一步”和“什么时候值得用”看明白,再进入具体技巧。
带着问题看
- 你在做技术选型:先看 样式方案的演化 和 Tailwind 设计理念。
- 你在改现有项目:先看 原子化 CSS 最佳实践 和 tailwind-merge、cva、tailwind-variants 精要。
- 你在处理隔离或嵌入场景:直接看 样式隔离方案与原理。
- 你在做 AI 辅助开发:直接看 AI 友好提示与 Demo 运行指南。
阅读建议:第一次读,优先把前 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 代码快速预览
- React (shadcn/ui 风格)
- Vue (shadcn-vue/reka-ui 风格)
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>
)
}
<script setup lang="ts">
import { Button } from '@/components/ui/button'
</script>
<template>
<section class="grid gap-4 rounded-2xl border bg-card/80 p-6 shadow-sm md:grid-cols-2">
<div class="space-y-3">
<p class="text-xs uppercase tracking-[0.2em] text-muted-foreground">Atomic CSS</p>
<h1 class="text-2xl font-semibold">组合变体,保持一致</h1>
<p class="text-sm text-muted-foreground">用 `cva` 或 `tailwind-variants` 宣告变体,再用 `cn`/`twMerge` 兜底。</p>
<div class="flex gap-2">
<Button>开始体验</Button>
<Button variant="secondary" class="gap-1">预览代码</Button>
</div>
</div>
<div class="rounded-xl border bg-muted/60 p-4 text-xs leading-relaxed">
<pre class="whitespace-pre-wrap">buttonVariants({ intent: 'primary', size: 'lg' })</pre>
</div>
</section>
</template>