Tailwind CSS 進階技巧

Tailwind CSS 進階技巧
Ian Chou
Ian Chou

深入了解 Tailwind CSS 的進階使用技巧,包括自定義類別、組件化和效能優化。

Tailwind CSSCSSFrontend

Tailwind CSS 進階技巧(v4 全新升級)

Tailwind CSS 徹底改變了我們編寫 CSS 的方式。透過實用優先(utility-first)的方法,我們可以快速構建美觀的介面。本文將分享 Tailwind CSS v4 的最新特性與進階技巧,幫助你更有效地使用這個強大的框架。


Tailwind CSS v4 亮點與升級須知

2025 年最新版本 Tailwind CSS v4 已正式發布,帶來許多重大升級:

  • Node.js 20+ 強制要求:安裝 v4 前請升級 Node 至 20 以上。
  • 全新 CSS Layer 架構:Tailwind v4 採用 CSS Layer,極大提升組件覆蓋與樣式隔離能力。
  • 預設色盤更新:預設色彩更現代、更易用,色階更細緻。
  • 升級工具自動化:官方提供 npx @tailwindcss/upgrade,一鍵升級 v3→v4。
  • 更快的建構效能:更佳的 Purge/Tree-shaking,生產環境 CSS 更小。
  • 移除舊瀏覽器支援:v4 僅支援 Safari 16.4+、Chrome 111+、Firefox 128+。

升級建議與常見坑

  • 先備份再升級,建議新建分支測試。
  • 執行升級工具
    npx @tailwindcss/upgrade
    
  • 檢查 tailwind.config.js:v4 配置更簡潔,部分舊選項已棄用。
  • PostCSS Plugin 變更:v4 的 PostCSS plugin 改為 @tailwindcss/postcss,移除 autoprefixer、postcss-import。
  • 自訂色彩需調整:如有自訂色盤,請參考新版預設色系對應。
  • 瀏覽器支援:如需支援舊瀏覽器,請暫留 v3.4。

官方升級指南


1. 自定義顏色系統(v4 新色盤)

建立一致的顏色系統是設計的關鍵。Tailwind v4 的預設色盤已全新升級,建議盡量沿用新版色彩,若需自訂可這樣擴充:

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        brand: {
          50: '#f0f9ff',
          100: '#e0f2fe',
          200: '#bae6fd',
          300: '#7dd3fc',
          400: '#38bdf8',
          500: '#0ea5e9',
          600: '#0284c7',
          700: '#0369a1',
          800: '#075985',
          900: '#0c4a6e',
        },
        // 語義化顏色
        primary: 'var(--color-primary, #0ea5e9)',
        secondary: 'var(--color-secondary, #64748b)',
        success: 'var(--color-success, #10b981)',
        warning: 'var(--color-warning, #f59e0b)',
        danger: 'var(--color-danger, #ef4444)',
      }
    }
  }
}

v4 建議用 CSS 變數搭配 Tailwind,方便主題切換與動態色彩。

使用自定義顏色:

<button className="bg-brand-500 hover:bg-brand-600 text-white px-4 py-2 rounded">
  品牌按鈕
</button>

<div className="bg-primary text-white p-4">
  主要內容區域
</div>

2. 組件化重複的樣式(@apply 與 @layer)

雖然 Tailwind 是實用優先的,但重複的樣式組合還是應該抽取出來:

/* styles.css */
@layer components {
  .btn-primary {
    @apply bg-primary text-white px-4 py-2 rounded shadow hover:bg-primary/90;
  }
  .card {
    @apply rounded-xl shadow p-6 bg-white border border-gray-100;
  }
}

直接在 JSX 使用:

<button className="btn-primary">主要按鈕</button>
<div className="card">內容卡片</div>

v4 的 @layer 支援更強,能有效避免樣式覆蓋問題。

/* styles/components.css */
@layer components {
  .btn {
    @apply px-4 py-2 rounded font-medium transition-colors;
  }
  
  .btn-primary {
    @apply bg-blue-500 text-white hover:bg-blue-600;
  }
  
  .btn-secondary {
    @apply bg-gray-200 text-gray-800 hover:bg-gray-300;
  }
  
  .card {
    @apply bg-white rounded-lg shadow-md p-6;
  }
  
  .input {
    @apply border border-gray-300 rounded px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500;
  }
}

3. 響應式設計模式

Tailwind 的響應式設計非常直觀:

<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
  {/* 在小螢幕上單列,中等螢幕雙列,大螢幕三列 */}
</div>

<div className="text-sm md:text-base lg:text-lg">
  {/* 文字大小隨螢幕尺寸增加 */}
</div>

<div className="hidden md:block">
  {/* 只在中等螢幕及以上顯示 */}
</div>

<div className="md:hidden">
  {/* 只在小螢幕顯示 */}
</div>

4. 使用容器查詢 (Container Queries)

Tailwind CSS 支援容器查詢,這是一個強大的功能:

<div className="@container">
  <div className="@lg:flex @lg:gap-4">
    <div className="@lg:w-1/3">側邊欄</div>
    <div className="@lg:w-2/3">主要內容</div>
  </div>
</div>

設定容器查詢:

