Tailwind CSS は 2025 年 1 月の v4.0 安定版リリースで、ほぼ別物と言えるほど生まれ変わりました。Rust で書き直された Oxide エンジンはフルビルドを 3.78 倍・インクリメンタルビルドを 8.8 倍・キャッシュヒット時を182 倍(ミリ秒 → マイクロ秒)に高速化。設定は tailwind.config.js からCSS ファイル内の @theme ディレクティブへ移行し、「JS 設定不要」のモダンな開発体験に生まれ変わりました。
さらに v3 では個別プラグインが必要だったコンテナクエリ・3D Transform・拡張グラデーション・@starting-styleが標準装備。任意値(grid-cols-15、mt-17 等)も設定不要でそのまま書けるダイナミック utilitiesや、not-* バリアント、inset-shadow-*、field-sizing、color-scheme など、モダン CSS の最新機能を一気に取り込んだのが v4 です。
この記事では 2026 年 4 月時点の Tailwind CSS v4.x を前提に、Oxide エンジンの性能、Vite プラグイン / PostCSS / CLI の 3 方式セットアップ、CSS-first 設定(@theme)、自動コンテンツ検出(@source)、新ディレクティブ(@utility / @custom-variant / @layer / @apply)、ダイナミック utilities、コンテナクエリ、3D Transform、グラデーション、@starting-style、not-*、Cascade Layers、color-mix、Logical Properties、v3 → v4 移行手順、落とし穴までを実戦コードで網羅的に解説します。
- 2026 年 4 月時点のバージョンと性能
- インストール ── 3 方式の使い分け
- CSS-first Configuration ── @theme ディレクティブ
- @source ── 自動コンテンツ検出とスキャン制御
- 新ディレクティブ ── @utility / @custom-variant / @layer / @apply
- ダイナミック Utilities ── 任意値が設定不要
- コンテナクエリ ── プラグイン不要で標準搭載
- 3D Transform ── 標準搭載
- グラデーション ── 角度・コニック・ラジアル・補間モード
- @starting-style ── JS 不要の入場アニメーション
- not-* バリアント ── 否定条件
- v4.1 で追加された新規 utilities
- モダン CSS 基盤を全面採用
- v3 → v4 移行手順
- 落とし穴と注意点
- よくある質問
- まとめ
2026 年 4 月時点のバージョンと性能
| リリース | 時期 | 主なハイライト |
|---|---|---|
| Tailwind v3 | 2021 年〜 | JIT エンジン・tailwind.config.js・プラグイン必要な機能(コンテナクエリ等) |
| Tailwind v4.0 | 2025 年 1 月 | Rust 製 Oxide エンジン・CSS-first 設定(@theme)・ダイナミック utilities・標準コンテナクエリ・3D Transform・@starting-style・v3 からの移行ツール提供 |
| Tailwind v4.1 | 2025 年中盤〜 | 追加の新 variant、inset-shadow-*、field-sizing、color-scheme、font-stretch 等のユーティリティ安定化 |
| 推奨 | 2026 年 4 月 | Tailwind v4.1 系。新規プロジェクトは最初からこの系列で始める |
Oxide エンジンの性能数値
| 処理 | v3(旧 JS エンジン) | v4(Oxide) | 倍率 |
|---|---|---|---|
| フルビルド | 378ms | 100ms | 3.78× |
| インクリメンタルビルド | 44ms | 5ms | 8.8× |
| キャッシュヒット時 | 35ms | 192µs | 182× |
インストール ── 3 方式の使い分け
v4 は Vite プラグイン・PostCSS プラグイン・CLI の 3 方式で導入できます。フレームワークによって推奨が違います。
Vite プラグイン(推奨)
# インストール npm install tailwindcss @tailwindcss/vite
import { defineConfig } from "vite";
import tailwindcss from "@tailwindcss/vite";
export default defineConfig({
plugins: [tailwindcss()],
});
@import "tailwindcss";
PostCSS プラグイン(Webpack / Next.js など)
npm install tailwindcss @tailwindcss/postcss
export default {
plugins: { "@tailwindcss/postcss": {} },
};
Standalone CLI(ビルドツール非依存)
# watch モードで開発 npx @tailwindcss/cli -i src/input.css -o dist/output.css --watch # 本番ビルド(--minify) npx @tailwindcss/cli -i src/input.css -o dist/output.css --minify
@nuxtjs/tailwindcss)経由、それ以外の環境は CLI、という住み分けが 2026 年の定石です。CSS-first Configuration ── @theme ディレクティブ
v4 最大のパラダイムシフトは「設定を CSS ファイル内で宣言する」ことです。tailwind.config.js は不要になり、代わりに @theme ブロックにデザイントークンを書きます。
@import "tailwindcss";
@theme {
/* カラーパレット */
--color-primary-50: oklch(0.97 0.014 255.1);
--color-primary-500: oklch(0.54 0.22 258.6);
--color-primary-900: oklch(0.22 0.12 266.0);
/* フォント */
--font-sans: "Inter", "Noto Sans JP", sans-serif;
--font-mono: "JetBrains Mono", monospace;
/* ブレイクポイント追加 */
--breakpoint-3xl: 1920px;
/* カスタムイージング */
--ease-snappy: cubic-bezier(0.2, 0, 0, 1);
--ease-bounce: cubic-bezier(0.68, -0.55, 0.27, 1.55);
/* カスタムスペーシング基準 */
--spacing: 0.25rem;
}
<div class="bg-primary-500 text-white font-sans p-8"> <h1 class="text-3xl">Tailwind v4</h1> <p class="mt-4 ease-snappy transition">CSS 変数で全部管理される</p> </div> <!-- 3xl ブレイクポイントも自動で追加される --> <div class="text-base 3xl:text-xl">...</div>
@theme に書いた --color-primary-500 はそのまま :root の CSS 変数になります。つまり「style.color = getComputedStyle(...).getPropertyValue('--color-primary-500')」のようにランタイム JS から読めるため、Chart.js などで Tailwind のカラーを引き継ぐ設計が自然に書けます。既存トークンの上書き・拡張
@import "tailwindcss";
@theme {
/* Tailwind 既定のカラーを全部削除 → カスタム定義のみ */
--color-*: initial;
--color-ink: #111827;
--color-paper: #fafafa;
--color-accent: oklch(0.7 0.2 30);
}
@source ── 自動コンテンツ検出とスキャン制御
v4 は プロジェクトルートから自動的に HTML / JSX / Vue / Svelte / Astro / Markdown などを検出します。v3 の content 配列を書く必要がなくなりました。外部 UI ライブラリなど追加スキャンが必要な場所だけ @source で明示します。
@import "tailwindcss"; /* node_modules 内の UI ライブラリもクラス抽出対象にする */ @source "../node_modules/@mycompany/ui-lib"; @source "../node_modules/shadcn-ui"; /* 逆に除外したいファイルがあれば */ @source not "./src/legacy/**/*.html";
.gitignore に載っているファイル・バイナリファイル(画像 / 動画 / zip)・node_modules 直下(明示指定がない限り)。v3 の「content: ["./src/**/*.{html,js,ts,jsx,tsx}"] を全部書く」運用が不要になり、グロブ漏れによるクラス消失バグも激減します。新ディレクティブ ── @utility / @custom-variant / @layer / @apply
@utility ── カスタムユーティリティを定義
@utility flex-center {
display: flex;
align-items: center;
justify-content: center;
}
@utility card {
border-radius: 0.75rem;
background: var(--color-white);
box-shadow: 0 4px 16px -2px rgb(0 0 0 / 0.1);
padding: 1.5rem;
}
<div class="card flex-center">...</div>
@custom-variant ── カスタムバリアントを定義
/* data-theme="dark" 下のスタイル */ @custom-variant theme-dark (&:where([data-theme="dark"] *)); /* is-active 属性があるときだけ */ @custom-variant active ([data-active] &); /* フォームがバリデーションエラーの時 */ @custom-variant invalid (&:user-invalid);
<div data-theme="dark"> <button class="bg-white theme-dark:bg-gray-900">Click</button> </div> <input class="border-gray-300 invalid:border-red-500" required type="email" />
@apply ── 既存ユーティリティを組み合わせる
.btn-primary {
@apply inline-flex items-center gap-2 rounded-lg px-4 py-2 bg-primary-500 text-white font-medium;
@apply hover:bg-primary-600 focus-visible:ring-2 focus-visible:ring-primary-400;
}
@apply で独自クラスを量産するとv3 時代の「セマンティッククラス」の再発明になり、Tailwind の利点が薄れます。コンポーネントライブラリを作る・レガシーと共存する場合のみ使うのが健全です。ダイナミック Utilities ── 任意値が設定不要
v4 は任意の整数値を受け付ける utilityを標準装備しました。v3 では grid-cols-[15] のように arbitrary values 記法が必要だった部分が、そのまま書けます。
<!-- グリッド列(v3: grid-cols-[15] → v4: そのまま) --> <div class="grid grid-cols-15 gap-4">...</div> <!-- スペーシング(4 の倍数以外も OK) --> <div class="mt-17 pr-29 w-13">...</div> <!-- z-index(任意) --> <div class="z-47">...</div>
@theme {
--spacing: 0.25rem; /* 1 = 0.25rem = 4px */
}
/* 自動生成ロジック */
.mt-17 { margin-top: calc(var(--spacing) * 17); } /* 4.25rem */
.w-13 { width: calc(var(--spacing) * 13); } /* 3.25rem */
data 属性バリアント(設定不要)
<button data-loading class="opacity-60 data-loading:opacity-100 data-loading:animate-pulse" > 送信中... </button> <!-- 値までマッチ(data-state="open") --> <div data-state="open" class="data-[state=open]:block hidden"> Open! </div>
data-state・data-side・data-orientation などの data 属性を多用します。v4 ならプラグインなしでそのまま variant として書けるため、shadcn/ui 系のコンポーネントが最もスッキリ記述できます。デザインシステム構築の実戦は Claude Code × Tailwind CSS v4 デザインシステム構築ガイド を参照。コンテナクエリ ── プラグイン不要で標準搭載
<div class="@container">
<div class="grid grid-cols-1 @sm:grid-cols-2 @lg:grid-cols-3">
<!-- コンテナ幅に応じて列数が変わる(ビューポートではない) -->
</div>
</div>
<!-- 範囲指定・最大幅指定 -->
<div class="@container">
<p class="@max-md:hidden">md 以上で表示</p>
<p class="@min-sm:@max-lg:text-xs">sm 〜 lg の間だけ小さく</p>
</div>
3D Transform ── 標準搭載
<div class="perspective-distant">
<article class="transform-3d rotate-x-51 rotate-z-43 transition duration-500 hover:rotate-x-0 hover:rotate-z-0">
<img src="/card.jpg" alt="" />
</article>
</div>
グラデーション ── 角度・コニック・ラジアル・補間モード
<!-- 線形(角度指定) --> <div class="bg-linear-45 from-indigo-500 via-purple-500 to-pink-500">...</div> <!-- 補間モード(OKLCH は色が鮮やか、sRGB は暗く濁る場合あり) --> <div class="bg-linear-to-r/oklch from-indigo-500 to-teal-400">...</div> <div class="bg-linear-to-r/srgb from-indigo-500 to-teal-400">...</div> <!-- コニック --> <div class="size-40 bg-conic from-red-500 via-yellow-500 to-red-500">...</div> <!-- ラジアル(位置指定) --> <div class="size-40 bg-radial-[at_25%_25%] from-white to-zinc-900">...</div> <!-- HSL の長い色相経由(虹色) --> <div class="size-40 bg-conic/[in_hsl_longer_hue] from-red-600 to-red-600">...</div>
bg-linear-to-r(従来の bg-gradient-to-r の新名称)のデフォルト補間が oklab になり、中間色がくすみにくいグラデーションになります。v3 の見た目を維持したい場合は /srgb 修飾子を明示します。@starting-style ── JS 不要の入場アニメーション
<div popover id="menu"
class="transition-discrete duration-300
opacity-100 scale-100
starting:open:opacity-0 starting:open:scale-95">
<!-- popover が開いた瞬間 opacity-0 scale-95 から始まり、100 / 100 へ補間される -->
<p>メニュー内容</p>
</div>
<button popovertarget="menu">開く</button>
@starting-style CSS 機能を tailwind が variant 化: ブラウザネイティブの CSS 機能を、Tailwind が starting:* という糖衣で使えるようにしたもの。Framer Motion や GSAP に頼らず、CSS だけでエンター / イグジット遷移が書けるため、モーダル / ポップオーバー / ツールチップの実装がシンプルになります。not-* バリアント ── 否定条件
<!-- :not(:hover) 相当 --> <div class="opacity-75 not-hover:opacity-100"> hover されていない時は透過 75%、hover されたら 100% </div> <!-- メディアクエリの否定 --> <p class="not-supports-hanging-punctuation:px-4"> ブラウザが hanging-punctuation 未対応の時だけ余白を付ける </p>
v4.1 で追加された新規 utilities
| ユーティリティ | 用途 |
|---|---|
inset-shadow-* |
要素の内側に影。複数レイヤー対応でカード・ボタンに深さを追加 |
inset-ring-* |
要素の内側に ring(境界線)。従来の ring-* の内側版 |
field-sizing-content |
<textarea> を入力内容で自動リサイズ |
color-scheme-* |
ブラウザのダークモードスクロールバーを明示制御 |
font-stretch-* |
可変フォント(Variable Fonts)の幅を調整 |
inert |
要素を非インタラクティブに(キーボード・マウス・タッチすべて無効化) |
モダン CSS 基盤を全面採用
/* Cascade Layers: スタイルの優先順位を明示 */
@layer theme, base, components, utilities;
/* Registered Custom Properties: 型付き CSS 変数 */
@property --tw-gradient-from {
syntax: "<color>";
inherits: false;
initial-value: transparent;
}
/* color-mix() によるオパシティ計算 */
.bg-blue-500\/50 {
background-color: color-mix(in oklab, var(--color-blue-500) 50%, transparent);
}
/* Logical Properties(RTL 対応自動化) */
.mx-6 {
margin-inline: calc(var(--spacing) * 6); /* 旧 margin-left/right を 1 プロパティで */
}
.ps-4 {
padding-inline-start: calc(var(--spacing) * 4); /* LTR では左、RTL では右 */
}
v3 → v4 移行手順
# まず v4 に依存を更新 npm install tailwindcss@latest @tailwindcss/vite@latest # or @tailwindcss/postcss@latest # 公式 codemod npx @tailwindcss/upgrade # 以下を自動変換: # - tailwind.config.js の theme → @theme ディレクティブ # - @tailwind base/components/utilities → @import "tailwindcss" # - 一部の非推奨クラス名の置換 # - content フィールドの削除(自動検出に任せる) # 差分を確認してコミット git diff
自動では変換されないポイント
- プラグイン依存:
@tailwindcss/typography・@tailwindcss/forms・@tailwindcss/aspect-ratio・@tailwindcss/container-queriesは v4 で不要になったり別パッケージになったりする。package.json を確認 - カスタムプラグイン:
plugin(function({ addUtilities })...)の JS プラグインは@utility/@custom-variantに手動移行 - 任意値の書き方:
grid-cols-[15]のような arbitrary value はgrid-cols-15のダイナミック版にリファクタできる(必須ではない) @applyの多用: 引き継ぐ前にコンポーネント化を検討- カラーパレット: v4 は OKLCH ベースに置き換わったので、特に赤・紫・青系の中間色が微妙に変わる。ブランドカラーが
red-500に依存している場合は視覚的確認を
落とし穴と注意点
@theme で –color-* を宣言し忘れる
v4 はデフォルトカラーパレットを自動でロードします。@theme の中で --color-*: initial; を指定しない限り既定が残るため、未使用の色も CSS 変数として出力される点に注意。バンドルサイズを極限まで絞りたい場合は明示的に initial するか、--color-blue-500: のように必要な色だけ個別に上書きします。
@import "tailwindcss" の位置
CSS ファイルの最上部に書く必要があります。ほかの @import やコメントの後に書くとトランスパイラが認識しないことがあるため、1 行目を徹底してください。
既存の tailwind.config.js が残っている
v4 へ移行後も tailwind.config.js が残っていると、一部プラグインやツールがそれを読み取って混乱する場合があります。完全移行後はファイルを削除し、必要ならバックアップを git 履歴に残す運用にします。
content を書いていた慣れでグロブを書き続ける
v4 は自動検出するため @source は「追加スキャン」用途のみ。普通のソースファイルに対して @source "./src/**/*" のように書いても効果がなく、むしろ .gitignore 除外が外れるなど混乱を招きます。必要な時だけ書くのがポイントです。
shadcn/ui テンプレがまだ v3 前提
2026 年 4 月時点で shadcn/ui は v4 対応済みですが、古いブログ記事やテンプレが tailwind.config.js ベースのまま残っていることがあります。公式 CLI(npx shadcn@latest init)を最新版で使えば v4 前提の構成が生成されます。
カラー計算で rgb() を期待しているコード
v4 は色を oklch() ベースで出力するため、JS 側で RGB パースしている箇所(Canvas・Chart.js の一部設定など)で互換性問題が起きます。getComputedStyle で取得した文字列を扱う時は CSS.supports("color", value) や自前パーサで OKLCH / color-mix に対応させてください。
よくある質問
npx @tailwindcss/upgrade)で大半が変換されますが、JS プラグインを書いていた・配色を OKLCH 基準で確認する必要がある・Safari 16.4 未満の利用者が多い場合はその都度検討が必要です。多くの業務アプリでは 1〜2 日で移行できますが、カスタマイズが濃いプロジェクトは 1 週間程度見積もるのが現実的です。@theme ベースに統一されており、tailwind.config.js を互換モードで読む機能が一応あるものの、両方書くとどちらが優先されるかが曖昧になり事故の元です。移行完了後は config.js を削除し、@theme 1 箇所に集約してください。npx shadcn@latest init で生成されるテンプレートは @theme ベースの CSS です。Radix UI は data 属性を多用しますが、v4 の data 属性 variant で自然に書けます。デザインシステム構築の実戦手順は Claude Code × Tailwind CSS v4 デザインシステム構築ガイド が詳しいです。dark: モードはどう書きますか?dark:bg-zinc-900 構文は v3 と変わりませんが、切替戦略は @custom-variant で定義できるようになりました。@custom-variant dark (&:where([data-theme="dark"] *)); を書けば、data-theme="dark" 属性ベースの手動切替が可能です。prefers-color-scheme に自動追従したい場合は @custom-variant dark (@media (prefers-color-scheme: dark)); を使います。install を短縮、② GitHub Actions で setup-node cache: npm + actions/cache で .turbo / .next/cache を保存、③ Turborepo の incremental build で CSS 出力もキャッシュ、の 3 段構えで数秒まで落とせます。red-500 をそのまま使う」という前提だった場合、視覚的な印象が若干変わる点は移行前に確認しておいてください。まとめ
- Tailwind v4.1 が 2026 年の標準。Rust 製 Oxide エンジンで最大 182× 高速、HMR 体感が別物
- CSS-first Configuration:
tailwind.config.jsを捨て、@themeディレクティブに集約。デザイントークンはそのまま CSS 変数として露出 - 3 方式のセットアップ: Vite プラグイン(推奨)・PostCSS(Next.js など)・CLI(ビルドツール非依存)
- 自動コンテンツ検出: v3 の
contentは不要。追加スキャンは@source - 新ディレクティブ:
@utility(カスタムクラス)・@custom-variant(独自 variant)・@apply(レガシー互換) - ダイナミック utilities:
grid-cols-15/mt-17のような任意値が設定不要で使える - 標準搭載: コンテナクエリ・3D Transform・拡張グラデーション(conic / radial / oklch 補間)・
@starting-style・not-* - モダン CSS 基盤: Cascade Layers・
color-mix()・Logical Properties・Registered Custom Properties - v3 → v4 移行は
npx @tailwindcss/upgradeで大半を自動化。JS プラグイン・OKLCH 色差・ブラウザサポートは手動確認
デザインシステム構築は Claude Code × Tailwind CSS v4 デザインシステム構築ガイド、フレームワーク連携は React 19・Astro・Svelte 5・Nuxt 4・Claude Code × Next.js、ランタイム・開発体験は Bun・Deno 2・Biome、CI/CD は GitHub Actions 完全ガイド もあわせて、Tailwind v4 を核に据えた 2026 年型 CSS アーキテクチャを組み上げてください。

