前端开发2026-02-10 15 分钟

为什么我不再手写 CSS,而是全面拥抱 Tailwind

曾经我也觉得把一堆 class 写在 HTML 里很丑,直到我发现它的开发效率有多高。本文包含多个交互式演示,让你亲身体验两种方式的差异。

记得第一次看到 Tailwind 的代码时,我的内心是拒绝的:「这不就是行内样式吗?这也太乱了吧!」但为了赶项目进度,我硬着头皮试了一下。结果那一周,我居然提前完成了所有的 UI 页面。从那一刻起,我知道我回不去了。

以前写 CSS 最痛苦的是什么?起名字!header-wrapper-inner-container,这种名字我想想都头疼。现在好了,直接 flex justify-between items-center,不仅不用起名,连 CSS 文件都不用切。

实战对比:一张卡片的两种写法

来看看同一个用户卡片组件,用传统 CSS 和 Tailwind 分别怎么写。点击标签切换查看代码和效果:

UserCard.vue (1 个文件)
<!-- 只需 1 个文件,0 行自定义 CSS -->
<div class="flex items-center gap-4
  p-4 rounded-xl
  bg-white shadow-md
  hover:shadow-lg transition">
  <img class="w-12 h-12 rounded-full
    ring-2 ring-blue-100"
    src="avatar.jpg" />
  <div>
    <h3 class="font-semibold
      text-gray-900">张三</h3>
    <p class="text-sm
      text-gray-500">前端开发</p>
  </div>
  <span class="ml-auto text-xs px-2.5
    py-1 rounded-full
    bg-green-50 text-green-600">
    在线
  </span>
</div>
实时预览

张三

前端开发工程师

在线
1
文件数
~15
代码行数
0
自定义类名

设计约束:再也不纠结间距了

Tailwind 最容易被忽略的核心价值是它提供的设计约束系统。不再纠结 padding 是 10px 还是 12px,直接从预设的间距系统中选择。点击下方的数值感受一下:

内容区域
16px
p-4 = padding: 16px

基于 4px 的倍数系统 — 整个团队的间距从此保持一致,设计师和开发者说同一种语言。

响应式布局:一行搞定三种屏幕

传统 CSS 写响应式需要一堆 @media 查询。Tailwind 只需要加个前缀,拖动下方滑块感受一下:

Tailwind 写法
<div class="grid
  grid-cols-1
  md:grid-cols-2
  lg:grid-cols-3
  gap-4">
1 行 class 搞定
传统 CSS 写法
.grid { display: grid; gap: 1rem; }
@media (min-width: 768px) {
  .grid { grid-template-columns:
    repeat(2, 1fr); }
}
@media (min-width: 1024px) {
  .grid { grid-template-columns:
    repeat(3, 1fr); }
}
需要 3 段代码
拖动滑块模拟不同屏幕宽度
100%
MobileTablet (md:)Desktop (lg:)
1
Card 1
2
Card 2
3
Card 3
4
Card 4
5
Card 5
6
Card 6

状态变体:hover、focus、active 一气呵成

传统 CSS 需要为每个状态单独写选择器。Tailwind 用前缀直接声明。把鼠标移到下方按钮上试试:

👆 将鼠标移到按钮上查看 Tailwind 状态变体效果

传统 CSS 需要这样写:

.btn { background: #3b82f6; transition: all 0.2s; }
.btn:hover { background: #2563eb; }
.btn:active { background: #1d4ed8; transform: scale(0.95); }
.btn:focus { outline: none; box-shadow: 0 0 0 2px #93c5fd; }
.btn .icon { transition: transform 0.2s; }
.btn:hover .icon { transform: translateX(4px); }

暗色模式:一个前缀就搞定

不需要维护两套 CSS 变量,不需要写复杂的选择器。只需要 dark: 前缀,点击切换感受一下:

交互演示
O
OneKit 团队
3 分钟前

使用 Tailwind 的 dark: 前缀,只需在类名前加上 dark: 就能定义暗色模式的样式。不需要写任何额外的 CSS 选择器!

<div class="bg-white dark:bg-gray-800">
  <h3 class="text-gray-900 dark:text-white">标题</h3>
  <p class="text-gray-600 dark:text-gray-300">内容</p>
</div>

常用组件速览:全部用 Tailwind 完成

下面这些组件全部用纯 Tailwind 类实现,没有一行自定义 CSS。这就是我说的「不用切文件」的快感:

提示框 Alert
提示信息
这是一条普通提示,使用 bg-blue-50 + border-blue-200 实现。
操作成功
文件已成功上传,换成绿色系即可。
出错了
请检查网络连接后重试,红色系警告同理。
徽章与头像组
TypeScriptVue 3TailwindViteNuxt
A
B
C
D
+5
表单组件
定价卡片
免费版
¥0/月
  • 基础工具
  • 本地处理
  • 批量操作
推荐
专业版
¥29/月
  • 所有工具
  • 批量操作
  • 优先支持

Tailwind CSS v4:不仅是快,更是进化

v4 的 Oxide 引擎用 Rust 重写,构建速度快到离谱。更重要的是它拥抱了原生 CSS 的最新特性:

1 CSS 优先的配置

抛弃 tailwind.config.js,直接在 CSS 文件里配置主题:

@theme {
  --color-neon-pink: oklch(0.5 0.3 340);
  --font-display: "Satoshi", "sans-serif";
  --breakpoint-3xl: 1920px;
}

2 原生 3D 变换

直接在 class 中使用 3D 变换,不需要额外 CSS:

<div class="perspective-1000">
  <div class="transform-3d rotate-x-12 rotate-y-24
    hover:rotate-x-0 hover:rotate-y-0 transition-transform">
    <!-- 3D 卡片内容 -->
  </div>
</div>

3 容器查询 (Container Queries)

组件化开发的终极杀器——根据父容器大小调整样式:

<div class="@container">
  <div class="flex flex-col @md:flex-row">
    <!-- 当父容器宽度 >= md 时,变为水平排列 -->
  </div>
</div>

4 构建性能对比

Tailwind v3 (PostCSS)380ms
Tailwind v4 (Oxide / Rust)8ms

v4 的构建速度快了约 47 倍,几乎瞬间完成。

CSS 产物体积:用多少打包多少

Tailwind 只会把你实际使用的类打包进最终产物。和传统 CSS 框架动辄几百 KB 的体积相比,差距是惊人的:

Bootstrap 5 (完整)227 KB
手写 CSS(中型项目)~80 KB
Tailwind(按需生成 + gzip)~10 KB

因为 Tailwind 的原子类高度复用,gzip 压缩后体积极小。

你可能会有的疑问

「class 太多了,HTML 不会很乱吗?」

刚开始确实会有这种感觉。但实际上,把样式和结构放在一起意味着你在一个地方就能看到一切——不需要在 HTML 和 CSS 文件之间来回跳转。而且搭配组件化开发(Vue、React),每个组件的模板不会很长,class 的长度反而帮你直观理解每个元素的样式。

「这不就是行内样式吗?」

看起来像,但本质完全不同。行内样式不支持 hover、focus、响应式、暗色模式等伪类和媒体查询,也没有设计约束。Tailwind 的类是有限的、可组合的设计 token,而行内样式是无限的、随意的。

「如果我要复用样式怎么办?」

在组件化框架中,你复用的是组件而不是 CSS 类。一个 <Button> 组件天然封装了所有样式。如果确实需要复用类的组合,可以用 @apply 指令(但建议谨慎使用)。

「学习成本高吗?」

Tailwind 的类名几乎就是 CSS 属性名的缩写——flex = display: flexpt-4 = padding-top: 1rem。如果你已经熟悉 CSS,学 Tailwind 基本上是零成本。搭配 IDE 插件的自动补全,你几乎不需要查文档。

速查对照表

常见 CSS 属性和 Tailwind 类的对应关系,帮你快速上手:

CSS 属性Tailwind 类说明
display: flexflex弹性布局
display: gridgrid grid-cols-3网格布局
justify-content: centerjustify-center主轴居中
padding: 1remp-44 = 16px = 1rem
margin-top: 0.5remmt-22 = 8px = 0.5rem
border-radius: 0.5remrounded-lg预设圆角
font-weight: 700font-bold加粗字体
@media (min-width: 768px)md:响应式前缀
:hover { ... }hover:悬浮状态前缀

总结:拥抱变化

工具的演进总是为了解决效率问题。Tailwind 看起来「反直觉」,但它确实解决了 CSS 维护难、命名难、团队不一致的痛点。

如果你还在犹豫,不妨在一个小项目中试一试。大部分开发者(包括我)的心路历程都是:

这也太丑了吧好像还挺快的真香!回不去了

用 Tailwind 构建的工具,免费体验

OneKit 全站使用 Tailwind CSS + Vue 3 构建,无需注册即可使用