@theme 指令自定义设计令牌。在前面的学习中,你已经掌握了 HTML 和 CSS 基础(第 9-10 篇),知道如何用 class 选择器、盒模型和 Flexbox 来布局页面。传统 CSS 的写法是:先在 HTML 中定义语义化的 class 名,再在单独的 CSS 文件中为每个 class 编写样式规则。这种方式清晰但有痛点——每写一个组件就要起一批新的 class 名,CSS 文件不断膨胀,还经常遇到命名冲突和样式覆盖问题。
Tailwind CSS 提出了另一种思路:实用优先(utility-first)。它不让你写自定义 CSS 规则,而是提供一套预设的工具类(utility classes),每个类对应一个 CSS 属性值。你直接在 HTML 的 className 中组合这些工具类,就能构建出任何界面。
打个比方:传统 CSS 像 DIY 调色——你买来红黄蓝颜料,每次手动调配出需要的颜色;Tailwind 像一盒编号色铅笔——每个颜色都已经造好,你只要选择对应的编号就能上色,省去了调配过程,速度更快且颜色一致。
实现同一个按钮卡片,看看两种方式的差异:
传统方式需要 12 行 CSS + HTML 中引用 class 名;Tailwind 只需 3 行 HTML,工具类直接写在 className 中,无需额外 CSS 文件。p-6 表示 padding 1.5rem,rounded-lg 表示 8px 圆角,shadow-sm 表示小阴影——每个类名都是可读的语义缩写。
p-4 = padding 1rem,text-xl = font-size 1.25rem,mt-2 = margin-top 0.5rem。掌握这个命名规律后,大部分类名都能猜出来。截至 2026 年 8 月,Tailwind CSS 最新稳定版是 v4.3(2026 年 5 月发布)。相比 v3,v4 是一次底层重写,带来了几个关键变化:
| 特性 | v3 方式 | v4 方式 |
|---|---|---|
| 配置方式 | tailwind.config.js | CSS 中 @theme 指令 |
| CSS 导入 | @tailwind base/components/utilities | @import "tailwindcss" |
| 内容检测 | 手动配置 content 路径 | 自动检测模板文件 |
| 构建引擎 | JavaScript | Rust (Oxide 引擎) |
| 构建速度 | 基准 | 全量构建 5x,增量 100x |
v4 最大的变化是配置从 JavaScript 迁移到 CSS。你不再需要维护 tailwind.config.js 文件,而是在 CSS 中用 @theme 指令定义设计令牌。这意味着样式配置和 CSS 写在同一个文件中,上下文不割裂。
上一篇你学了 Next.js 的 App Router 和路由体系,现在把 Tailwind CSS 集成进去。有两种方式:新建项目时自带,或手动安装到已有项目。
create-next-app 默认就会集成 Tailwind v4,只需在交互提示中选择 Yes:
选择 Yes 后,create-next-app 会自动完成所有配置:安装 tailwindcss 和 @tailwindcss/postcss 包,配置 PostCSS,在 globals.css 中写入 @import "tailwindcss"。开箱即用。
如果已有 Next.js 项目想加入 Tailwind v4,需要三个步骤:安装依赖、配置 PostCSS、导入 CSS。
第 1 步:安装依赖包:
第 2 步:配置 PostCSS。在项目根目录创建或编辑 postcss.config.mjs:
tailwindcss 作为 PostCSS 插件名
@tailwindcss/postcss(带 @ 前缀和 / 分隔),这是 v4 专用的新包名
第 3 步:在 CSS 文件中导入 Tailwind。打开 src/app/globals.css,在文件顶部添加:
这一行替代了 v3 中的三行 @tailwind base / components / utilities 指令。v4 只需一个 @import,内部会自动展开为所有功能。
在 src/app/page.tsx 中写一个使用 Tailwind 类的组件:
运行 npm run dev 启动开发服务器,浏览器中应看到居中显示的青色粗体大字。如果文字没有样式,说明 PostCSS 配置有问题——回到第 2 步检查插件名是否正确。
Tailwind 的工具类数量超过一万个,但核心命名规律只有一套:属性缩写-比例值。掌握规律后,不需要记每一个类,遇到需求能直接推导出来。
所有间距类(padding、margin、gap)都基于 4px 基准。数字表示倍数,p-4 = padding 1rem (16px),p-6 = padding 1.5rem (24px):
| 类名 | CSS 值 | 说明 |
|---|---|---|
p-1 |
0.25rem (4px) | 最小内边距 |
p-4 |
1rem (16px) | 常用默认值 |
p-8 |
2rem (32px) | 宽松内边距 |
mt-2 |
margin-top: 0.5rem | 方向前缀 mt |
mx-auto |
margin: 0 auto | 水平居中 |
方向前缀:t top、b bottom、l left、r right、x 水平、y 垂直。例如 px-4 = padding-left + padding-right 均为 1rem。
| 分类 | 类名示例 | 对应 CSS |
|---|---|---|
| 显示 | flex / block / hidden |
display 属性 |
| 弹性布局 | items-center / justify-between |
align-items / justify-content |
| 宽高 | w-full / h-screen |
width:100% / height:100vh |
| 字号 | text-sm / text-xl / text-4xl |
0.875rem / 1.25rem / 2.25rem |
| 字重 | font-normal / font-bold |
400 / 700 |
| 圆角 | rounded / rounded-lg / rounded-full |
0.25rem / 0.5rem / 9999px |
| 阴影 | shadow-sm / shadow-md |
小阴影 / 中阴影 |
你已经知道工具类的命名规律了,现在用它们构建一个真实页面布局。目标是实现一个常见的导航栏 + 内容区结构:
逐行拆解关键类名的作用:
min-h-screen — 最小高度撑满视口(min-height: 100vh),保证页脚贴底
flex items-center justify-between — 导航栏两端对齐,垂直居中
px-4 py-2 — 按钮 padding 水平 1rem、垂直 0.5rem
max-w-2xl mx-auto — 内容区最大宽度 42rem (672px),水平居中
leading-relaxed — 行高 1.625,阅读更舒适
注意 bg-cyan-500 和 bg-gray-50 使用了 Tailwind 内置的颜色系统——颜色名 + 深度值,500 是标准色,50 是最浅档。后面章节会详细讲解颜色系统。
在第 10 篇 CSS 基础中学过 @media 查询实现响应式。Tailwind 把断点做成了类名前缀,不需要写媒体查询,直接在类名前加断点缩写即可。
| 前缀 | 最小宽度 | 对应设备 |
|---|---|---|
sm: |
640px | 大手机横屏 |
md: |
768px | 平板竖屏 |
lg: |
1024px | 笔记本 |
xl: |
1280px | 桌面显示器 |
2xl: |
1536px | 大屏显示器 |
断点前缀的写法是 断点:工具类,例如 md:text-xl 表示屏幕宽度 ≥768px 时字号变为 1.25rem。关键规则:无前缀的类在所有屏幕生效,带前缀的类只在该断点及以上生效(即 min-width 语义)。
解读:w-full(手机全宽)→ md:w-1/2(平板半宽)→ lg:w-1/3(桌面三分之一宽)。布局方向也随断点变化:flex-col(手机纵向排列)→ md:flex-row(平板横向排列)→ lg:flex-wrap(桌面换行排列)。三行类名替代了传统 CSS 中几十行媒体查询代码。
断点前缀控制的是屏幕尺寸变化时的样式,状态变体控制的是交互状态——鼠标悬停、聚焦、按下等。语法相同:状态:工具类。
这个按钮的状态链:默认 bg-cyan-500 → 悬停 hover:bg-cyan-600(加深一档)→ 按下 active:bg-cyan-700(再加深一档)→ 聚焦 focus:ring-2(显示聚焦环)。传统 CSS 需要写 :hover、:active、:focus 三个选择器块,Tailwind 全压在了一行 className 里。
v4 默认支持暗色模式,使用 dark: 前缀。当系统或浏览器启用暗色模式时,带 dark: 前缀的类会覆盖默认类:
md:hover:bg-cyan-600 表示:在 ≥768px 屏幕且鼠标悬停时背景变为 cyan-600。叠加顺序是断点在前、状态在后。Tailwind 内置了一套完整的调色板,覆盖 22 种颜色系列,每种从 50(最浅)到 950(最深)共 11 个梯度。使用方式:属性-颜色-梯度。
常用颜色系列:cyan(青)、blue(蓝)、green(绿)、red(红)、yellow(黄)、gray(灰)、purple(紫)、pink(粉)。梯度记忆:50 几乎透明、500 标准色、900 极深。特殊值 white 和 black 不带梯度号。
| 属性 | 类名 | CSS 值 |
|---|---|---|
| 字号 | text-base |
1rem (16px) |
| 字号 | text-2xl |
1.5rem (24px) |
| 字重 | font-medium |
font-weight: 500 |
| 行高 | leading-loose |
line-height: 2 |
| 字间距 | tracking-wide |
letter-spacing: 0.025em |
内置调色板可能不够用——项目有自己的品牌色、自定义字体、特定间距。v4 通过 @theme 指令在 CSS 中定义自定义令牌,这些令牌会自动生成对应的工具类。
定义后,你就能在 JSX 中使用 bg-brand、text-brand、border-brand 等工具类,效果等同于内置颜色。font-display 会生成 font-display 类。
:root 中定义的变量不会生成工具类
@theme {} 块内定义。@theme 内的变量会生成工具类,:root 内的只是普通 CSS 变量,两者作用不同
tailwind.config.js,但 v4 默认不再使用这个文件。如果你看到教程提到 tailwind.config.js,说明它是 v3 的教程,配置方法已过时。
@theme 块中。如果确实需要 JS 配置(如动态生成主题),v4 支持 @config 指令引入旧式配置文件,但这是兼容方案,不推荐新项目使用。
@layer components 或直接抽取 React 组件。例如把按钮样式封装为 Button 组件,内部组合 Tailwind 类,外部调用只需 <Button variant="primary">。
preflight 功能会在导入时自动重置浏览器默认样式(类似 normalize.css),包括清除 margin、统一 box-sizing: border-box、设置图片为 display: block。所以你在 HTML 中看到的默认间距可能和预期不同——这是正常的。