測驗:為什麼選擇 Tailwind CSS?
共 5 題,點選答案後會立即顯示結果
1. 什麼是 Utility-First CSS 的核心概念?
2. 以下哪個是傳統 CSS 開發的常見痛點?
3. 在 Tailwind CSS 中,p-4 這個 class 代表什麼?
4. Tailwind CSS 與 Bootstrap 的主要差異是什麼?
5. 以下哪種情況最適合使用 Tailwind CSS?
本文是「Tailwind CSS 教學」系列第 1 篇,共 4 篇。
難度:L2-進階
前言
你可能遇過這種情況:專案越寫越大,CSS 檔案也越來越肥。每次要改樣式,都要在 HTML 和 CSS 檔案之間跳來跳去,而且永遠想不出好的 class 名稱。
Tailwind CSS 用一種完全不同的方式解決這個問題。它叫做「Utility-First CSS」。
這篇文章會讓你理解:
- 什麼是 Utility-First CSS
- 傳統 CSS 方法的痛點
- Tailwind CSS 跟其他方案的差異
- 什麼專案適合用 Tailwind
什麼是 Utility-First CSS?
一句話說明
直接在 HTML 上用小型 class 組合出樣式,不用另外寫 CSS。
最小範例
<!-- 傳統 CSS 寫法 -->
<div class="card">Hello</div>
<style>
.card {
padding: 16px;
background-color: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
</style>
Code language: HTML, XML (xml)<!-- Tailwind CSS 寫法 -->
<div class="p-4 bg-white rounded-lg shadow">Hello</div>
Code language: HTML, XML (xml)逐個 class 翻譯
| Tailwind class | 對應的 CSS | 白話翻譯 |
|---|---|---|
p-4 |
padding: 1rem |
四邊留白 16px |
bg-white |
background-color: white |
白色背景 |
rounded-lg |
border-radius: 0.5rem |
圓角 8px |
shadow |
box-shadow: ... |
小陰影 |
重點:每個 class 只做一件事,組合起來就是完整樣式。
傳統 CSS 的三大痛點
痛點 1:取名困難
/* 這個 class 該叫什麼? */
.card { }
.card-wrapper { }
.card-container { }
.card-box { }
.user-card { }
.profile-card { }
Code language: CSS (css)你花在想名字的時間,可能比寫樣式還久。而且團隊裡每個人的命名習慣都不同。
痛點 2:CSS 越來越肥
傳統做法會讓 CSS 檔案不斷膨脹:
/* 專案初期 */
.card { padding: 16px; }
.button { padding: 8px 16px; }
/* 三個月後 */
.card { padding: 16px; }
.card-large { padding: 24px; }
.card-small { padding: 8px; }
.button { padding: 8px 16px; }
.button-large { padding: 12px 24px; }
.nav-item { padding: 8px 16px; } /* 跟 .button 一樣但不敢共用 */
Code language: CSS (css)每次新需求就加新 class,但很少有人敢刪舊的,因為不知道哪裡在用。
痛點 3:改 HTML 要跳到 CSS 檔
1. 在 HTML 看到一個元素想改樣式
2. 找到它的 class 名稱
3. 切到 CSS 檔案
4. 搜尋這個 class
5. 改完再切回 HTML 確認
Code language: JavaScript (javascript)這個流程每改一次樣式就要重複一遍。
Tailwind CSS 怎麼解決這些問題?
解法 1:不用取名
<!-- 不需要想 class 名稱 -->
<div class="p-4 bg-white rounded-lg shadow">
<h2 class="text-lg font-bold mb-2">標題</h2>
<p class="text-gray-600">內容</p>
</div>
Code language: HTML, XML (xml)直接描述樣式本身,不用發明語義化名稱。
解法 2:CSS 不會膨脹
Tailwind 的 class 是固定的。p-4 就是 padding: 1rem,不會因為專案變大而改變。
而且 Tailwind 會自動掃描你的 HTML,只輸出有用到的 class,沒用到的不會出現在最終的 CSS 裡。
解法 3:不用切換檔案
樣式直接寫在 HTML 上,改完立刻看到效果。
<!-- 想讓文字大一點?直接改 -->
<h2 class="text-lg">標題</h2>
<h2 class="text-xl">標題</h2> <!-- 改這裡就好 -->
Code language: HTML, XML (xml)Tailwind CSS vs 其他方案
比較表
| 方案 | 命名方式 | CSS 膨脹 | 學習曲線 | 適合專案 |
|---|---|---|---|---|
| 傳統 CSS | 自己取名 | 會膨脹 | 低 | 小型專案 |
| Bootstrap | 預設元件 | 引入整包 | 低 | 快速原型 |
| CSS-in-JS | 不用取名 | 按需載入 | 中 | React 專案 |
| Tailwind CSS | 不用取名 | 按需載入 | 中 | 各種專案 |
Tailwind vs Bootstrap
<!-- Bootstrap:用預設好的元件樣式 -->
<button class="btn btn-primary btn-lg">送出</button>
<!-- Tailwind:自己組合樣式 -->
<button class="px-6 py-3 bg-blue-500 text-white rounded-lg hover:bg-blue-600">
送出
</button>
Code language: HTML, XML (xml)差異:
- Bootstrap 給你現成的「按鈕長這樣」
- Tailwind 給你積木讓你自己組
什麼時候選 Bootstrap:
- 不在乎設計是否獨特
- 要最快有個能用的介面
什麼時候選 Tailwind:
- 有自己的設計稿要實作
- 需要高度客製化
Tailwind vs CSS-in-JS (styled-components)
// CSS-in-JS:樣式寫在 JS 裡
const Button = styled.button`
padding: 12px 24px;
background: blue;
color: white;
`;
// Tailwind:樣式寫在 class 裡
<button className="px-6 py-3 bg-blue-500 text-white">送出</button>
Code language: JavaScript (javascript)差異:
- CSS-in-JS 可以用 JS 變數,適合動態樣式
- Tailwind 不用多裝套件,純 HTML/CSS
什麼時候選 CSS-in-JS:
- 需要大量動態樣式(根據 props 改變)
- 團隊已經熟悉這個做法
什麼時候選 Tailwind:
- 樣式大多是靜態的
- 想要統一的設計規範
適用場景分析
適合用 Tailwind 的情況
| 情況 | 原因 |
|---|---|
| 有設計稿要切版 | 可以精確對應設計 |
| 團隊協作專案 | 統一的 class 命名 |
| 需要快速迭代 | 改樣式不用切檔案 |
| 想要一致的設計系統 | 內建間距、顏色規範 |
不太適合的情況
| 情況 | 原因 |
|---|---|
| HTML 不能改 | 沒辦法加 class |
| 極簡單的單頁 | 殺雞用牛刀 |
| 團隊排斥 class 太長 | 會有適應問題 |
快速體驗:你的第一個 Tailwind 元件
不用安裝,直接在 Tailwind Play 試試:
<div class="min-h-screen bg-gray-100 flex items-center justify-center">
<div class="bg-white p-8 rounded-xl shadow-lg max-w-md">
<h1 class="text-2xl font-bold text-gray-800 mb-4">
歡迎使用 Tailwind CSS
</h1>
<p class="text-gray-600 mb-6">
這是你的第一個 Tailwind 元件,
試著改改看這些 class!
</p>
<button class="w-full bg-blue-500 text-white py-3 rounded-lg hover:bg-blue-600 transition">
開始學習
</button>
</div>
</div>
Code language: HTML, XML (xml)試著改這些看看
| 想要的效果 | 改成 |
|---|---|
| 背景改深色 | bg-gray-100 -> bg-gray-900 |
| 按鈕改綠色 | bg-blue-500 -> bg-green-500 |
| 圓角改更圓 | rounded-xl -> rounded-3xl |
| 陰影改大 | shadow-lg -> shadow-2xl |
Vibe Coder 檢查點
看到 AI 寫的 Tailwind 程式碼時確認:
- [ ] 這些 class 的效果我大概知道嗎?(不用全背,知道
p-是 padding、m-是 margin 就好) - [ ] 有沒有重複的 class 可以抽成 component?
- [ ] 響應式設計有處理嗎?(
sm:、md:、lg:開頭的 class)
小結
這篇介紹了 Tailwind CSS 的核心概念:
- Utility-First CSS:用小型 class 組合樣式
- 解決的問題:命名困難、CSS 膨脹、檔案切換
- 與其他方案的差異:比 Bootstrap 更彈性、比 CSS-in-JS 更簡單
- 適用場景:有設計稿、團隊協作、需要快速迭代
下一篇會介紹 Tailwind CSS 的安裝與環境設定,讓你在自己的專案裡開始使用。
延伸閱讀
- Tailwind CSS 官網 – 官方文件
- Tailwind Play – 線上試玩
- Tailwind UI – 官方元件範例(部分免費)
進階測驗:Tailwind CSS 實戰應用
共 5 題,包含情境題與錯誤診斷題。
1. 你剛加入一個新團隊,PM 說:「我們有設計師給的完整設計稿,需要在兩週內切出可運作的前端,而且之後會頻繁調整樣式。」情境題
考量這個專案需求,最適合的 CSS 方案是?
2. 你正在維護一個三年前建立的專案,CSS 檔案已經有 5000 行,而且沒人敢刪任何 class,因為不確定哪裡在用。情境題
如果要重構這個專案的樣式架構,Tailwind CSS 能解決的核心問題是?
3. 新同事看到你的 Tailwind 程式碼後說:「這跟 inline style 有什麼差別?都是把樣式直接寫在 HTML 上,這樣不是很亂嗎?」錯誤診斷
這個說法有什麼問題?
4. 客戶說:「我們用的是第三方 CMS,HTML 結構是固定的,沒辦法加自訂的 class。」情境題
面對這個情況,你應該建議?
5. 看到以下 Tailwind 程式碼,身為 Vibe Coder 應該確認什麼?錯誤診斷
這段程式碼最該注意的問題是?