この記事の対象: Tailwind CSSを実務で使いこなしたいフロントエンドエンジニア
読了時間: 約8分
Tailwind CSSはユーティリティファーストのCSSフレームワークとして、2026年現在も実務のCSS設計における主要な選択肢のひとつです。v4への移行が進み、設定ファイルなしで書き始める構成が広がってきました。この記事では実務で繰り返し使うUIパターン10選と、v4以降の書き方の勘所をコードつきで整理します。
Tailwind CSSとは(おさらい)
HTMLのclass属性にユーティリティクラスを直接記述してスタイリングするアプローチです。bg-blue-500、text-white、p-4のような短いクラスを組み合わせてUIを構築します。
- カスタムCSSを書く量が減り、ファイルをまたいだクラス名の設計に悩まずに済む
- デザインシステム(トークン化されたカラー・スペーシング)との相性がよい
- クラスがHTMLに集中するぶん、コンポーネント分割の設計次第でマークアップが長くなりやすい
「マークアップが読みにくくなる」という批判は根強くありますが、Reactなどのコンポーネント単位で分割していれば、クラス名を探して他ファイルを行き来するより見通しが良いという実感を持つ現場が多いのが実情です。
よく使うパターン10選
①レスポンシブナビゲーション
<nav class="flex items-center justify-between p-4 bg-white shadow-sm">
<a href="/" class="text-xl font-bold">Logo</a>
<div class="hidden md:flex gap-6">
<a href="#" class="text-gray-600 hover:text-gray-900">About</a>
<a href="#" class="text-gray-600 hover:text-gray-900">Services</a>
<a href="#" class="text-gray-600 hover:text-gray-900">Contact</a>
</div>
<button class="md:hidden" aria-label="メニューを開く">☰</button>
</nav>
つまずきやすい点: md:hidden のボタンにラベルを付けないと、スクリーンリーダーで読み上げ内容が「☰」だけになります。アイコンだけのボタンには必ず aria-label を添えてください。
②ヒーローセクション
<section class="min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-600 to-purple-700 text-white px-4">
<div class="text-center max-w-2xl">
<h1 class="text-4xl md:text-6xl font-bold mb-6">キャッチコピー</h1>
<p class="text-lg md:text-xl mb-8 opacity-90">サブコピーテキスト</p>
<a href="#" class="inline-block bg-white text-blue-600 px-8 py-3 rounded-full font-bold hover:bg-gray-100 transition">CTA</a>
</div>
</section>
実装のポイント: min-h-screen はモバイルのアドレスバー分だけ縦にはみ出すことがあります。ファーストビューの下端に要素を寄せたいときは min-h-dvh に置き換えると、動的ビューポート単位で計算され安定します。モダンブラウザでは広く使える単位です。
③カードコンポーネント
<div class="bg-white rounded-xl shadow-md overflow-hidden hover:shadow-lg transition-shadow">
<img src="/image.jpg" alt="商品の説明" class="w-full h-48 object-cover">
<div class="p-6">
<span class="text-sm text-blue-600 font-medium">カテゴリ</span>
<h3 class="text-lg font-bold mt-1 mb-2">タイトル</h3>
<p class="text-gray-600 text-sm">説明テキスト...</p>
</div>
</div>
画像を縦横比固定でトリミングしたい場合は h-48 の固定高さより aspect-[4/3] object-cover のほうが破綻しにくく、一覧のレイアウトが崩れにくくなります。トリミング周りの実装はCSS画像トリミングを揃える方法|object-fitとaspect-ratioでアスペクト比を固定する実装で詳しく扱っています。
カードのホバー演出をどこまでやるかは、やりすぎると安っぽく見える境界線があります。判断基準はホバーアニメーションのCSS実装|カードでやりすぎない基準にまとめています。
④フォーム
<form class="space-y-4 max-w-md">
<div>
<label class="block text-sm font-medium text-gray-700 mb-1" for="name">お名前</label>
<input id="name" type="text" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-1" for="email">メール</label>
<input id="email" type="email" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent outline-none transition">
</div>
<button class="w-full bg-blue-600 text-white py-3 rounded-lg font-bold hover:bg-blue-700 transition">送信</button>
</form>
つまずきやすい点: label と input の for/id を省略しているコードをよく見ますが、これがないとクリックでフォーカスが移らずタップ領域が狭くなります。エラー表示や入力補助まで含めた設計はフォームのCSS実装|入力しやすい設計とエラー表示までで扱っています。
⑤フッター
<footer class="bg-gray-900 text-gray-400 py-12 px-4">
<div class="max-w-6xl mx-auto grid grid-cols-1 md:grid-cols-3 gap-8">
<div>
<h4 class="text-white font-bold mb-4">会社名</h4>
<p class="text-sm">会社の説明テキスト</p>
</div>
<div>
<h4 class="text-white font-bold mb-4">リンク</h4>
<ul class="space-y-2 text-sm">
<li><a href="#" class="hover:text-white transition">About</a></li>
<li><a href="#" class="hover:text-white transition">Services</a></li>
</ul>
</div>
<div>
<h4 class="text-white font-bold mb-4">お問い合わせ</h4>
<p class="text-sm">info@example.com</p>
</div>
</div>
</footer>
【ギャラリー事例: Soreiine!!ギャラリーに掲載されている制作会社のコーポレートサイトでは、フッターのリンク列をこのグリッド構成で組み、モバイルでは1カラムに畳んでいる実例が複数あります。3カラム目に問い合わせ導線を置く構成は、フォームページへの遷移率が意識されたパターンです】
⑥グラスモーフィズムカード
<div class="bg-white/30 backdrop-blur-lg border border-white/20 rounded-2xl p-8 shadow-xl">
<h3 class="text-xl font-bold">グラスモーフィズム</h3>
<p class="mt-2 text-gray-700">半透明のガラス風カード</p>
</div>
backdrop-blur は背景に十分なコントラストがある画像やグラデーションの上でないと効果が分かりにくく、単色背景の上に置くと「ただの半透明」にしか見えません。使う場所を選ぶ演出です。
⑦ダークモード対応
<div class="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 p-6 rounded-lg">
<h3 class="font-bold">ダークモード対応</h3>
<p class="text-gray-600 dark:text-gray-400">dark:プレフィックスで切り替え</p>
</div>
初期設定では prefers-color-scheme(OS設定)に追従します。手動トグルを付けたい場合は html タグに class="dark" を付け外しする実装に変わるため、要件がOS追従なのか手動切り替えなのかを先に決めておくと手戻りがありません。
⑧アニメーション
<div class="animate-bounce">バウンス</div>
<div class="animate-pulse">パルス</div>
<div class="animate-spin">スピン</div>
<div class="hover:scale-105 transition-transform duration-300">ホバー拡大</div>
つまずきやすい点: prefers-reduced-motion を尊重しないアニメーションは、動きに敏感なユーザーへの配慮を欠きます。常時ループするアニメーション(animate-bounce など)を使う箇所は、motion-reduce:animate-none を添えて無効化できるようにしておくのが安全です。
⑨グリッドレイアウト
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
<!-- カードを繰り返し配置 -->
</div>
カード枚数が可変で、画面幅に応じて自動で列数を決めたい場合は grid-cols-[repeat(auto-fill,minmax(240px,1fr))] のような任意値記法も使えます。ブレークポイントを都度指定しなくて済むため、件数が読めない一覧ページで重宝します。
⑩モーダル
<div class="fixed inset-0 bg-black/50 flex items-center justify-center z-50">
<div class="bg-white rounded-2xl p-8 max-w-md w-full mx-4 shadow-2xl" role="dialog" aria-modal="true">
<h3 class="text-xl font-bold mb-4">モーダルタイトル</h3>
<p class="text-gray-600 mb-6">モーダルの内容</p>
<button class="w-full bg-blue-600 text-white py-2 rounded-lg">閉じる</button>
</div>
</div>
このコードは動きますが、背景固定・フォーカストラップ・Escキー対応を自前で書く必要があり、抜け漏れが起きやすいパターンです。今はネイティブの <dialog> 要素が主要ブラウザで使えるようになっているので、新規実装ではそちらに乗せたほうが実装量が減ります。手順はモーダル dialog 要素の実装|背景固定もフォーカス管理も標準機能でにまとめています。
v4以降の書き方に慣れる
旧来の tailwind.config.js ベースの書き方から、v4のCSSベース構成への移行が実務でも進んでいます。
- 設定ファイル不要:
tailwind.config.jsなしでも動作する - CSSベースの設定: トークン定義をCSS内の
@themeに書く - ビルド速度: v3世代と比べて速くなっている
- Container Queries: 親要素の幅を基準にしたレスポンシブがユーティリティクラスで書ける
v4: CSSで定義
- @theme ブロックに色・余白を書く
- ビルド設定ファイルが不要
- エディタの補完がCSSファイル内で完結
v3以前: JSで定義
- tailwind.config.js に theme.extend を書く
- JSとCSSでトークンの参照方法が分かれる
- ビルドツールとの結線が別途必要
新規プロジェクトはv4のCSSベース構成で始め、既存のv3プロジェクトは移行コストと相談しながら判断するのが現実的です。クラス名自体の書き方はv3とほぼ共通なので、この記事のパターン集はそのまま使えます。
コンテナクエリを使うと、同じカードコンポーネントでも「画面幅」ではなく「置かれた親要素の幅」で見た目を切り替えられます。サイドバーに置いたときとメインカラムに置いたときで挙動を変えたい共通コンポーネントに向いています。
Tailwindだけで組み切らない判断
すべてをユーティリティクラスで書こうとすると、タブUIやアコーディオン、カルーセルのような「状態を持つUI」は逆にコード量が増えることがあります。こうしたパーツはHTML標準機能に寄せたほうがJSを書かずに済む場合が多く、タブUIの実装とアクセシビリティ|キーボード操作まで対応する手順やアコーディオンをdetails summaryで実装|開閉アニメーション付きの作り方のように、Tailwindでスタイリングだけ担当させる構成が扱いやすくなります。
【ギャラリー事例: Soreiine!!ギャラリーの制作事例には、Tailwindでスタイリングしつつ、タブやアコーディオンの開閉ロジックだけをブラウザ標準機能に任せているサイトが見られます。JSの依存を減らすぶん表示速度のスコアが安定しやすい構成です】
よくある質問
Tailwind CSSはSassやCSS Modulesと比べて何が違いますか
命名の設計コストがほぼ不要になる点が最大の違いです。Sassやモジュール化CSSは自分でクラス名を考えて構造化する必要がありますが、Tailwindはあらかじめ用意されたユーティリティを組み合わせるだけで済みます。一方で、複雑な擬似要素や高度なアニメーションはプレーンCSSを併用したほうが書きやすい場面もあります。
v3からv4への移行は必須ですか
必須ではありません。v3も引き続き動作しますが、新規プロジェクトはv4のCSSベース設定で始めるほうがビルド設定がシンプルになります。既存プロジェクトは規模とテストの体制を見て移行時期を判断してください。
classが長くなりすぎて読みにくいときはどうすればいいですか
繰り返し使うクラスの組み合わせは、コンポーネント単位(Reactのコンポーネント、Vueの単一ファイルコンポーネントなど)に切り出すのが基本の対処法です。CSS側でクラスをまとめる @apply もありますが、多用するとユーティリティファーストの利点が薄れるため、まずはコンポーネント分割を優先してください。
レスポンシブ対応で気をつけることはありますか
sm: md: lg: はいずれも「その幅以上」を指すモバイルファーストの記法です。「〇〇以下のときだけ」という指定が必要な場合は max-md: のような上限指定のプレフィックスを使う必要があり、通常のプレフィックスと混同すると意図と逆の挙動になるので注意してください。
アクセシビリティで最低限おさえておくことは何ですか
アイコンだけのボタンには aria-label を付け、フォームの label は for/id で input と結びつけ、常時ループするアニメーションには motion-reduce:animate-none を添えることの3点が、この記事のパターンでも繰り返し出てきた最低限のチェック項目です。いずれもクラスを1つ足すだけで対応できるため、実装の最後に見落としがないか確認する習慣をつけると事故が減ります。
まとめ
- ユーティリティクラスの組み合わせでUIを高速に構築できる
- レスポンシブは
sm:md:lg:などのプレフィックスで対応する - ダークモードは
dark:プレフィックスで対応する - v4はCSSベースの
@theme設定が標準になり、設定ファイルなしで始められる - モーダルやタブなど状態を持つUIは、ネイティブ機能に寄せてTailwindはスタイリングに専念させると保守しやすい
