Tailwindの hover: や md: って何?状態プレフィックスのしくみを調べた

「MedTimer お薬タイマー」という、薬を服用できる時間がわかるWebアプリを個人開発しています。

MedTimer おくすりタイマー
次に薬を服用できる時間を一目で確認できる、シンプルなおくすりタイマー

開発ログ↓

元看護師がつくった、次に飲める時間だけがわかるお薬タイマー【開発ログ】
「あと何時間で薬が飲めるか」だけを確認できる無料タイマー「MedTimer」をつくりました。元看護師の視点で項目を絞った理由と、初めて実装したログイン機能についてまとめています。

ReactとTailwind CSSで作っているのですが、ボタンにマウスを乗せたら色が変わる動きや、スマホとパソコンで並び方を変える指定を、これまでAIに任せきりにしていました。(ホバーアクションについてはモバイルファーストにしたため外しました。)

コードを見ると hover:bg-accent とか md:grid-cols-2 のように、クラスの前に hover:md: が付いています。

この「:(コロン)の前にくっついている部分」が何なのか、ずっとふわっとしたままでした。

今回そこを調べたので、わかったことをまとめておきます。

これは私が実際に使い込んだというより、コードを読み解くために調べた内容が中心です。

同じように hover:md: で「これ何だろう」と止まっている方の役に立ったらうれしいです。

プレフィックスは「どんなときに効かせるか」の条件

調べてわかったのは、hover:md: のような部分はプレフィックス(接頭辞)と呼ばれる「条件」だということでした。

ふつうのクラスは、いつでもそのスタイルが効きます。

ここでは、下記の色を使いたいと思います↓

bg-accent      /* いつでも青の背景 */

これは、あらかじめ定義しておいたもので、実際に使うときは自分で決めたのを使ってください!

詳しい内容は下記記事をご参照ください

Tailwind CSS|–color-〇〇 の「〇〇」がそのままクラス名になる
Tailwind CSSの「bg-accent」のような独自カラーがどこで決まっているのかをまとめました。index.cssの@themeに–color-で色を定義すると、bg-〇〇やtext-〇〇として使えるようになるしくみを、実際のコードで簡単に解説しています。

ここにプレフィックスを付けると、「その条件のときだけ効く」という意味になります。

hover:bg-accent   /* マウスを乗せたときだけ青の背景 */

つまり クラスの前についた条件 + 本体のクラス という組み立てなんですね。

「いつ効かせるか」を前に、「何を効かせるか」を後ろに書く、と考えると読みやすくなりました。

よく出てくるプレフィックス

調べた範囲で、よく見かけるものを整理しておきます。

状態で変わるもの(hover / focus / active など)

マウスの動きや入力の状態に反応するプレフィックスです。

プレフィックス効くタイミング
hover:マウスを乗せたとき
focus:入力欄などを選択(フォーカス)したとき
active:クリックしている最中
disabled:無効化されているとき

たとえばボタンなら、こういう書き方になります。

<button class="bg-accent hover:bg-accent-soft">
  ボタン
</button>

ふだんは bg-accent、マウスを乗せたときだけ bg-accent-soft に変わる、という意味です。

お薬タイマーの色の変数(--color-accent など)については別の記事に書いたので、そちらとあわせて読むとつながると思います。

Tailwindの色「–color-ink-soft」って何色?VScodeの拡張機能「Color Highlight」が便利!
お薬タイマーの開発中、AIが書いた「–color-ink-soft」という色の指定がわからず、カラーコードを探し回りました。Tailwind v4の色変数のしくみと、index.cssやColor Highlightで色を確認する方法を初心者目線でまとめています

画面幅で変わるもの(sm / md / lg など)

こちらは、画面の幅に応じてスタイルを切り替えるプレフィックスです。

スマホとパソコンでレイアウトを変えたいときに使う、レスポンシブ対応の部分です。

プレフィックス効き始める画面幅
(なし)すべて(スマホ基準)
sm:640px以上
md:768px以上
lg:1024px以上
xl:1280px以上

ここで大事だと思ったのが、Tailwindは「スマホ基準」で考えるという点です。

プレフィックスを付けないクラスがスマホ用の土台になり、md: などは「その画面幅以上になったら上書きする」という足し算の形で効きます。

<div class="grid-cols-1 md:grid-cols-2">

この場合、スマホでは1列(grid-cols-1)、768px以上になったら2列(md:grid-cols-2)に変わります。

