本附录是 Tailwind CSS 的「终极速查手册 + 深度进阶」二合一文档。前半部分为五个新增的深度技术章节,后半部分将原有全部 20 个类名分类(A.1–A.20)折叠保留,随时可作为日常开发速查入口。
一、Tailwind 设计系统与 Design Token 定制
真实企业项目往往不会直接使用 Tailwind 默认配色,而是需要把品牌视觉系统翻译成一套可维护的 Design Token。Tailwind 的配置层本质就是「设计系统即代码」。
1.1 核心配置文件结构
tailwind.config.js 是连接设计规范与实现代码的唯一入口:
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./src/**/*.{js,ts,jsx,tsx,vue,html}',
'./index.html',
],
theme: {
extend: {
colors: {
brand: {
50: '#eff6ff',
100: '#dbeafe',
500: '#3b82f6',
600: '#2563eb',
900: '#1e3a8a',
},
surface: {
DEFAULT: '#ffffff',
elevated: '#fafafa',
},
},
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
mono: ['JetBrains Mono', 'monospace'],
},
fontSize: {
'2xs': ['0.625rem', { lineHeight: '0.875rem' }],
},
spacing: {
4.5: '1.125rem',
13: '3.25rem',
},
borderRadius: {
'2xl': '1rem',
},
boxShadow: {
'card': '0 4px 12px rgba(0, 0, 0, 0.08)',
'card-hover': '0 8px 24px rgba(0, 0, 0, 0.12)',
},
animation: {
'fade-in': 'fadeIn 0.3s ease-out',
},
keyframes: {
fadeIn: {
'0%': { opacity: '0', transform: 'translateY(4px)' },
'100%': { opacity: '1', transform: 'translateY(0)' },
},
},
},
},
plugins: [
require('@tailwindcss/typography'),
require('@tailwindcss/forms'),
],
}
上例展示了品牌色 brand-50 到 brand-900 的完整 token 映射。通过 extend 而非直接覆盖,可以保留 Tailwind 全部默认色系的同时增量叠加。项目中可直接写出 text-brand-500、bg-brand-50,与设计稿 Figma Token 一一对应。
1.2 CSS 变量与 Tailwind 的联动映射
更工程化的做法是将 Design Token 定义为原生 CSS 变量,然后在 tailwind.config.js 中引用:
/* src/styles/tokens.css */
:root {
--color-brand-500: #3b82f6;
--color-brand-600: #2563eb;
--color-surface: #ffffff;
--color-text-primary: #111827;
--radius-card: 0.75rem;
--shadow-card: 0 4px 12px rgba(0, 0, 0, 0.08);
}
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
brand: {
500: 'var(--color-brand-500)',
600: 'var(--color-brand-600)',
},
surface: 'var(--color-surface)',
'text-primary': 'var(--color-text-primary)',
},
borderRadius: {
card: 'var(--radius-card)',
},
boxShadow: {
card: 'var(--shadow-card)',
},
},
},
}
这种方式的优势在于:
- 设计师可以直接修改 CSS 变量值,无需重新构建 Tailwind。
- 运行时主题切换(如暗色模式)只需修改变量,Tailwind 类名无需变动。
- 便于跨项目共享同一套 token 文件,甚至发成 npm 包供多个子项目消费。
关于暗色模式的实践,请参阅下一节「暗色模式与 CSS 变量结合实现主题切换」。
1.3 设计系统落地的执行流程
- 与设计团队协作,将 Figma / Sketch 的颜色、字号、间距提取为变量表。
- 在
tokens.css中定义全部 CSS 变量,按语义命名(--color-surface、--color-text-primary优于--color-white、--color-black)。 - 在
tailwind.config.js中将变量映射成 Tailwind 的colors、fontSize、spacing等扩展。 - 组件开发时全部使用 Tailwind 原子类,而非直接写
color: var(...),保持原子化一致性。 - 通过 shadcn/ui 组件库实践 ,将 token 落地为可复用的 Button / Card / Dialog 等组件。
二、暗色模式 darkMode: ‘class’ 与 CSS 变量结合实现主题切换
Tailwind 内置的暗色模式策略有两种:media(根据系统偏好)与 class(手动控制)。企业级产品通常选择 class 策略,因为需要支持「跟随系统 / 强制亮色 / 强制暗色」三种状态。
2.1 配置开启 class 策略
// tailwind.config.js
module.exports = {
darkMode: 'class',
// ...
}
启用后,所有带 dark: 前缀的类名(如 dark:bg-gray-900 dark:text-white)只会在祖先元素存在 .dark 类时生效。
2.2 CSS 变量驱动的双色主题
在 Tailwind v3 中,推荐将暗色配色全部映射到 CSS 变量:
/* tokens.css */
:root {
--bg-primary: #ffffff;
--bg-secondary: #f3f4f6;
--text-primary: #111827;
--text-secondary: #6b7280;
--border-color: #e5e7eb;
}
.dark {
--bg-primary: #0f172a;
--bg-secondary: #1e293b;
--text-primary: #f8fafc;
--text-secondary: #94a3b8;
--border-color: #334155;
}
<!-- HTML -->
<html class="dark">
<body class="bg-[var(--bg-primary)] text-[var(--text-primary)]">
<div class="border border-[var(--border-color)] rounded-lg p-4">
<p class="text-[var(--text-secondary)]">暗色模式已开启</p>
</div>
</body>
</html>
2.3 存储与恢复用户主题偏好
// theme.ts
const THEME_KEY = 'app-theme'
type Theme = 'light' | 'dark' | 'system'
export function getTheme(): Theme {
return (localStorage.getItem(THEME_KEY) as Theme) || 'system'
}
export function setTheme(theme: Theme) {
const root = document.documentElement
if (theme === 'dark') {
root.classList.add('dark')
} else if (theme === 'light') {
root.classList.remove('dark')
} else {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
prefersDark ? root.classList.add('dark') : root.classList.remove('dark')
}
localStorage.setItem(THEME_KEY, theme)
}
// 初始化
setTheme(getTheme())
// 监听系统变化
window.matchMedia('(prefers-color-scheme: dark)')
.addEventListener('change', () => {
if (getTheme() === 'system') setTheme('system')
})
2.4 与 shadcn/ui 语义色结合
shadcn/ui 使用 bg-background、text-foreground、border-border 等语义 token,本质上也是 CSS 变量的封装。将上述变量体系嵌入 shadcn 的 CSS 变量定义后,整套组件库(Button、Card、Input、Dialog)都可以无感知地响应主题切换。
更多组件封装细节请参考 附录 B:Tailwind + shadcn/ui 最佳实践 与 附录 C:Tailwind CSS 速查表 。
三、@layer @apply 构建组件库原子类组合(Button / Card / Modal 实战)
虽然 Tailwind 推荐「Utility First」,但在企业级中后台场景下,反复书写相同的 8–12 个类名既不高效也容易遗漏。@layer 与 @apply 正是解决这一矛盾的官方方案。
3.1 @apply 的基本用法
/* src/styles/components.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer components {
.btn {
@apply inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors;
}
.btn-primary {
@apply btn bg-brand-500 text-white hover:bg-brand-600 focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2;
}
.btn-secondary {
@apply btn bg-white text-gray-700 border border-gray-300 hover:bg-gray-50;
}
.btn-danger {
@apply btn bg-red-600 text-white hover:bg-red-700;
}
}
3.2 @layer 的意义
Tailwind 的 CSS 输出分为三层:base(重置)、components(组件)、utilities(原子工具)。使用 @layer components 确保自定义组件的优先级低于 @layer utilities,这意味着后续在 JSX 中覆盖 btn-primary 时,className="ml-4 mt-2" 仍然能正确生效——这是不使用裸 CSS 类时经常遇到的优先级问题。
3.3 Card 组件实战
@layer components {
.card {
@apply rounded-xl border bg-white shadow-sm transition-shadow;
}
.card-hover:hover {
@apply shadow-md;
}
.card-header {
@apply flex flex-col space-y-1.5 p-6 border-b;
}
.card-title {
@apply text-lg font-semibold leading-none tracking-tight;
}
.card-body {
@apply p-6;
}
.card-footer {
@apply flex items-center justify-end gap-2 p-6 border-t;
}
}
3.4 Modal(Dialog)浮层实战
@layer components {
.modal-overlay {
@apply fixed inset-0 bg-black/40 backdrop-blur-sm transition-opacity;
}
.modal-content {
@apply fixed left-1/2 top-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 rounded-xl border bg-white p-6 shadow-lg outline-none;
}
.modal-header {
@apply space-y-1.5 mb-4;
}
.modal-title {
@apply text-lg font-semibold leading-none tracking-tight;
}
.modal-footer {
@apply mt-6 flex items-center justify-end gap-2;
}
}
<!-- 使用示例 -->
<div class="modal-overlay"></div>
<div class="modal-content" role="dialog">
<div class="modal-header">
<h2 class="modal-title">确认删除</h2>
<p class="text-sm text-gray-500">此操作不可撤销,请谨慎。</p>
</div>
<div class="modal-footer">
<button class="btn-secondary">取消</button>
<button class="btn-danger">确认删除</button>
</div>
</div>
3.5 何时使用 @apply,何时用 cn()/clsx()
- @apply 场景:项目中存在大量重复基础 UI(中后台表单、表格、卡片),且样式差异主要是「有无边框 / 有无阴影」等固定变体。
- cn()/clsx() 场景:组件状态复杂(loading、disabled、多 variant)、需要条件渲染类名,或构建通用开源 UI 库(如 shadcn/ui)。
对于 Vue / React 项目,更多时候推荐将上述 @apply 组件进一步封装为 Vue SFC 或 React 组件,配合 cn() 函数管理条件类名。关于 React 组件化方案,请参阅 React 专题
;关于 Vue 组合式组件封装,可参阅 Vue 状态管理完全指南
。
四、Tailwind + PostCSS 插件生态
Tailwind 本身是一个 PostCSS 插件,其生态建立在 PostCSS 之上。以下是生产环境中高频使用的四个官方/半官方插件。
4.1 @tailwindcss/typography — 排版美化
长文内容(博客、文档、帮助中心)通常来自 Markdown / CMS,内容结构不完全可控。typography 插件为容器添加 prose 类,即可自动美化内部的 h1–h6、p、ul、blockquote、pre > code:
<article class="prose prose-slate md:prose-lg dark:prose-invert">
<!-- 这里的 HTML/Markdown 渲染结果会自动排版 -->
<h1>文章标题</h1>
<p>正文段落……</p>
<blockquote>引用内容</blockquote>
</article>
// tailwind.config.js
module.exports = {
plugins: [require('@tailwindcss/typography')],
}
prose-invert 配合暗色模式使用,md:prose-lg 实现响应式字号缩放。对于技术文档站来说,这是「零样式侵入」排版的最优解。
4.2 @tailwindcss/forms — 表单元素重置
浏览器默认的 <input>、<select>、<textarea> 样式差异巨大,forms 插件提供统一的、可定制的基础样式:
// tailwind.config.js
module.exports = {
plugins: [require('@tailwindcss/forms')],
}
<input type="text" class="form-input rounded-lg border-gray-300" />
<select class="form-select rounded-lg border-gray-300"></select>
<textarea class="form-textarea rounded-lg border-gray-300"></textarea>
核心优势:保留浏览器默认的 focus ring、无障碍支持,同时外观高度统一,无需手写 appearance: none;。
4.3 @tailwindcss/container-queries — 容器查询
响应式并非只看视口宽度,有时需要按「组件容器宽度」判断。@tailwindcss/container-queries 插件将 CSS Container Queries 包装成 Tailwind 语法:
<div class="@container">
<div class="grid grid-cols-1 @md:grid-cols-2 @lg:grid-cols-3 gap-4">
<div class="card">Item 1</div>
<div class="card">Item 2</div>
<div class="card">Item 3</div>
</div>
</div>
这里的 @md: 不是指视口 ≥ 768px,而是指 .@container 这个容器本身宽度达到该阈值。这对于「侧边栏可折叠的仪表盘布局」极为关键。
4.4 @tailwindcss/line-clamp — 文本截断
<p class="line-clamp-3">
这是一段很长的文本,超过三行后尾部会自动显示省略号,无需手动计算高度或使用 JavaScript。
</p>
注意:Tailwind v3.3+ 已将
line-clamp合并入核心,无需额外安装插件。
五、Tailwind v4 新增语法 Preview(@theme, CSS-first configuration)
Tailwind v4 是当前社区关注的核心版本,其最大变化是将配置从 JS (tailwind.config.js) 迁移到 CSS (@theme)。这带来更少的构建依赖和更直接的开发体验。
5.1 不再需要 tailwind.config.js
/* styles.css —— Tailwind v4 */
@import "tailwindcss";
@theme {
--color-brand-50: #eff6ff;
--color-brand-500: #3b82f6;
--color-brand-600: #2563eb;
--font-sans: 'Inter', system-ui, sans-serif;
--radius-card: 0.75rem;
--shadow-card: 0 4px 12px rgba(0, 0, 0, 0.08);
}
v4 中 @theme 声明的变量会自动生成对应的 Tailwind 类名:bg-brand-500、text-brand-600、rounded-card、shadow-card。不需要再在 JS 配置中映射一次。
5.2 暗色模式原生支持
@import "tailwindcss";
@theme {
--color-surface: #ffffff;
--color-surface-dark: #0f172a;
}
.dark {
--color-surface: var(--color-surface-dark);
}
v4 的暗色配色可以直接在同一 CSS 文件内完成,不再需要跨文件维护变量。
5.3 @apply 在 v4 中的变化
v4 中的 @apply 语法保持不变,但 @layer 的概念进一步简化。由于 v4 采用基于 cascade layers 的架构,自定义组件的优先级管理更加透明:
@import "tailwindcss";
@utility btn {
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: var(--radius-md);
padding: 0.5rem 1rem;
font-weight: 500;
}
@utility 是 v4 的新指令,功能类似于 v3 的 @layer components + @apply,但语义更清晰。
5.4 v4 迁移评估
| 维度 | v3 (当前稳定) | v4 (预览/早期) |
|---|---|---|
| 配置方式 | tailwind.config.js | CSS-first (@theme) |
| 构建器 | PostCSS / webpack / Vite 均支持 | 推荐 Lightning CSS |
| 包体积 | 已极佳 (JIT) | 进一步缩减 |
| IDE 支持 | Tailwind CSS IntelliSense 完善 | 持续适配中 |
| 生产建议 | 首选,生态成熟 | 可评估实验,不建议直接上生产 |
六、与其他技术栈的衔接
Tailwind 并非孤立存在,它与前端主流框架的深度整合决定了项目体验的上限:
- React:Tailwind 与 JSX 的结合已成行业标准,配合 React Hooks 完全指南 中的状态逻辑,可构建高度可复用的 UI 组件。
- Vue:在
<template>中使用 Tailwind 类名同样流畅,配合 Vue Router 完全指南 的页面级布局思考,可实现全站视觉一致性。 - Next.js / Nuxt:服务端渲染对 CSS 的体积敏感,Tailwind JIT 模式 + PurgeCSS 恰好解决了这一痛点。
附:类名速查表(A.1 – A.20 全量折叠版)
以下内容覆盖 Tailwind 全部 20 大类原子类,可作为日常开发「Ctrl+F」速查手册。需要时展开对应条目即可。
A.1 布局(Layout) — 包含 Display、Position、Z-index、Flexbox、Grid、Multi-column
A.1.1 Display
block
inline-block
inline
flex
inline-flex
table
inline-table
table-row
table-cell
grid
inline-grid
contents
hidden
A.1.2 Position
static
fixed
absolute
relative
sticky
辅助类:
inset-0
top-0
right-0
bottom-0
left-0
inset-x-0
inset-y-0
支持 arbitrary:
top-[10px]
left-[50%]
A.1.3 Z-index
z-0
z-10
z-20
z-30
z-40
z-50
z-auto
z-[999]
A.1.4 Flexbox
flex
inline-flex
flex-row / flex-row-reverse
flex-col / flex-col-reverse
flex-wrap / flex-nowrap / flex-wrap-reverse
justify-start/center/end/between/around/evenly
items-start/center/end
content-start/center/between
Flex-grow / shrink
flex-grow
flex-grow-0
flex-shrink
flex-shrink-0
Gap
gap-1 ... gap-96
gap-x-4
gap-y-6
A.1.5 Grid
grid
grid-cols-1 ... grid-cols-12
grid-rows-1 ... grid-rows-12
grid-flow-row / col / dense
auto-rows-auto / auto-cols-auto
Gap
gap-x-4
gap-y-4
Span
col-span-1 ... col-span-12
row-span-1 ... row-span-12
A.1.6 Multi-column(多列布局)
columns-1 ... columns-12
columns-auto
columns-[260px]
A.2 尺寸(Sizing) — Width、Height、Min/Max
A.2.1 Width(w-*)
w-0
w-px
w-1 ... w-96
w-auto
w-full
w-screen
w-min
w-max
w-fit
w-[200px]
A.2.2 Height(h-*)
h-0
h-px
h-1 ... h-96
h-full
h-screen
h-fit
A.2.3 Min/Max
min-w-0 / min-w-full / min-w-[100px]
max-w-xs / sm / md / lg / xl / 2xl / 3xl...
max-w-screen-sm / md / lg / xl
min-h-0
min-h-full
max-h-screen
A.3 间距(Spacing) — Padding、Margin
Tailwind spacing scale:
0 0.5 1 1.5 2 2.5 ... 96
单位为 rem(默认 4px scale)。
A.3.1 Padding (p-*)
p-0 p-1 p-2 ... p-96
px-4 py-2
pt-4 pr-4 pb-4 pl-4
p-[10px]
A.3.2 Margin (m-*)
m-0 m-1 ... m-96
my-4 mx-2
-ml-4
m-auto
A.4 排版(Typography) — Font size、Weight、Line-height、Tracking、Align、Color
A.4.1 Font size
text-xs
text-sm
text-base
text-lg
text-xl
text-2xl ... text-9xl
text-[32px]
A.4.2 Font weight
font-thin
font-extralight
font-light
font-normal
font-medium
font-semibold
font-bold
font-extrabold
font-black
A.4.3 Line-height
leading-none
leading-tight
leading-snug
leading-normal
leading-relaxed
leading-loose
leading-[3rem]
A.4.4 Letter spacing
tracking-tighter
tracking-tight
tracking-normal
tracking-wide
tracking-wider
tracking-widest
A.4.5 Text align
text-left
text-center
text-right
text-justify
A.4.6 Text color
text-black
text-white
text-gray-500
text-blue-600
text-red-500
text-primary-500
text-[var(--text-color)]
A.5 背景(Background) — Background color、Gradient、Background image
A.5.1 Background color
bg-gray-100
bg-blue-500
bg-red-600
bg-primary-500
bg-[var(--bg)]
A.5.2 Gradient
bg-gradient-to-r
bg-gradient-to-b
from-blue-500
via-purple-500
to-pink-500
A.5.3 Background image
bg-none
bg-[url('/img/pattern.png')]
A.6 边框(Border) — Border width、color、radius
A.6.1 Border width
border
border-0
border-2
border-4
border-8
A.6.2 Border color
border-gray-300
border-blue-500
border-red-300
border-[var(--border)]
A.6.3 Border radius
rounded-none
rounded-sm
rounded
rounded-md
rounded-lg
rounded-xl
rounded-2xl
rounded-3xl
rounded-full
rounded-[12px]
A.7 Outline & Ring(焦点样式)
A.7.1 Ring
ring
ring-1 ring-2 ring-4
ring-blue-500
ring-offset-2
A.7.2 Outline
outline
outline-none
outline-blue-500
A.8 阴影(Shadow)
shadow-xs
shadow-sm
shadow
shadow-md
shadow-lg
shadow-xl
shadow-2xl
shadow-inner
shadow-none
shadow-[0_4px_12px_rgba(0,0,0,.15)]
A.9 过滤器(Filter / Backdrop)
A.9.1 Filter
filter
blur-sm blur-md blur-lg
brightness-50
contrast-125
grayscale
invert
sepia
A.9.2 Backdrop
backdrop-blur-sm
backdrop-brightness-50
backdrop-opacity-50
A.10 变换(Transform)
transform
scale-95 scale-100 scale-110
rotate-45 rotate-90
translate-x-4 translate-y-2
skew-x-6 skew-y-3
A.11 动画(Animation)
默认动画:
animate-spin
animate-ping
animate-pulse
animate-bounce
自定义 keyframes:
animate-[wiggle_1s_ease-in-out_infinite]
A.12 过渡(Transition)
transition
transition-colors
transition-opacity
duration-75
duration-150
ease-in
ease-out
ease-in-out
A.13 表格(Table)
table-auto
table-fixed
border-collapse
border-separate
caption-top caption-bottom
A.14 列表(List)
list-none
list-disc
list-decimal
marker:text-blue-500
A.15 交互(Interactivity) — Cursor、User select、Pointer events
A.15.1 Cursor
cursor-pointer
cursor-default
cursor-wait
cursor-not-allowed
A.15.2 User select
select-none
select-text
select-all
select-auto
A.15.3 Pointer events
pointer-events-none
pointer-events-auto
A.16 可见性(Visibility)
visible
invisible
collapse
A.17 Scroll(滚动控制)
overflow-auto
overflow-hidden
overflow-scroll
scroll-smooth
snap-x
snap-center
A.18 响应式(Responsive)
Tailwind 所有类都支持:
sm:
md:
lg:
xl:
2xl:
例如:
sm:text-sm
md:text-base
lg:text-lg
xl:text-xl
A.19 状态变体(State Variants) — Hover、Focus、Group、Peer、ARIA、Data
Hover, Focus, Active…
hover:bg-blue-500
focus:ring
active:scale-95
focus-visible:ring-2
Group & Peer
group-hover:text-white
peer-focus:border-blue-500
peer-invalid:text-red-500
ARIA & Data 属性
aria-checked:bg-blue-500
data-[state=open]:rotate-180
(shadcn/ui 大量使用)
A.20 Arbitrary Values(任意值)
Tailwind 的所有体系最终都支持:
text-[32px]
w-[calc(100%-2rem)]
bg-[var(--primary)]
rounded-[10px]
grid-cols-[1fr_2fr]
这是 Tailwind 的终极扩展能力。
附录 A 总结
本扩展版附录在保留全部 A.1–A.20 类名速查手册的基础上,新增了以下五个深度技术主题:
- Design Token 定制 — 从
tailwind.config.js到 CSS 变量的完整映射流程,打通设计规范与工程实现。 - 暗色模式主题切换 —
darkMode: 'class'配合 CSS 变量实现三色态(亮/暗/跟随系统),并提供本地持久化方案。 - @layer @apply 组件库实战 — 用原子类封装可复用的 Button / Card / Modal,解决 Utility First 与组件化之间的张力。
- PostCSS 插件生态 — typography(排版)、forms(表单统一)、container-queries(容器查询)、line-clamp(文本截断)的完整用法。
- Tailwind v4 前瞻 — CSS-first 配置、@theme 变量系统、@utility 新指令,以及迁移评估建议。
同时,附录与站内多个专题深度关联:shadcn/ui 组件实践见 附录 B ,纯类名速查见 附录 C ,React 生态整合见 React 专题 ,Vue 状态管理见 Pinia 指南 ,Vue 路由布局见 Vue Router 指南 。
掌握以上内容后,你已具备从「原子类开发者」进阶为「设计系统架构师」的完整能力。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。