Tailwind CSS v4は、これまでのJavaScriptベースの設定ファイル(tailwind.config.js)からCSS-firstの設定方法へと根本的に変更された大型アップデートです。設定の書き方、プラグインの追加方法、カスタマイズの仕組みが一新されており、v3からの移行には注意が必要です。この記事では、v4の新機能を詳しく解説するとともに、v3からの移行を確実に行うための手順を説明します。
v4の主な変更点(CSS-firstの設定)
Tailwind CSS v4の最大の変更点は、設定をJavaScriptではなくCSSで行うようになったことです。tailwind.config.jsが廃止され、すべての設定をCSSファイル内の@theme、@plugin、@custom-variantなどのディレクティブで行います。これにより、ビルドツールへの依存が減り、CSSの知識だけで設定できるようになりました。
- tailwind.config.jsの廃止 → CSSファイルでの設定に統一
- @tailwindディレクティブの変更 → @import 'tailwindcss'に
- テーマのカスタマイズ → @themeディレクティブを使用
- プラグインの追加 → @pluginディレクティブを使用
- カスタムバリアント → @custom-variantディレクティブを使用
- エンジンの刷新 → Oxideエンジンによる大幅な高速化
@importベースの新しい設定方法
v4では、グローバルCSSファイルの先頭で@import 'tailwindcss'を記述するだけで、すべてのユーティリティクラスが利用可能になります。v3の@tailwind base、@tailwind components、@tailwind utilitiesの3行が不要になり、よりシンプルになりました。
/* globals.css - Tailwind CSS v4の基本設定 */
/* v3の書き方(古い) */
/* @tailwind base;
@tailwind components;
@tailwind utilities; */
/* v4の書き方(新しい) */
@import "tailwindcss";
/* テーマのカスタマイズ */
@theme {
/* カラーパレット */
--color-primary: oklch(0.6 0.2 250);
--color-primary-foreground: oklch(0.98 0 0);
--color-secondary: oklch(0.5 0.15 300);
/* フォントファミリー */
--font-sans: 'Inter', 'Noto Sans JP', sans-serif;
--font-mono: 'JetBrains Mono', monospace;
/* スペーシング(デフォルトを拡張) */
--spacing-18: 4.5rem;
--spacing-22: 5.5rem;
/* カスタムアニメーション */
--animate-slide-in: slide-in 0.3s ease-out;
}
/* カスタムキーフレーム */
@keyframes slide-in {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* カスタムバリアント */
@custom-variant dark (&:where(.dark, .dark *));
@custom-variant hocus (&:hover, &:focus);
/* プラグインの追加 */
@plugin "@tailwindcss/typography";
@plugin "@tailwindcss/forms";CSSカスタムプロパティとの統合
v4ではTailwindの設定がCSSカスタムプロパティと完全に統合されています。@themeで定義した値は自動的にCSS変数として公開され、JavaScriptからもアクセス可能です。また、既存のCSS変数をTailwindのユーティリティとして使用できるようになりました。
/* @themeで定義した値はCSSカスタムプロパティとして公開される */
@theme {
--color-brand: #3B82F6;
--color-brand-dark: #1D4ED8;
--radius-button: 0.5rem;
}
/* 生成されるCSS(Tailwindが自動生成) */
/* :root {
--color-brand: #3B82F6;
--color-brand-dark: #1D4ED8;
--radius-button: 0.5rem;
} */
/* @themeの値をユーティリティとして使用 */
/* <button class="bg-brand text-white rounded-button"> */
/* JavaScriptからCSSカスタムプロパティにアクセス */
/* const brand = getComputedStyle(document.documentElement)
.getPropertyValue('--color-brand').trim() */
/* 既存のCSS変数をTailwindで使用 */
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
}
/* shadcn/uiとの互換性(HSL値をTailwindで利用) */
@theme inline {
--color-background: hsl(var(--background));
--color-foreground: hsl(var(--foreground));
}
/* コンポーネントでの使用 */
/* <div class="bg-background text-foreground"> */
/* Next.jsプロジェクトでのvite/tailwind設定 */
/* postcss.config.ts は不要になる場合がある */
/* vite.config.ts */
/* import tailwindcss from '@tailwindcss/vite'
export default {
plugins: [tailwindcss()],
} */v3からv4への移行手順
Tailwind CSS公式は自動移行ツールを提供しています。多くのケースでこのツールを使うだけで移行できますが、プロジェクトによっては手動の修正が必要です。以下の手順で移行を進めてください。
- 1tailwindcssを最新v4にアップデート(npm install tailwindcss@next)
- 2公式移行ツールを実行(npx @tailwindcss/upgrade)
- 3tailwind.config.jsの内容をglobals.cssの@themeに移行
- 4v3の@tailwind base/components/utilitiesを削除し@import 'tailwindcss'に変更
- 5ビルドエラーを確認して修正(主にクラス名の変更)
- 6ビジュアルリグレッションテストで見た目の変化を確認
/* v3の設定(移行前) */
/* tailwind.config.js */
/* module.exports = {
content: ['./src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {
colors: {
brand: {
50: '#eff6ff',
100: '#dbeafe',
500: '#3b82f6',
900: '#1e3a8a',
},
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
borderRadius: {
'4xl': '2rem',
},
},
},
plugins: [
require('@tailwindcss/typography'),
require('@tailwindcss/forms'),
],
} */
/* v4の設定(移行後) */
/* globals.css */
@import "tailwindcss";
@theme {
/* カラー */
--color-brand-50: #eff6ff;
--color-brand-100: #dbeafe;
--color-brand-500: #3b82f6;
--color-brand-900: #1e3a8a;
/* フォント */
--font-sans: 'Inter', sans-serif;
/* ボーダーラジウス */
--radius-4xl: 2rem;
}
/* プラグイン */
@plugin "@tailwindcss/typography";
@plugin "@tailwindcss/forms";
/* v4で変更されたクラス名 */
/* shadow-sm → shadow-xs */
/* text-opacity-* → text-*//{opacity} */
/* bg-opacity-* → bg-*//{opacity} */
/* transform → 不要(デフォルトで有効) */
/* overflow-ellipsis → text-ellipsis */新しいユーティリティクラス
Tailwind CSS v4では多くの新しいユーティリティクラスが追加されました。特にモダンCSSのプロパティへの対応が大幅に強化されています。
- field-sizing-content: テキストエリアのコンテンツに合わせたサイズ自動調整
- text-wrap: balance/pretty: テキストの折り返し最適化(見出しのジャグを防ぐ)
- inset-shadow-*: インセットシャドウ(ボタンの押下状態等に有用)
- mask-*: CSSマスクユーティリティ(グラデーションフェード効果等)
- not-*バリアント: :not()セレクタのサポート(not-first:mt-0等)
- starting:バリアント: @starting-styleのサポート(アニメーション初期状態)
/* v4の新しいユーティリティクラスの使用例 */
/* text-wrap: balance - 見出しのジャグを防ぐ */
/* <h1 class="text-balance">長い見出しテキストを均等に折り返す</h1> */
/* field-sizing-content - テキストエリアの自動サイズ調整 */
/* <textarea class="field-sizing-content resize-none" /> */
/* @starting-style - 要素が表示される時のアニメーション */
/* dialog[open] {
@apply opacity-100 translate-y-0;
@starting-style {
@apply opacity-0 -translate-y-4;
}
} */
/* not-*バリアント */
/* <li class="not-last:mb-4">リストアイテム(最後以外にマージン)</li> */
/* in-*バリアント: 親の状態に基づくスタイル */
/* <div class="group">
<span class="in-[.group:hover]:text-blue-500">
親ホバー時に色変更
</span>
</div> */
/* size-*ユーティリティ(width + heightを同時に設定) */
/* <div class="size-12"> ← w-12 h-12 と同じ */
/* <div class="size-full"> ← w-full h-full と同じ */
/* starting:バリアント(dialog等のエントリアニメーション) */
/* <dialog class="
opacity-100 translate-y-0 transition-all
starting:opacity-0 starting:-translate-y-4
"> */パフォーマンス改善の詳細
Tailwind CSS v4はOxideという新しいエンジンに移行し、ビルド速度が大幅に向上しています。Rustで書かれた高速なCSS解析エンジンにより、v3比でフルビルドが5倍、インクリメンタルビルドが100倍以上高速になりました。また、生成されるCSSサイズも削減されています。
- Oxideエンジン(Rust製)によりフルビルドが最大5倍高速化
- インクリメンタルビルドが100倍以上高速化(ホットリロードが体感で劇的に速い)
- 生成CSSの最適化(不要なCSS変数宣言の削減)
- Lightning CSSとの統合(ベンダープレフィックスの自動付与、最新CSS構文のサポート)
- コンテンツスキャンの改善(設定不要でHTMLの変更を自動検知)
よくある移行時のエラーと解決法
v3からv4への移行でよく発生するエラーとその解決策をまとめます。自動移行ツールで解決されないケースに備えて確認しておきましょう。
/* エラー1: tailwind.config.jsが無視される */
/* 解決: globals.cssに設定を移行する */
/* エラー2: カスタムカラーがユーティリティとして使えない */
/* 原因: @themeの書き方が間違っている */
/* ❌ 間違い */
/* @theme { colors: { brand: '#3B82F6' } } */
/* ✅ 正しい */
@theme {
--color-brand: #3B82F6;
}
/* エラー3: @apply内でカスタムカラーが使えない */
/* 解決: @layerを適切に使用する */
@layer utilities {
.btn-primary {
@apply bg-brand text-white px-4 py-2 rounded;
}
}
/* エラー4: プラグインが認識されない */
/* ❌ v3の書き方 */
/* plugins: [require('@tailwindcss/typography')] */
/* ✅ v4の書き方(globals.css内) */
@plugin "@tailwindcss/typography";
/* エラー5: content配列が不要になった */
/* v4ではcontent設定なしで自動検知される */
/* 特定ファイルのみを対象にしたい場合は: */
@source "../node_modules/your-lib/src";
/* エラー6: arbitrary valuesの構文変更 */
/* v3: bg-[#3B82F6] */
/* v4: bg-[#3B82F6] (変更なし)*/
/* ただし、CSSカスタムプロパティの参照方法が変わる */
/* v3: bg-[color:var(--brand)] */
/* v4: bg-(--brand) または bg-[var(--brand)] */💡 ヒント
Next.js 15 + Tailwind CSS v4を使う場合、create-next-appで最新版を使えばデフォルトでv4が設定済みです。既存プロジェクトの移行には公式CLIツール(npx @tailwindcss/upgrade)を使用し、ビジュアルリグレッションテスト(PlaywrightのスクリーンショットなどSo)で見た目の変化を確認することをお勧めします。