Utility-First 設計哲學——從語意化到功能化
傳統 CSS 開發流程(Semantic CSS)中,我們習慣先命名 HTML 元素(例如 .card、.button-primary),再為其撰寫 CSS 規則。這種「語意化命名」雖然在小專案中直觀,但隨著專案增長,會面臨命名困難(Naming is hard)、CSS 體積膨脹與修改副作用三大痛點。你往往不敢刪除舊的 CSS,因為不確定是否會影響其他頁面,導致 CSS 檔案只增不減。
Tailwind CSS 採用 Utility-First(功能優先)思路——每個 class 只負責一個單一的 CSS 屬性。你不再需要為了解決「這個容器該叫什麼」而煩惱,而是直接在 HTML 標籤上組合預設的功能類別。這種方式將「關注點分離(Separation of Concerns)」從「技術層面(HTML 與 CSS 分開)」轉向了「組件層面(標記與樣式結合)」。
<!-- ❌ 傳統方式:需維護一個獨立的 .user-card CSS 規則 -->
<div class="user-card">
<img src="..." class="avatar">
<h2>User Name</h2>
</div>
<!-- ✅ Tailwind 方式:樣式與結構合一,無需額外 CSS 命名 -->
<div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-lg flex items-center space-x-4 dark:bg-gray-800">
<div class="shrink-0">
<img class="h-12 w-12 rounded-full" src="..." alt="Avatar">
</div>
<div>
<div class="text-xl font-medium text-black dark:text-white">User Name</div>
<p class="text-slate-500 dark:text-slate-400">You have a new message!</p>
</div>
</div>
- 停止在命名上浪費時間:不用再想
card-inner-wrapper-v2這種無意義的名字。 - CSS 停止增長:因為所有樣式都是複用既有的 utility,即使新增 100 個頁面,CSS bundle 大小也幾乎保持不變。
- 修改更有自信:在 HTML 上改動樣式,絕對不會影響到其他標籤,徹底解決「改 A 壞 B」的副作用。
初次使用時可能會覺得 HTML 變醜了,但這其實是「所見即所得」的優點。一旦習慣,你會發現這比在 HTML 與 CSS 檔案間來回切換要快得多。
JIT (Just-In-Time) 引擎——無限靈活的關鍵
Tailwind CSS v3 起預設使用 JIT 編譯引擎。舊版 Tailwind 需要預先產生數萬個 class(即使你沒用到),這導致開發時 CSS 檔案異常巨大。JIT 則完全相反:
- 按需生成:它會掃描你所有的原始碼(HTML, JS, Vue, React),只有在你用到某個 class 時,它才會即時將其編譯進 CSS 檔案中。
- 任意值支援(Arbitrary Values):如果你需要一個非標準的間距或顏色,可以直接寫成
top-[117px]或bg-[#bada55],JIT 會為你動態生成這個 class。 - 效能極致:開發與生產環境的 CSS 大小几乎一致(通常只有 10KB-50KB),大幅提升網頁載入速度。
<!-- 使用任意值語法 --> <div class="w-[32.5rem] h-[calc(100vh-80px)] bg-[#123456] opacity-[.08]"> JIT 會即時生成對應的樣式規則 </div>
強大的變體系統(Variant Stack)
Tailwind 透過「前綴」來優雅地處理狀態。你可以將多個前綴疊加,輕鬆實作複雜的互動邏輯與深色模式:
互動狀態(Interactive States)
支援 hover:、focus:、active:、visited: 等。例如:hover:scale-105 active:bg-blue-700。
響應式斷點(Responsive Breakpoints)
基於行動優先原則。例如:w-full md:w-1/2 lg:w-1/3。
深色模式(Dark Mode)
使用 dark: 前綴。例如:bg-white dark:bg-black text-slate-900 dark:text-slate-100。
父元素/同級狀態(Group & Peer)
當父元素被 hover 時改變子元素樣式(group-hover:),或根據同級 input 勾選狀態改變標籤樣式(peer-checked:)。
<!-- 複合變體範例 --> <button class="dark:md:hover:bg-fuchsia-600 ..."> 這代表:在深色模式下、且是桌面版寬度時、被 hover 的背景色 </button>
響應式設計策略
Tailwind 採用「行動優先(Mobile-First)」策略。這意味著:
- 沒有前綴的 class(如
text-center)適用於所有螢幕尺寸。 - 加上斷點前綴的 class(如
md:text-left)代表「在該尺寸以上」生效。
預設斷點如下(皆可自訂):
sm: 640px | md: 768px | lg: 1024px | xl: 1280px | 2xl: 1536px
<!-- 手機 1 欄,平板 2 欄,桌面 3 欄 --> <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> ... </div>
約束型設計系統(Constraint-based Design)
Tailwind 不只是工具,它是一套**經過校準的設計規範**。它限制你不能隨意設定 margin: 13px 或 color: #1a2b3c,而是引導你從一套美觀且一致的 Token 中做選擇:
- 間距系統:基於 4px (0.25rem) 為基數的刻度,確保元素間的呼吸感一致。
- 專業色盤:內建 22 種色系,每種皆經過專業對比度調校,確保可讀性與視覺協調。
- 排版刻度:從
text-xs到text-9xl的排版級數,確保層次清晰。 - 自訂能力:你可以在
tailwind.config.js中輕鬆擴充你的品牌色或字體,將你的設計規範變成程式碼。