Tailwind CSS・状態と画面幅に反応させる

状態に反応させる(hover:とfocus:)

hover:bg-blue-600と書けばマウスを乗せたとき。md:とまったく同じ仕組みで、擬似クラスも接頭辞で書けます。ボタンの定番、フォーカスの見た目、group-hoverまで実例つきでまとめます。

前の回で覚えた「接頭辞を付ける」という書き方は、画面幅だけでなく状態にも使えます。仕組みはまったく同じなので、新しく覚えるのは接頭辞の名前だけです。

<button class="bg-orange-500 hover:bg-orange-600">
  送信する
</button>

hover:bg-orange-600が「マウスを乗せたとき背景をorange-600にする」。素のCSSに戻すとこうです。

button {
  background-color: #f97316;
}
button:hover {
  background-color: #ea580c;
}

CSSの擬似クラスが、そのまま接頭辞になっているだけです。

よく使う接頭辞

接頭辞素のCSSいつ効くか
hover::hoverマウスを乗せたとき
focus::focusフォーカスが当たったとき
focus-visible::focus-visibleキーボード操作でフォーカスしたとき
active::active押している最中
disabled::disabled操作できない状態
first: / last::first-child / :last-child最初 / 最後の子
odd: / even::nth-child(odd) / (even)奇数行 / 偶数行
dark:ダークモード端末がダークモードのとき
group-hover:親にマウスが乗ったとき後述

組み合わせて重ねられるのもポイントです。

<!-- 768px以上で、マウスを乗せたとき -->
<a class="text-slate-600 md:hover:text-orange-500">リンク</a>

接頭辞は左から順に条件が積み上がります。読み方は「md:のとき、hoverしたら」。

ボタンの定番セット

押せるものを作るときは、これをひとかたまりとして覚えてしまうのが早いです。

<button class="px-6 py-3 bg-orange-500 text-white font-bold rounded-full
               hover:bg-orange-600
               focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2
               active:scale-95
               transition duration-200">
  送信する
</button>

1行ずつの意味はこうです。

  • 1行目——ふだんの見た目(余白・色・太字・丸み)
  • hover:——マウスを乗せたら少し濃くする
  • focus-visible:——キーボードで来たとき、囲みを出す
  • active:scale-95——押している最中に少し縮む(押した感)
  • transition duration-200——変化を0.2秒でなめらかに
コースアクセシビリティフォーカスの見た目がなぜ大事なのかは、アクセシビリティのコースへ
hover:bg-orange-600active:scale-95transitionの組み合わせを、手で定義して再現したものです。

transitionを忘れると固く見える

hover:だけだと、見た目がパッと瞬間で切りかわります。なめらかにしたいならtransitionを足します。

Tailwind素のCSS
transitionよく使うプロパティにtransitionを設定
transition-colors色の変化だけ
duration-200transition-duration: 200ms
ease-outtransition-timing-function: ease-out

transition duration-200をひとかたまりで覚えて、押せるものには必ず付ける——これだけで手ざわりが一段よくなります。

コースWebアニメーションtransitionそのものの考え方は、Webアニメーションのコースへ

group——親に反応して子を変える

カード全体にマウスを乗せたとき、中のタイトルの色を変えたい。素のCSSだとこう書きます。

.card:hover .card__title {
  color: #f97316;
}

Tailwindでは、親にgroupという目印を付けて、子にgroup-hover:を書きます。

<a href="#" class="group block p-4 bg-white rounded-xl hover:shadow-lg transition">
  <p class="font-bold group-hover:text-orange-500 transition">しまちゃんのページ</p>
  <p class="text-sm text-slate-500">クリックで開きます</p>
</a>

groupスタイルを持たない目印で、「この子たちは、この親の状態を見ていいよ」という宣言です。カードのリンク全体を押せるようにする定番の作りなので、覚えておくと出番が多いです。

dark:——ダークモードに対応する

端末がダークモードのときだけ効く指定も、接頭辞で書けます。

<div class="bg-white text-slate-800 dark:bg-slate-800 dark:text-slate-100 p-4 rounded-xl">
  どちらのモードでも読めます
</div>

明るいほうを土台にして、dark:で上書きするのが基本の形です。md:と同じ発想なので、書き方に迷いません。

気をつけたいのは指定を1組でセットにすることです。dark:bg-slate-800だけ書いて文字色を忘れると、暗い背景に暗い文字という読めない組み合わせになります。背景を変えるなら文字色も、と対で考えてください。

CSSダークモードに対応しようダークモードそのものの仕組みは、CSSコースのこの回へ

一覧の行を交互に塗る

odd:even:は、表や一覧で便利です。

<ul>
  <li class="p-2 odd:bg-slate-50">1行目</li>
  <li class="p-2 odd:bg-slate-50">2行目</li>
  <li class="p-2 odd:bg-slate-50">3行目</li>
</ul>

素のCSSの:nth-child(odd)と同じで、同じクラスを全部の行に書いておけば、奇数行だけに効きます。行が増えても書き方は変わりません。

このレッスンのまとめ

  1. 擬似クラスも接頭辞で書けるmd:とまったく同じ仕組み
  2. 押せるものにはhover:focus-visible:transitionの3点セット
  3. hover:だけだとキーボードで操作する人に伝わらない
  4. groupを親に付ければ、親の状態で子のスタイルを変えられる
  5. dark:明るい方を土台に上書き。背景と文字色は必ず対で指定する
  6. 接頭辞は1クラスごとに付け直す——まとめて効かせることはできない

書き方はここまでで一通りそろいました。最後の回では、書いてきて感じたはずの「これは素のCSSのほうが早いな」という感覚を、判断の基準として言葉にします。

よくある質問

Tailwindでhoverのスタイルはどう書きますか?
クラスの前にhover:を付けます。hover:bg-orange-600 と書けば「マウスを乗せたとき背景をorange-600にする」という意味です。前の回のmd:とまったく同じ仕組みで、接頭辞が擬似クラスに変わっただけです。
hoverだけ書けば十分ですか?
十分ではありません。キーボードで操作する人にはhoverが起きないので、focus-visible:も一緒に指定してください。押せるものには「マウスでも分かる・キーボードでも分かる」の両方が必要です。
アニメーションを効かせるにはどうしますか?
transitionクラスを足します。hover:だけだと見た目がパッと切りかわるので、transition duration-200 のように書くと、なめらかに変化します。
親にマウスを乗せたとき子を変えることはできますか?
できます。親にgroupというクラスを付け、子にgroup-hover:を付けます。カード全体にマウスを乗せたときタイトルの色を変える、といった定番の動きがこれで書けます。