【実務・中級編】 :is()の引数による詳細度決定 – CSS実践ガイド

CSSの「詳細度」を支配する:`:is()`の裏側と、僕らが陥る罠について

やあ。今日もコンポーネントのスタイリングで頭を抱えているかい?
フロントエンドの現場で長く生き残っていると、たまに「CSSがなぜか当たらない」「意図せず上書きされてしまう」という、CSSあるあるの泥沼に足を取られることがある。

特に、最近のCSSで強力な武器となる `:is()` 擬似クラス。これ、便利すぎて思考停止で使っていると、足元をすくわれるぞ。今日は、この `:is()` が持つ「詳細度(Specificity)の決定ロジック」という、現場で最も誤解されやすい罠について深掘りしよう。

—

`:is()` の詳細度は「一番強いやつ」に合わせる

まず、結論から言おう。`:is()` 擬似クラス自体の詳細度は、その引数の中に含まれるセレクタのうち、最も詳細度が高いものが採用される。

これは、従来の `:not()` や `:has()` が「セレクタとしてカウントされない(詳細度が0)」という挙動と明確に異なる点だ。ここを勘違いしていると、デバッグ中に「えっ、なんでこのスタイルが勝つの?」と30分溶かすことになる。

実例で見てみよう

/ 1. 普通のクラス /
.button { color: blue; }

/ 2. :is() を使ったセレクタ /
/ :is(.btn, #main .nav) の詳細度は、#main .nav (IDセレクタを含む) と同等になる /
:is(.btn, #main .nav) {
color: red; / こちらが優先される /
}

ブラウザは `:is()` を解釈するとき、「引数の中で最も重いセレクタ」を拾い上げ、それをその `:is()` の詳細度として扱って計算するんだ。つまり、`:is()` を使ったからといって詳細度がリセットされるわけじゃない。むしろ、書き方によっては意図せず詳細度を爆上げしてしまう「時限爆弾」になり得るということだ。

—

なぜこれが現場で問題になるのか

チーム開発をしていると、つい「セレクタを短く書けるから」という理由だけで `:is()` を多用したくなる。しかし、詳細度の計算ルールを意識せずに適当なセレクタを放り込むと、将来的なスタイルの上書きが困難になる。

例えば、こんなコードを見てくれ。

/ 共通コンポーネントのスタイル /
.card .title { font-size: 16px; }

/

  • 修正用として追加したつもりが、
  • .card #header .title というIDを含んだセレクタを :is() に入れたせいで、
  • 今後どんなに強力なクラスを当てても上書きできない「詳細度の怪物」が生まれる

/
:is(.card .title, .card #header .title) {
font-size: 20px;
}

この `:is()` は、IDセレクタを含んでいるため、非常に高い詳細度を持つ。後から「特定のカードだけ少し小さくしたい」と思っても、同じかそれ以上の詳細度を持つセレクタを強引に書かない限り、CSSは無視され続ける。これが「CSSのスパゲッティ化」の第一歩だ。

—

実践:`:is()` を賢く使いこなすためのTips

では、どうすればいいか? 実務レベルで推奨したいのは、「`:is()` の中身はなるべく詳細度を揃える」ということだ。

良い例:詳細度を平準化する

/ どちらもクラスのみなので、詳細度は「クラス1つ分」で安定する /
:is(.header, .footer, .sidebar) .link {
color: #333;
}

/ 悪い例:詳細度がバラバラ /
/ これだと、一番左の .header .link の詳細度が .container #main .link に引きずられて上がる /
:is(.header .link, .container #main .link) {
color: #666;
}

もし詳細度を一定に保ちたい、あるいは意図的に下げたいのであれば、モダンCSSのもう一つの切り札、`:where()` を検討してほしい。

`:where()` という選択肢

`:where()` は `:is()` と書き方は同じだが、詳細度が常に0だ。

/ これなら、後からどんなクラスでも簡単に上書きできる /
:where(.header, .footer) .link {
color: #333;
}

—

まとめ:CSSアーキテクトとしての視点

1. :is() の詳細度は「引数の中で最大のもの」に依存する。
2. 安易な `:is()` の使用は、詳細度を意図せず釣り上げ、メンテナンス性を下げる。
3. 詳細度を管理下に置きたいなら `:is()`、詳細度を無視したいなら `:where()` を選ぶ。

CSSの設計において、僕たちが目指すべきは「詳細度と戦わないCSS」だ。`:is()` は便利な道具だが、それはあくまで「効率化」のためのもの。詳細度の計算をブラウザ任せにせず、自分たちでコントロールできるようになると、コードの品質は一段上のステージに行ける。

さて、そろそろ次のタスクだ。みんなも、自分の書いたCSSが「何という強さ(詳細度)」を持っているのか、一度立ち止まって考えてみてくれ。それが、優れたフロントエンドエンジニアへの近道だ。

コメント

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