Utility-first 原子化思想

上一篇我们装好了环境。在开始系统学具体类之前,先花一篇讲清楚 Tailwind 的核心理念——"utility-first"。理解了这一层,后面看到一长串 class 就不会害怕,反而能体会它的精妙。

1. 传统 CSS 的写法:关注点分离

我们从入门就被教导"HTML 管结构、CSS 管样式、JS 管行为",这是著名的关注点分离(Separation of Concerns)原则。所以传统写法长这样:

<!-- 传统 CSS:HTML 管结构,CSS 管样式,关注点分离 -->
<button class="btn btn-primary">提交</button>

<style>
  .btn {
    padding: 8px 16px;
    border-radius: 6px;
    font-size: 14px;
    cursor: pointer;
  }
  .btn-primary {
    background: #3b82f6;
    color: white;
  }
  .btn-primary:hover {
    background: #2563eb;
  }
</style>

这种写法听起来很美,但实际项目一大就暴露问题:

2. Tailwind 的写法:样式就地

Tailwind 完全颠覆这个思路。它说:"关注点分离"只是手段,不是目的。真正的目的是"代码可维护"。把所有样式信息集中在元素上,反而更易维护:

<!-- Tailwind:把样式"就地"写在 class 里 -->
<button class="px-4 py-2 rounded-md text-sm cursor-pointer
               bg-blue-500 text-white hover:bg-blue-600">
  提交
</button>

每个 utility 类只做一件事,组合起来描述样式:

<!-- 每个 utility 类只做一件事(单一职责):
     px-4            => padding-left/right: 16px
     py-2            => padding-top/bottom: 8px
     rounded-md      => border-radius: 6px
     text-sm         => font-size: 14px
     bg-blue-500     => background: #3b82f6
     hover:bg-blue-600 => 鼠标悬停时 background: #2563eb
     像搭乐高一样组合 -->

3. 为什么这样更好?

Adam Wathan 在那篇著名的文章里逐步论证了这种"看似反模式"的写法实际上是更优的工程实践。核心理由有四:

4. 一个真实场景

来看一个"传统 CSS 越改越乱"的典型场景,对比 Tailwind 的处理方式:

<!-- 场景:同一个按钮,要在购物车页让背景变红色 -->
<!-- 传统做法:
     1. CSS 里加一个 .btn-danger { background: red; }
     2. 但购物车页想用红色,首页还想要蓝色
     3. 于是又有了 .btn-primary--cart 这种 BEM 变种
     4. 几个月后,类名爆炸 -->

<!-- Tailwind 做法:直接改 class,影响范围仅限当前元素 -->
<button class="px-4 py-2 rounded-md bg-red-500 text-white">
  删除
</button>

<!-- 其他位置的按钮完全不受影响 -->

Tailwind 的关键优势在于:局部修改就是局部的。不会因为加了一个红色按钮,而导致全局 CSS 文件膨胀、命名空间被污染。

5. "看起来很丑"是真的吗?

对 Tailwind 最常见的批评是"class 字符串太长、看着像垃圾代码"。这是一种视觉上的不适,不是工程上的缺陷。实际写起来你会发现:

6. 什么时候用 @apply 抽组件?

Tailwind 提供了 @apply 指令,允许你在 CSS 里把一组 utility 类"塞进"一个自定义类名里:

这是 Tailwind 留的"逃生口"——当一串 class 真的出现 3 次以上、语义明确(比如"主按钮")时,可以用 @apply 抽象成一个类。但 Adam Wathan 强烈建议克制使用:

具体怎么用、什么时候用,后面会有专门一篇讲。

7. 不适合的场景

诚实地说,Tailwind 不是银弹,有些场景不太合适:

小结

Utility-first 不是"把 CSS 写进 HTML"那么简单,它是一套用约束系统替代自由发挥的工程哲学。接受了这套理念,后面的具体类学起来会非常顺——因为它们都是高度规律化、可预测的。下一篇我们从最常用的"间距与尺寸"开始,正式进入类库的学习。

← 上一篇 环境安装与配置

下一篇 间距与尺寸

✈️💬