CSSの詳細度に負ける理由|スタイルが反映されない時の調査法

CSSの詳細度に負ける理由|スタイルが反映されない時の調査法
C
クリオ
Web制作ディレクター / フロントエンジニア

こんにちは!

今日は「CSSの詳細度に負ける理由|スタイルが反映されない時の調査法」についてお話しします。

詳細度って何?僕が最初につまずいた話

僕も新人の頃、ほんまにこれで悩みました。
せっかくbuttonのスタイルを書いたのに、なぜか反映されない。
もう一度書いても、何度書いてもダメ。
その時は「CSSって予測不可能だな」って思ってました。

でも実は、CSSはちゃんと順番を守ってるんです。
その順番が「詳細度」という考え方です。

簡単に言うと、詳細度は「どれだけ具体的なセレクタか」を数値化したもの。
詳細度が高い(より具体的な)ルールが、詳細度が低いルールを上書きします。

詳細度のルールは以下の通りです:

  • インラインスタイル(style=""):最強 1000点
  • IDセレクタ(#header):100点
  • クラスセレクタ(.button)、属性セレクタ([type="text"])、疑似クラス(:hover):10点
  • 要素セレクタ(buttonp):1点

たとえば、.buttonで書いたスタイルは、buttonだけで書いたスタイルより強いんです。
なぜなら10点 vs 1点だから。

現場あるあるな詳細度バトル3パターン

パターン1:クラスセレクタに負ける要素セレクタ

これ、めっちゃよく見かけます。

例えば、あなたがbutton要素に赤色を付けたいとします:

button { color: red; }

でも、他の誰かがグローバルスタイルで既に書いてます:

.primary-btn { color: blue; }

そして、HTMLはこう:

<button class="primary-btn">ボタン</button>

あなたのbuttonスタイルは1点。
相手の.primary-btnは10点。
結果:ボタンは青になります。
あなたのスタイルは負けるんです。

パターン2:IDセレクタの絶対的力

IDセレクタを見つけたら、もうそれに勝つのは難しい。
(正当な理由がない限り)

例えば:

#submit-btn { background: green; }

.button { background: yellow; }

どちらが勝つか?
IDの100点が、クラスの10点を圧倒します。

僕が現場で見た失敗は、新人が一生懸命.buttonのスタイルを調整しても、既存の#submit-btnに負けてることに気づかないパターン。
開発者ツールで確認するまで「なぜ変わらないの?」状態でした。

パターン3:セレクタの連鎖で詳細度がアップ

ここがトリッキーです。
セレクタを組み合わせると、詳細度も合算されます。

例:.container .button { color: red; }

これは「クラス」が2個だから、10 + 10 = 20点

.button { color: blue; }

これは10点なので、上のルールが勝ちます。

さらに複雑に:

div.container button.primary { color: red; }

これは1 + 10 + 1 + 10 = 22点

もう「どっちが強いのか」がパッと見では分かりませんよね。
これが詳細度トラブルが起きやすい理由です。

詳細度を上手に調査する方法

方法1:開発者ツールを信頼する

Chrome、Firefox、Safari、どのブラウザにも開発者ツール(DevTools)があります。
ここが最強の調査ツールです。

要素を右クリック→「検査」(またはInspect)で、該当要素を開く。
すると、右側に「Styles」パネルが出ます。

ここで、あなたのスタイルが「打ち消し線」で表示されてたら、それはより詳細度の高いルールに負けてるということ。
上から順に見ていくと、どのセレクタが勝ってるのか分かります。

方法2:詳細度計算サイトを使う

「CSS Specificity Calculator」というオンラインツールがあります。
セレクタをコピペするだけで、詳細度を数値化してくれます。

現場では、先輩とコードレビューする時に「このセレクタと、あのセレクタどっちが強い?」って話になることがあります。
そういう時にサッと計算できるので便利ですよ。

方法3:優しい解決策:クラスセレクタを統一する

詳細度トラブルを最初から避けるコツは「セレクタの書き方を統一する」ことです。

僕がいる現場では、こんなルールを決めてます:

  • IDセレクタは原則使わない(JavaScript用のIDはあり)
  • スタイリングはクラスセレクタだけ
  • セレクタの連鎖は2階層まで

こうすると、詳細度が予測可能になるんです。
「全部クラスだから、後に書いた方が勝つ」という単純ルールになる。

初心者こそ、この「シンプルに統一する」が大事です。

方法4:最終手段は!important

!importantを使ったら解決する」って聞いたことありますか?

color: red !important;

これは詳細度を無視して、その値を最強にします。
確かに動きます。

でも、僕は現場ではほぼ使いません。
理由は、後から誰かが!importantで上書きしたくなるから。
そしたらもっと複雑になる。

「詳細度の問題は!importantで解決」じゃなくて、「セレクタの書き方を見直して解決」するのが健全です。

まとめ

CSSの詳細度は、最初は「謎のルール」に見えるかもしれません。
でも、詳細度を理解すると、なぜスタイルが反映されないのかが分かるようになります。

大事なポイント: