CSS 速習チュートリアル

CSS 詳細度

1. 詳細度 (Specificity) とは?

同じ要素に対して複数の相反する CSS 宣言がある場合、ブラウザはどの宣言が最も要素に関連しているかを判断し、それを適用します。この判断基準となるのが詳細度(Specificity)です。

詳細度は、さまざまな種類の CSS セレクタで構成されるマッチング・ルールのようなものです。

2. 詳細度の階層 (The Hierarchy)

すべての CSS セレクタには、詳細度の階層内での場所があります。4 つのカテゴリがあり、それぞれのレベルが異なる重みを持っています。

  • インラインスタイル (Inline styles): HTML 要素に直接記述されるスタイル(例:<h1 style="color: pink;">)。詳細度において最も強力です。
  • ID セレクタ (IDs): 特定の ID を持つ要素を選択します(例:#navbar)。
  • クラス、属性、擬似クラス (Classes, attributes and pseudo-classes): クラス(.container)、属性([type="text"])、擬似クラス(:hover)が含まれます。
  • 要素と擬似要素 (Elements and pseudo-elements): 要素名(h1div)や擬似要素(::before)が含まれます。

3. 詳細度の計算方法

詳細度の計算方法を覚えるためのコツとして、「0, 0, 0, 0」という 4 つの桁で考える方法があります。

  1. 千の位: インラインスタイル(style 属性)ごとに 1 ポイント。
  2. 百の位: ID セレクタごとに 1 ポイント。
  3. 十の位: クラス、属性セレクタ、擬似クラスごとに 1 ポイント。
  4. 一の位: 要素名、擬似要素ごとに 1 ポイント。

       Note: ユニバーサルセレクタ(*)や結合子(+, >, ~)は詳細度に影響を与えません(0, 0, 0, 0)。

3.1 計算の例

  • h1 : 0, 0, 0, 1
  • h1 + p : 0, 0, 0, 2
  • .container : 0, 0, 1, 0
  • .container p : 0, 0, 1, 1
  • #header : 0, 1, 0, 0
  • #header .logo : 0, 1, 1, 0

最も高い数値を持つセレクタが「勝利」し、そのスタイルが適用されます。

4. 詳細度のルール (Specificity Rules)

4.1 同じ詳細度の場合:最後に記述されたものが優先される

2 つのセレクタの詳細度が全く同じ場合、スタイルシートの中で最後に記述された CSS ルールが適用されます。

/* この場合、背景は青になります */
h1 { background-color: yellow; }
h1 { background-color: blue; }

4.2 ID セレクタはクラスセレクタよりも詳細度が高い

ID セレクタは、どれだけ多くのクラスセレクタが並んでいても、それらより優先されます。

/* 背景は黄色になります。ID はクラスの集合より強いためです */
#content { background-color: yellow; }
.main .post .content { background-color: blue; }

4.3 コンテキストに応じたセレクタは要素セレクタより優先される

特定の要素をターゲットにするセレクタは、汎用的な要素セレクタよりも詳細度が高くなります。

/* 背景は緑になります */
div p { background-color: green; } /* 0,0,0,2 */
p { background-color: red; }       /* 0,0,0,1 */

5. !important ルール

CSS 宣言で !important ルールが使用されると、この宣言は詳細度に関係なく他のすべての宣言を上書きします。

/* 背景は必ず赤になります */
#myElement {
  background-color: blue !important;
}

.myClass {
  background-color: red;
}

!important は詳細度の計算を完全に無視するため、デバッグが困難になります。どうしても必要な場合を除き、使用は避けるべきです。!important を使う代わりに、詳細度の高いセレクタ(ID など)を使用するか、CSS の構造を見直すことを検討してください。