0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tailwind CSSって何?:人気のCSSライブラリを理解する

Posted at

1. Tailwind CSSとは何か

Tailwindは「ユーティリティファースト(Utility-First)」という考え方のCSSフレームワークです。
一言でいえば、「クラス名で見た目を直接指定する」スタイルの書き方を提供してくれます。

普通のCSSでは、「見た目に名前をつけて、あとでそれを呼び出す」方法をとります。
たとえば次のような書き方です。

.button {
  background: blue;
  color: white;
  padding: 8px 16px;
}
<button class="button">送信</button>

.button というクラスに「青いボタンの見た目」をまとめておき、
HTMLではその名前を呼び出して使う――これが従来のCSSの基本的な考え方です。

一方、Tailwindでは名前をつけず、見た目をその場で書くという発想になります。

<button class="bg-blue-500 text-white px-4 py-2 rounded">送信</button>

ここでは .button のような抽象的な名前はありません。
bg-blue-500 や px-4 など、クラス名そのものがスタイルを意味しています。

つまり、HTMLを読むだけで見た目がわかる状態。
Tailwindはそんな「直感的に書けるCSS」を目指したフレームワークです。

2. なぜこんな書き方をするの?(Tailwindの思想)

Tailwindが生まれた理由は、CSSが抱える「副作用(サイドエフェクト)」をなくすためです。

CSSは基本的にグローバルな仕組みです。
1つのクラスを変更すると、別のページやコンポーネントのデザインまで影響してしまう。
たとえば、あるページで .button の色を少し変えただけで、
他の場所のボタンまで全部変わってしまう――そんな経験はありませんか?

この構造的な問題を断ち切るために、Tailwindはとてもシンプルな考え方を採用しました。
それが「クラス1つ=スタイル1つ(プロパティ1つ)」というルールです。

たとえば
bg-blue-500 は「背景色を青くする」だけ、
p-4 は「余白を取る」だけ。

それぞれが独立しており、他のクラスに干渉しません。
TailwindのCSS自体は最終的にグローバルに展開されますが、
「上書きし合う意味のあるクラス」が存在しないため、結果的に副作用が起きないのです。

3. Tailwindが動く仕組み(PostCSSの力)

Tailwindは、実はただのCSSの集まりではありません。
その裏では 「PostCSS」 という JavaScript 製のツールが動いています。

PostCSSは、CSSのコードをJavaScriptで読み取り・変換するための仕組みです。
TailwindはこのPostCSSの“プラグイン”として動作し、あなたが書いたTailwind独自の命令を本物のCSSに変換します。(注意:V3以降、CLIツールやフレームワーク統合では直接JITコンパイラが動作している)

たとえば、CSSファイルに次のように書くとしましょう。

@tailwind base;
@tailwind components;
@tailwind utilities;

これらはブラウザがそのまま理解できるCSSではなく、Tailwindへの「指示文」です。
まず PostCSS(=JavaScriptプログラム) がこのCSSファイルを読み込み、
中に書かれた @tailwind の命令を Tailwind プラグインに渡します。
Tailwindはその命令を解釈し、以下のようにCSSを作成します。

  • base:ブラウザのデフォルトCSSをリセットする「Preflight」を挿入

  • components:ボタンなどの共通スタイルを注入

  • utilities:text-center や bg-blue-500 などのユーティリティクラスを展開

最終的に、PostCSSはこれらをまとめて通常のCSSファイルとして出力します。
ブラウザが読むときには、もうTailwindの命令は残っていません。
純粋なCSSだけが残り、いつものように読み込まれます。

つまり、Tailwindは「書きやすくするための仕組み」を提供しているだけで、
実際にCSSを作っているのは JavaScriptで動くPostCSS なのです。

4. @apply の使いどころ

Tailwindでは、ユーティリティクラスをCSSにまとめたいときに @apply が使えます。

.btn-primary {
  @apply bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700;
}

このように書くと、Tailwindがビルド時に @apply を解釈し、
それぞれのクラスを展開して“普通のCSS”に変換します。

ただし、ここには少し落とし穴があります。
@apply を多用すると、「HTMLを見ただけで見た目がわかる」というTailwind本来の強みが失われてしまいます。
つまり、昔のCSS管理に逆戻りしてしまうのです。

@apply を使うべきなのは、「意味をまとめる」目的のときだけです。
たとえば .btn-primary や .card のように、“役割ラベル”をつけたい場合。
一方で、単なる見た目の共通化(p-4, rounded など)には使わない方がよいでしょう。