// tailwind.config.js
module.exports = {
  plugins: [
    require('@tailwindcss/container-queries'),
  ],
}

5. 動畫和過渡效果

創建平滑的動畫:

// 簡單的懸停效果
<button className="transform transition hover:scale-105 active:scale-95">
  按鈕
</button>

// 自定義動畫
<div className="animate-pulse">載入中...</div>

// 延遲和持續時間
<div className="transition-all duration-300 delay-150">
  動畫元素
</div>

自定義動畫:

// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      animation: {
        'spin-slow': 'spin 3s linear infinite',
        'bounce-slow': 'bounce 2s infinite',
      },
      keyframes: {
        wiggle: {
          '0%, 100%': { transform: 'rotate(-3deg)' },
          '50%': { transform: 'rotate(3deg)' },
        }
      }
    }
  }
}

6. Dark Mode 支援

實現深色模式:

// 基於系統偏好
<div className="bg-white dark:bg-gray-800 text-gray-900 dark:text-white">
  自動切換深色模式
</div>

// 手動控制
<div className="dark:bg-gray-800">
  手動深色模式
</div>

配置深色模式:

// tailwind.config.js
module.exports = {
  darkMode: 'class', // 或 'media' 用於系統偏好
  // ...
}

7. 使用 JIT 模式的任意值

JIT 模式允許使用任意值:

<div className="top-[117px] left-[calc(50%-4rem)]">
  精確定位
</div>

<div className="bg-[#1da1f2] text-[22px]">
  自定義顏色和大小
</div>

<div className="grid grid-cols-[1fr_500px_2fr]">
  自定義網格佈局
</div>

8. 狀態變體和群組

處理複雜的互動狀態:

// 群組懸停
<div className="group">
  <h3 className="group-hover:text-blue-500">標題</h3>
  <p className="group-hover:underline">內容</p>
</div>

// Peer 修飾符
<input type="checkbox" className="peer" />
<div className="hidden peer-checked:block">
  勾選時顯示
</div>

// 焦點內狀態
<div className="has-[:focus]:ring-2 has-[:focus]:ring-blue-500">
  <input type="text" />
</div>

9. 效能優化

PurgeCSS 配置

確保正確配置 content 選項:

// tailwind.config.js
module.exports = {
  content: [
    './src/**/*.{js,jsx,ts,tsx,mdx}',
    './components/**/*.{js,jsx,ts,tsx}',
    // 包含所有使用 Tailwind 類的檔案
  ],
  // ...
}

避免動態類名

// 不好
<div className={`text-${color}-500`}>文字</div>

// 好
const colorClasses = {
  red: 'text-red-500',
  blue: 'text-blue-500',
  green: 'text-green-500',
}
<div className={colorClasses[color]}>文字</div>

10. 實用的設計模式

卡片佈局

<div className="max-w-sm rounded overflow-hidden shadow-lg">
  <img className="w-full" src="/img/card-top.webp" alt="圖片" />
  <div className="px-6 py-4">
    <div className="font-bold text-xl mb-2">標題</div>
    <p className="text-gray-700 text-base">
      內容描述...
    </p>
  </div>
  <div className="px-6 pt-4 pb-2">
    <span className="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2">
      #標籤1
    </span>
  </div>
</div>

表單設計

<form className="w-full max-w-lg">
  <div className="flex flex-wrap -mx-3 mb-6">
    <div className="w-full md:w-1/2 px-3 mb-6 md:mb-0">
      <label className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2">
        姓名
      </label>
      <input 
        className="appearance-none block w-full bg-gray-200 text-gray-700 border rounded py-3 px-4 mb-3 leading-tight focus:outline-none focus:bg-white" 
        type="text" 
        placeholder="Jane"
      />
    </div>
  </div>
</form>

導航列

<nav className="flex items-center justify-between flex-wrap bg-teal-500 p-6">
  <div className="flex items-center flex-shrink-0 text-white mr-6">
    <span className="font-semibold text-xl tracking-tight">Logo</span>
  </div>
  <div className="block lg:hidden">
    <button className="flex items-center px-3 py-2 border rounded text-teal-200 border-teal-400 hover:text-white hover:border-white">
      <svg className="fill-current h-3 w-3" viewBox="0 0 20 20">
        <path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z"/>
      </svg>
    </button>
  </div>
  <div className="w-full block flex-grow lg:flex lg:items-center lg:w-auto">
    <div className="text-sm lg:flex-grow">
      <a href="#" className="block mt-4 lg:inline-block lg:mt-0 text-teal-200 hover:text-white mr-4">
        文檔
      </a>
    </div>
  </div>
</nav>

結論

Tailwind CSS 不僅是一個 CSS 框架,更是一種思考介面設計的新方式。通過掌握這些進階技巧,你可以:

  • 多用 @layer 組件化樣式
  • 善用預設與自定義色盤
  • 結合動態 class、條件渲染
  • 注重無障礙(a11y)與性能最佳化
  • 定期升級並檢查官方升級指南

延伸閱讀:

Thanks for reading!

Found this article helpful? Share it with others or explore more content.

More Articles
Published May 13, 20258 min read3 tags