Utility-First CSS の台頭:Tailwind CSS を例に

5 分

1. 従来の CSS 方法論が抱える課題

Utility-First が登場する以前から、スタイルを整理するための優れた CSS 方法論は数多く存在していました。たとえば次のようなものです。

  • BEM (Block, Element, Modifier): block__element--modifier という命名規則によって、スタイルの独立性と保守性を確保します。
  • OOCSS (Object-Oriented CSS): 構造と見た目を分離し、コンテナとコンテンツも分離することを提唱します。
  • CSS-in-JS: CSS を JavaScript コンポーネント内に直接記述し、コンポーネント単位でスタイルをカプセル化します。

これらの方法は CSS のグローバル汚染やコード整理の問題をある程度解決しましたが、多くの場合、新たな問題も生みました。無数の class を命名するための思考負荷、ファイルを切り替える煩わしさ、そして CSS-in-JS がもたらす可能性のある実行時コストです。

2. Utility-First とは?

Utility-First(ユーティリティ優先)とは、単一の目的を持ち、名前が変わらないユーティリティクラスを一式用意し、それらを組み合わせて複雑な UI を構築するという CSS の考え方です。

たとえば .card クラスを作り、CSS ファイル内で displaypaddingbox-shadow を定義するのではなく、 HTML に直接次のように記述します。

<div class="block p-6 rounded-lg shadow-lg bg-white">
  <!-- ... -->
</div>

ここで使われている blockp-6rounded-lg などはユーティリティクラスで、それぞれが一つの小さな役割だけを担います。

3. Tailwind CSS:Utility-First の代表例

Tailwind CSS は現在最も人気のある Utility-First CSS フレームワークです。一般的な CSS プロパティをほぼすべて網羅する、非常に詳細なユーティリティクラス群を提供します。

主な利点:

  • 非常に高速な開発: HTML ファイルからほとんど離れる必要がありません。アトミッククラスを組み合わせることで、あらゆるデザインを素早く構築でき、プロトタイピングと開発の効率が大幅に向上します。
  • デザインシステムの強制: すべてのスタイル(色、余白、文字サイズ)が事前定義された設定(theme)に由来するため、チーム全体で UI の一貫性を保ちやすく、「マジックナンバー」も避けられます。
  • 命名の悩みが不要: 「コンピュータサイエンスの二大難問は、キャッシュの無効化と命名である。」Tailwind を使えば、CSS クラスの命名にほとんど悩まなくて済みます。
  • 優れたパフォーマンス: 本番ビルド時に Tailwind はファイルを走査し、PurgeCSS(または内蔵 JIT エンジン)によって未使用の CSS クラスをすべて削除するため、最終的な CSS ファイルは通常非常に小さくなります。

4. 「クラス名地獄」?—— 欠点を見る別の視点

Tailwind に対する最も一般的な批判は、HTML が非常に肥大化して読みにくくなり、「インラインスタイル」の時代に戻ったように見えることです。

<button class="py-2 px-4 font-semibold rounded-lg shadow-md text-white bg-blue-500 hover:bg-blue-700">
  Click me
</button>

確かに慣れが必要です。しかし支持者は次のように考えます。

  1. スタイルと構造はもともと密接に結び付いているため、同じ場所に置く方がむしろ保守しやすい。
  2. React や Vue のコンポーネントなど、再利用可能なコンポーネントとして切り出せば、この「混乱」を内部に閉じ込められる。

再利用したいスタイルの組み合わせに対して、Tailwind は @apply ディレクティブを提供しています。

/* in your css file */
.btn-primary {
  @apply py-2 px-4 font-semibold rounded-lg shadow-md text-white bg-blue-500 hover:bg-blue-700;
}

これで HTML 内から .btn-primary を使用できます。ただし Tailwind 公式は、再利用の問題をコンポーネント化によって解決することをより推奨しています。

結論

Utility-First と Tailwind CSS の成功は、フロントエンド開発における「関心の分離」の考え方が、言語の分離(HTML/CSS/JS)からコンポーネントの分離へ移ったことを示しています。一見「原始的」に見える方法で、モダン Web 開発の多くの実際的な問題を解決し、効率的で一貫性があり、高性能な UI への近道を開発者に提供します。