「小さい画面をまず作って、大きい画面で調整を足す」という順番で考えると、レスポンシブの指定が読みやすくなりました。

プレフィックスは重ねられる

調べていて「なるほど」と思ったのが、プレフィックスは2つ以上重ねられることでした。

md:hover:bg-accent-soft

これは「768px以上の画面で、かつマウスを乗せたときだけ bg-accent-soft にする」という意味になります。

条件を左から順につなげていくイメージです。

スマホにはマウスのホバーがないので、パソコンでだけ色を変えたい、というときにこういう重ねがけをするようです。

つまずきやすいポイント

調べる中で「これは知らないとハマりそう」と思った点をまとめておきます。

スマホ用に md: を付けてしまう勘違い

レスポンシブで一番間違えやすいのがここのようです。

「スマホでは1列にしたい」と思って md:grid-cols-1 と書いてしまうと、意図と逆になります。

md: は「768px以上で効く」条件なので、これだとパソコンのときに1列になってしまいます。

スマホ用はプレフィックスなしで書く、というのが基本です。

/* 正しい:スマホ1列、PC2列 */
grid-cols-1 md:grid-cols-2

/* 勘違いしやすい:スマホの指定にmdを付けてしまう */
md:grid-cols-1 grid-cols-2

クラス名を変数で組み立てると効かない

これは余白の記事にも書いたことですが、プレフィックス付きのクラスでも同じでした。

Tailwindは、ソースコードにそのままの文字列で書かれたクラスしか生成しないので、hover:md: の部分を変数でつなぐと拾ってもらえません。

// 効く:hover:bg-accent がそのまま書いてある
className="hover:bg-accent"

// 効かない:状態を変数で連結している
className={`${state}:bg-accent`}

プレフィックスも含めて、クラスは完成した文字列で書く、と覚えておこうと思いました。

focus: のリングが出ない・気づかない

focus: は入力欄を選んだときに効きますが、見た目の変化を自分で指定しないと何も起きません。

よく使われるのが、フォーカス時に枠(リング)を出す指定のようです。

focus:ring-2 focus:ring-accent

入力欄を選んだときに、アクセント色の枠が2pxで出る、という意味になります。

フォームの使いやすさやアクセシビリティに関わる部分なので、余裕が出てきたら私も意識して入れたいところだと思いました。

まとめ

今回調べてわかったのは、hover:md: のようなプレフィックスは「どんなときにそのスタイルを効かせるか」という条件で、条件を前・本体のクラスを後ろに書く組み立てになっている、ということでした。

状態で変わるもの(hover: focus: active:)と、画面幅で変わるもの(sm: md: lg:)があって、md:hover: のように重ねると条件を組み合わせられます。

レスポンシブはスマホをプレフィックスなしの土台にして、大きい画面で上書きを足すという考え方が基本で、スマホ用に md: を付けてしまうのが一番の勘違いポイントのようです。

私自身はまだAIが書いたコードを読み解いている段階で、自分でゼロから状態変化やレスポンシブを組めるところまでは来ていません。

それでも「この hover: は条件なんだ」とわかっただけで、コードを見たときの怖さが少し減りました。

Tailwindの基本のクラス一覧は別のチートシート記事にまとめているので、値の逆引きはそちらが便利だと思います。

【保存版】Tailwind CSS チートシート|文字サイズ・余白・Flex・Grid・レスポンシブ対応まとめ
Tailwind CSSを使うたびに、text-xlって何pxだっけ?px-4って左右16pxだっけ?justify-betweenとitems-centerが毎回ごっちゃになる……そういうことで、よく表記方法を検索しているのですが、自分で…

余白のしくみや色の変数について書いた記事もあります。

Tailwind v4の余白がわからない!mb-6の中身「calc(var(–spacing) * 6)」を調べた話
お薬タイマーの開発中、Tailwindの余白がなぜかうまく動かず悩みました。mb-6の正体「calc(var(–spacing) * 6)」のしくみと、余白が変わらないときの原因、私が使った調整方法を初心者目線でまとめています。
Tailwindの色「–color-ink-soft」って何色?VScodeの拡張機能「Color Highlight」が便利!
お薬タイマーの開発中、AIが書いた「–color-ink-soft」という色の指定がわからず、カラーコードを探し回りました。Tailwind v4の色変数のしくみと、index.cssやColor Highlightで色を確認する方法を初心者目線でまとめています



タイトルとURLをコピーしました