5. group-* と data-[state=...] の仕組み

ちょっと工夫した特殊な書き方も見ていきましょう。

Tailwindでは、CSSで直接書くと少し面倒なパターンも、独自の構文や他の機能との合わせ技でスマートに書けることがあります。
ここでは、そんなちょっと工夫された特殊な書き方を見ていきましょう。

5-1. group-*:親の状態を子に伝える

たとえば、ある要素をホバーしたときに、その中の要素を変化させたいとします。
通常のCSSでは、セレクタをこう書く必要があります。

.wrapper:hover .child {
  opacity: 0.5;
}
<div class="wrapper">
  <p class="child">Hover!</p>
</div>

Tailwindでは、この関係をクラス名だけで簡潔に表現できます。

.group:hover .group-hover-opacity-100 { 
  opacity: 1;
}
<div class="group bg-white p-4">
  <p class="opacity-0 group-hover:opacity-100 transition">Hover!</p>
</div>

Tailwindはビルド時にこれを次のようなCSSに展開します。

.group:hover .group-hover\:opacity-100 {
  opacity: 1;
}

5-2. data-[state=on]と合わせて使う:アプリの状態をUIに反映

data-* はHTMLの標準仕様で定義されたカスタム属性です。
自由な名前で値を持たせることができ、JavaScriptからも簡単に書き換えられます。

たとえば、こんなボタンを考えてみましょう。

<button
  data-state="on"
  class="data-[state=on]:bg-blue-500 data-[state=off]:bg-gray-400 px-4 py-2 rounded text-white">
  トグル
</button>

Tailwindはこれを内部で次のような属性セレクタに変換します。

[data-state=on] .data-\[state\=on\]\:bg-blue-500 {
  background-color: #3b82f6;
}

[data-state=off] .data-\[state\=off\]\:bg-gray-400 {
  background-color: #9ca3af;
}

つまり、JavaScriptなどで data-state の値を切り替えるだけで、
スタイルが自動的に変化します。

btn.dataset.state = btn.dataset.state === 'on' ? 'off' : 'on';

この仕組みは、アプリの状態(ロジック)をCSSに自然に反映させるためのものです。

Tailwindはこうした構文によって、
「CSSをロジックに寄せる」——つまり、見た目の変化とアプリの状態を直接結びつける
という新しい書き方を可能にしています。

6. Tailwindが“壊れないCSS”を実現できる理由

Tailwindで生成されるCSSは、最終的に1枚の大きなグローバルCSSとしてまとめられます。
しかし、驚くほどスタイルの衝突が起きません。
なぜなら、Tailwindは「上書き前提の命名」をしていないからです。

通常のCSSでは、button や .title のような抽象的なクラス名を使うと、
別のコンポーネントで同じ名前が再利用されたときに上書きが起こります。
これがCSSの典型的な副作用(スタイル汚染)です。

Tailwindでは、ユーティリティクラスがすべて単一責任で設計されています。
bg-blue-500 は背景色だけ、p-4 は余白だけ、text-center は文字揃えだけ。
それぞれが完全に独立しているため、他のクラスと衝突しません。

Tailwindはこうした「クラスの局所性(locality)」を重視しています。
これは公式な用語ではありませんが、実質的にローカルスコープのような効果をもたらします。

  • 各ユーティリティクラスは他を汚染しない
  • スタイルはコンポーネントの中で完結する
  • 結果として副作用が発生しない

つまり、TailwindはグローバルなCSS構造を保ちながら、ローカルな安全性を実現しているのです。
普通なら相反するはずの「スコープレス」と「局所性」を両立させた、
非常にユニークな設計思想といえます。

これこそが、Tailwindが「チーム開発でも壊れにくいCSS」を提供できる理由です。

7. まとめ:Tailwindは“CSSを書く方法”ではなく“設計思想”

Tailwindが目指しているのは、“壊れないCSS”をチーム全体で共有できる状態。
そのために、いくつもの仕組みが組み合わされています。

  • CSSの副作用を消すためにユーティリティ化

  • 見た目をHTMLに閉じることで局所性を実現

  • 状態を扱う構文(group / data-*)でUIを賢く制御

  • PostCSSによるビルド処理で最適化と自動生成

Tailwindが示しているのは、CSSの“書き方”ではなく、
CSSとどう向き合うかという考え方そのものなのです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?