# Tailwind
|🚨 <span class="caution">CAUTION</span>|
|:---|
|本文以 Tailwind v4 為主|
## References
+ 📑 [**tailwindcss**](https://tailwindcss.com/docs)
+ 📑 [**@nuxt/tailwindcss**](https://tailwindcss.nuxtjs.org/)
## Installation
+ [Tailwind](https://tailwindcss.com/docs/installation/framework-guides) (各種框架)
+ [Tailwind CLI](https://tailwindcss.com/docs/installation/tailwind-cli) (Tailwind 4.0 之後是需要額外安裝的)
+ `.vscode/settings.json`
所有 CSS 檔視為 tailwindcss
```json
{
"files.associations": {
"*.css": "tailwindcss"
}
}
```
## Version 4
第四版在 2025/1/22 推出,改掉不少東西,詳見[此文](https://tailwindcss.com/blog/tailwindcss-v4)。
## Color
+ [all colors](https://tailwindcss.com/docs/colors)
## Config
在新推出的第四版中,取消掉過往的 `tailwind.config.js` 設定,改為 [CSS-first config](https://tailwindcss.com/blog/tailwindcss-v4#css-first-configuration) (在 `assets/css/main.css` 中設定)。
## Breakpoints
| Breakpoint prefix | Minimum width | CSS |
|-------------------|-----------------|----------------------------------|
| `sm` | 40rem *(640px)* | `@media (width >= 40rem) { ... }` |
| `md` | 48rem *(768px)* | `@media (width >= 48rem) { ... }` |
| `lg` | 64rem *(1024px)* | `@media (width >= 64rem) { ... }` |
| `xl` | 80rem *(1280px)* | `@media (width >= 80rem) { ... }` |
| `2xl` | 96rem *(1536px)* | `@media (width >= 96rem) { ... }` |
## Style
Tailwind 的樣式有分為 base、component、utilities 三個層級。
<mark>渲染順序:base → components → tailwind class → utilities → css class → inline style</mark>
如果要自定義功能的情況,起手式要在前面加上 `@layer`,告訴 css 檔要新增或覆寫哪一個圖層的內容,Tailwind 就會自動編譯,然後在裡面再撰寫想要的樣式內容。
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {}
@layer components {}
@layer utilities {}
```
### base
用來定義全域基本樣式。例如 h1、h2、ul、a 等。
概念有點像是 CSS reset,Tailwind 有提供一組基底樣式,\
稱為 [Preflight],基本上就是採用 [modern-normalize]。\
包含:`box-sizing: border-box`、img 是 `display: block`。
因為 Tailwind 已將預設樣式清除,使用 h1、h2 等字體大小就要重新設定。
```css
@layer base {
h1 {
@apply text-5xl font-bold text-red-500;
}
h2 {
font-size: 36px;
}
h3 {
@apply text-[23px];
}
a {
@apply text-amber-300;
}
}
```
### components
用來定義基本元件。
當網頁有元件相同時,可以把共同樣式拉出來,或是分頁有許多重複使用的功能也可以套用。
```html
<button class="py-2 px-4 bg-sky-500 text-white font-bold rounded-lg hover:bg-sky-700">
按鈕1
</button>
<button class="btn">
按鈕2
</button>
```
```css
@layer components {
.btn {
@apply py-2 px-4 bg-sky-500 text-white font-bold rounded-lg hover:bg-sky-700;
}
}
```
### utilities
自訂的 Tailwind class。
```css
@layer utilities {
.fade-in {
animation: fadeIn 1s ease-in-out;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
}
```
### variant
變體,即在某些情況時,改用另一種樣式。
包含各式 pseudo class、pseudo element、media query 等等。詳見[此文](https://tailwindcss.com/docs/hover-focus-and-other-states)。
除此之外,還包含了一些特殊的 variant。
黑暗模式要用到自訂變體,詳見 [@custom-variant](#@custom-variant-v4)。
+ `group`:當父元素觸發某 variant 時,其底下所有 `group-*` 也會觸發。
```html
<a href="#" class="group rounded-lg p-8">
<!-- ... -->
<span class="group-hover:underline">Read more…</span>
</a>
```
### arbitrary values
[隨意值](https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values),用中括號包著。
```html
<div class="top-[117px] lg:top-[344px]">
<!-- ... -->
</div>
```
```html
<div class="bg-[url('/what_a_rush.png')]">
<!-- ... -->
</div>
```
變數隨意值 `[var(...)]` 有個更短的縮寫 `(...)`。
```html
<div class="fill-(--my-brand-color) ...">
<!-- ... -->
</div>
```
## Directives
### `@apply`
可以把想要的樣式合併起來,必須要使用 Tailwind class。
官網建議:使用 `@apply` 的原因不要只是為了想讓 class 變短,且若大量使用 `@apply`的話:
+ 你會不斷想名稱去命名 class
+ CSS 會越寫會大包
+ 更改樣式會不斷來回做切換畫面
除非是重複性高,建議寫在 HTML,不然已經辜負 Tailwind 的初衷。
```css
h1 {
@apply text-5xl font-bold text-red-500;
}
```
### `@theme` (v4)
類似 `:root` 的全域變數,可覆蓋 Tailwind 預設變數,也可以自訂新變數。
第四版後不再使用 `theme()` + `tailwind.config.css` 的方式,改使用 `@theme`。
```css
@theme {
/* 覆寫 Tailwind class 原先的字體設定 */
--font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 這樣設定就能使用 text-tahiti 或 bg-midnight 等與顏色相關的 Tailwind class */
--color-midnight: #121063;
--color-tahiti: #3ab7bf;
--color-bermuda: #78dcca;
}
```
### `@plugins` (v4)
插件
```
@plugin "@tailwindcss/typography";
```
### `@custom-variant` (v4)
自訂變體。
`dark` : 黑暗模式 (自訂 variant),當父元素觸發某 dark 時,其底下所有 `dark-*` 也會觸發。
```css
@import "tailwindcss";
@custom-variant dark (&:where(.dark, .dark *)); // 自訂 variant
```
```html
<template>
<div id="app">
<input v-model="isDarkMode" type="checkbox">
<NuxtPage />
</div>
</template>
<script setup lang="ts">
const isDarkMode = ref(true)
onMounted(() => {
if (import.meta.client) {
isDarkMode.value = window.matchMedia('(prefers-color-scheme: dark)').matches
watchEffect(
() => document.documentElement.classList.toggle('dark', isDarkMode.value),
)
}
})
</script>
```
## Plugins
+ [**@tailwindcss/typography**](https://ithelp.ithome.com.tw/articles/10270442):一套預設舒適的字型排版
通常用在無法完全控制的 HTML 上 (比如 Markdown-based CMS,像是 `@nuxt/content`)
[Preflight]: https://tailwindcss.com/docs/preflight
[modern-normalize]: https://github.com/sindresorhus/modern-normalize