メインコンテンツまでスキップ

Tailwind CSS の基礎:ユーティリティファースト

この章で学ぶこと

Tailwind CSS の基本的な考え方と、完成形の章で見た Button のクラスが何をしているのかを理解します。色(デザイントークン)の話は次章に譲り、ここでは土台となるユーティリティと状態修飾子を押さえます。

ユーティリティファーストとは

従来の CSS は、コンポーネントごとにクラスを作り、そこにスタイルを書いていました。

/* 従来のアプローチ */
.button {
display: inline-flex;
align-items: center;
padding: 0.5rem 1rem;
border-radius: 0.375rem;
}

Tailwind CSS では、小さなユーティリティクラスを組み合わせてスタイルを作ります。

<button class="inline-flex items-center px-4 py-2 rounded-md">Click me</button>

メリット

メリット説明
命名が不要クラス名を考えなくてよい
名前衝突がないグローバルな CSS のクラス名衝突が起きない
変更が局所的その要素だけ直せばよい
一貫性が出る決まったスケール(後述)から選ぶので揃う

「クラスが長くなる」という弱点は、コンポーネントにまとめることで解決します。それがまさに本書の Button です。

長いクラス列 "inline-flex items-center justify-center px-4 ..."
↓ コンポーネントに閉じ込める
利用側 <Button>Click me</Button>

Button のベースクラスを分解する

完成形の章の Button のベースクラスを見てみましょう。

"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50"

レイアウト

クラス意味
inline-flexインラインの Flexbox にする
items-center縦方向を中央揃え
justify-center横方向を中央揃え
gap-2中身(アイコンとテキストなど)の間隔を空ける
ボタンの中身:[icon] + ボタンテキスト
・gap-2 … アイコンとテキストの間隔
・items-center … 縦方向を中央揃え
・justify-center … 横方向を中央揃え

テキスト

クラス意味
whitespace-nowrapテキストを折り返さない
text-smフォントサイズ小(0.875rem)
font-mediumやや太字(font-weight: 500)

装飾

クラス意味
rounded-md角丸(中)
transition-colors色の変化をなめらかにアニメーション

フォーカスと無効状態(アクセシビリティ)

クラス意味
outline-noneブラウザ既定のアウトラインを消す
focus-visible:ring-2キーボードフォーカス時にリングを表示
focus-visible:ring-ringリングの色(ring トークン、デザイントークンの章
disabled:pointer-events-none無効時はクリックを受け付けない
disabled:opacity-50無効時は半透明にする
備考

focus-visible は、キーボード操作のときだけフォーカスリングを表示する指定です。マウスクリックでは出ません。「キーボード利用者には分かりやすく、マウス利用者には邪魔をしない」という、アクセシビリティのベストプラクティスです。

状態修飾子(modifier)

hover:disabled: のような接頭辞を付けると、状態に応じたスタイルを指定できます。

<button class="bg-primary hover:bg-primary/90 disabled:opacity-50">ボタン</button>
修飾子いつ効くか
hover:マウスを乗せたとき
focus:フォーカス時(マウス・キーボード両方)
focus-visible:キーボードフォーカス時のみ
active:押している間
disabled:disabled 属性があるとき
dark:ダークモード時

サイズで使われているクラス

size: {
default: "h-9 px-4 py-2",
sm: "h-8 px-3",
lg: "h-10 px-6",
icon: "size-9",
}
クラス意味
h-9 / h-8 / h-10高さ 36px / 32px / 40px
px-4 / px-3 / px-6左右パディング 16px / 12px / 24px
py-2上下パディング 8px
size-9幅と高さを同時に 36px(正方形。アイコンボタン用)

スペーシングのスケール

Tailwind の余白やサイズは、一定の比率のスケールから選びます。

0 → 0px
1 → 4px
2 → 8px
3 → 12px
4 → 16px
6 → 24px
8 → 32px
9 → 36px
10 → 40px

数字 1 つあたり 4px が基本です。この決まったスケールから選ぶので、画面全体で余白やサイズが自然と揃い、デザインに統一感が出ます。これもデザインシステムの一部です。

透明度の指定

hover:bg-primary/90/90 は「不透明度 90%」を意味します。

<div class="bg-primary/50">50%</div>
<div class="bg-primary/90">90%</div>

ベースの色をそのまま少し薄くしてホバー色にできるので、別の色を用意せずに済みます。

色は「デザイントークン」で指定する

Button の bg-primarytext-primary-foreground は、Tailwind に最初から入っている色ではありません。これらはデザイントークンと呼ばれる、プロジェクトで定義した「意味を持つ色」です。

variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
}

Tailwind v4 では、これらを CSS の @theme と CSS 変数で定義します。bg-blue-500 のように色を直接指定するのではなく、bg-primary(主役の色)という意味で指定することで、テーマの切り替えや一貫性が実現できます。

その仕組みは、次章でじっくり学びます。

この章のまとめ

  • ユーティリティファースト:小さなクラスを組み合わせてスタイルを作る
  • Button のベースクラスはレイアウト・テキスト・装飾・フォーカス・無効状態に分けて読める
  • 状態修飾子hover: / focus-visible: / disabled: / dark:)で状態別のスタイルを指定する
  • スペーシングスケールが一貫性を生む
  • 色は bg-blue-500 ではなく bg-primary というデザイントークンで指定する(次章)

次章では、その色(デザイントークン)とデザインシステムの考え方を学びます。