home
twitter
ページトップへ
目次
  • そもそもCSSの「セレクター」とは何か?
  • 「詳細度アルゴリズム」とは何か?
  • 「詳細度」はどのようにして決まるか?
  • 基本的に「詳細度」の数値が高い方が優先される
  • 最初に「id列」の数値が大きいセレクターが最も優先される
  • 次に「class列」の数値が大きいセレクターが優先される
  • 最後に「type列」の数値が大きいセレクターが優先される
  • 結合子はカウントされない
  • 「*」全称セレクターもカウントされない
  • 「:not()、:has()、:is()」はカウントされない
  • 「詳細度アルゴリズム」の範囲外
  • 「インラインスタイル」
  • 「!important」が最優先
  • まずは詳細度を低く書く
  • 「属性セレクター」を使って「idセレクター」の詳細度を下げる
  • 複合セレクターを使う「#hoge#hoge」
  • 参考リンク。
  • あわせて読みたい記事。
  • まとめ
about
categories
page
archive
皇帝ペンギンブログ

2024/02/19 (更新日:2024/07/11)

【CSS】「詳細度アルゴリズム」について解説!【分かりやすい】

Categories > CSSのセレクター編
こんばんは!初めましての方は初めまして!
しゅーた(@chibasyuta)です!

この記事ではCSSの「詳細度アルゴリズム」について解説します。

「詳細度アルゴリズム」って何??

このような方が対象です。

この記事の内容!

  • そもそもセレクターとは何か?
  • 「詳細度アルゴリズム」とは何か?
また、下の動画でも「詳細度アルゴリズム」について詳しく解説しているので、一緒に実際にコードを書きながら学びたい方はこちらをどうぞ!

それでは内容へ入ります!

目次
非表示
  • そもそもCSSの「セレクター」とは何か?
  • 「詳細度アルゴリズム」とは何か?
  • 「詳細度」はどのようにして決まるか?
  • 基本的に「詳細度」の数値が高い方が優先される
  • 最初に「id列」の数値が大きいセレクターが最も優先される
  • 次に「class列」の数値が大きいセレクターが優先される
  • 最後に「type列」の数値が大きいセレクターが優先される
  • 結合子はカウントされない
  • 「*」全称セレクターもカウントされない
  • 「:not()、:has()、:is()」はカウントされない
  • 「詳細度アルゴリズム」の範囲外
  • 「インラインスタイル」
  • 「!important」が最優先
  • まずは詳細度を低く書く
  • 「属性セレクター」を使って「idセレクター」の詳細度を下げる
  • 複合セレクターを使う「#hoge#hoge」
  • 参考リンク。
  • あわせて読みたい記事。
  • まとめ

そもそもCSSの「セレクター」とは何か?

セレクターの箇所を図示

CSSの「セレクター」とは「どの要素にスタイルを当てるか?」を指定する箇所のことを指します。

ふむふむ。

「詳細度アルゴリズム」とは何か?

「詳細度アルゴリズム」とは何か?

CSSの「詳細度アルゴリズム」とは、異なるセレクターの宣言が競合した場合に「どのセレクターからのスタイルを優先するか?」を決定するアルゴリズムのことを指します。

それぞれのセレクターに「詳細度」が与えられ、競合した場合は「詳細度」が高いセレクターからのスタイルが優先されます。

ふむふむ。

「詳細度」はどのようにして決まるか?

「詳細度」はどのようにして決まるか?

まずそのセレクターに使われている「idセレクターの数」「クラスセレクター、属性セレクター、疑似クラスセレクターの数」「要素型セレクター、疑似要素セレクターの数」を計算します。

「h1.foo」だったら(0, 1, 1)

「ul li」だったら(0, 0, 2)

「#hoge」だったら(1, 0, 0)

のように(id列, class列, type列)と別々に集計します。

これが「詳細度」です。あとはその「詳細度」を「詳細度アルゴリズム」によって比べればセレクターの優先順位が決まります。

基本的に「詳細度」の数値が高い方が優先される

スタートは「(0, 0, 0)」です。

そこからそれぞれの列に該当する成分があれば、1つずつ足していきます。

「#hoge.foo.box  h3.active」だったら、(1, 3, 1)ですね。

最初に「id列」の数値が大きいセレクターが最も優先される

詳細度を決める上で最も重要なのは「id列」の数値です。

「h1.foo」だったら(0, 1, 1)

「ul li」だったら(0, 0, 2)

「#hoge」だったら(1, 0, 0)

この3つだと「id列」の数値が最も高いのは「#hoge」じゃないですか。なのでこれが最も優先されます。

次に「class列」の数値が大きいセレクターが優先される

「id列」が同じ数値だった場合、次に使われるのが「class列」です。

「h1.foo」だったら(0, 1, 1)

「ul li」だったら(0, 0, 2)

この2つは「id列」の数値が同じです。なので「class列」を見ます。

すると、「h1.foo」の方が「class列」の数値が高いので、これが優先されます。

最後に「type列」の数値が大きいセレクターが優先される

「id列」と「class列」の数値が同じだった場合に最後に比べられるのが「type列」の数値です。

「ul li」だったら(0, 0, 2)

「ul li p」だったら(0, 0, 3)

なのでこの2つだったら、「ul li p」が優先されます。

結合子はカウントされない

結合子は詳細度にカウントされないので注意してください。

例えば、「ul > li > .foo」だったら(0, 2, 1)です。

「*」全称セレクターもカウントされない

一見「type列」にカウントしてしまいそうですが、「*」全称セレクターも詳細度にカウントされないので注意してください。

例えば、「*」だったら(0, 0, 0)です。簡単に上書きできます。

「:not()、:has()、:is()」はカウントされない

「:」コロンから始まる疑似クラスは「class列」にカウントされます。

ですが、「:not()、:has()、:is()」自身はカウントされないので注意してください。

「詳細度アルゴリズム」の範囲外

「詳細度アルゴリズム」が通用しない場面もあるので、そちらについても解説しておきます!

それは下記の通りです。

「詳細度アルゴリズム」の範囲外!

  • 「インラインスタイル」
  • 「!important」

「インラインスタイル」

<p style="color: skyblue;">段落です。</p>

他のセレクターよりも「インラインスタイル」が優先されます。

なので、(1, 0, 0, 0)となる感じですかね。

「id列が」の数値がどんなに高くても「インラインスタイル」が勝ちます。

「!important」が最優先

p {
    color: skyblue!important;
}

「!important」が最優先です。

宣言の後ろに「!important」と書くと、その宣言が優先されます。

「!important」は「インラインスタイル」よりも優先されます。

まずは詳細度を低く書く

<h1 id="hoge" class="foo">見出しです。</h1>

基本的にCSSのセレクターの詳細度は低くする意識で書くといいと思います。

「idセレクター」など、詳細度が高いものを無暗に使ってしまうと、上書きするのが難しくなるので、できればまずは「要素型セレクター」を使ったり「クラスセレクター」を使うといいと思います。

「属性セレクター」を使って「idセレクター」の詳細度を下げる

<h1 id="hoge" class="foo">見出しです。</h1>
[id="hoge"] {
    color: skyblue;
}

「属性セレクター」を使うことで「idセレクター」の詳細度を下げることができます。

「属性セレクター」は「class列」でカウントされるので、「idセレクター」を使うよりも詳細度が下がっていますね!

おお!賢いテクニックだね!

複合セレクターを使う「#hoge#hoge」

<h1 id="hoge" class="foo">見出しです。</h1>
#hoge#hoge {
    color: skyblue;
}

.foo.foo {
    color: skyblue;
}

無理やり複合セレクターを使ってあげることで、詳細度を上げることができます。

「.foo.foo.foo」のように何個でもつけることができます。

参考リンク。

仕様書。
https://drafts.csswg.org/selectors/#specificity-rules

MDN。
https://developer.mozilla.org/ja/docs/Web/CSS/Specificity

あわせて読みたい記事。

大学生が夏休みにweb制作で13万円稼ぐまでにやったこと。【経験談】

関連記事

まとめ

CSSの「セレクター」とは「どの要素にスタイルを当てるか?」を指定する箇所のことを指す。

CSSの「詳細度アルゴリズム」とは、異なるセレクターの宣言が競合した場合に「どのセレクターからのスタイルを優先するか?」を決定するアルゴリズムのこと。

基本的に「詳細度」の数値が高い方が優先される。

最初に「id列」の数値が大きいセレクターが最も優先されて

次に「class列」の数値が大きいセレクターが優先されて

最後に「type列」の数値が大きいセレクターが優先される。

結合子はカウントされない。

「*」全称セレクターもカウントされない。

「:not()、:has()、:is()」もカウントされない。

下記のような場面では「詳細度アルゴリズム」は通用しない。

「詳細度アルゴリズム」の範囲外!

  • 「インラインスタイル」
  • 「!important」

基本的には詳細度を低く書くことをおすすめする。

こんな感じですかね!

この記事が気に入った方は僕のTwitter(@chibasyuta)のフォローもお願いします!

また、下の動画でも「詳細度アルゴリズム」について詳しく解説しているので、一緒に実際にコードを書きながら学びたい方はこちらをどうぞ!

それではこんな感じでこの記事を終わります!

ではまた!

自分のロゴ!

皇帝ペンギン

全力で、書きます。
少しでもお役に立てたら幸いです。
楽しんで読んで下さい 。-_- 。
よろしくお願いします!

x(旧twitter) youtube
Categories
  • トップへ
  • ITパスポート (1)
  • programming (168)
    • CSSのアニメーション編 (26)
    • CSSのグリッドレイアウト編 (1)
    • CSSのセレクター編 (58)
    • CSSのフレックスボックス編 (1)
    • CSSのメディアクエリー編 (7)
    • CSSの基本編 (34)
    • HTMLのformタグ編 (1)
    • HTMLの基本編 (3)
    • JavaScriptの入門編 (30)
    • JavaScriptの基本編 (5)
    • Web制作をする環境を整えよう! (1)
  • Uncategorized (23)
  • VScode (1)
  • おすすめ商品! (1)
  • クラロワ (2)
  • マーケティング (17)
  • 大学生活 (7)
  • 心理学 (9)
  • 映画 (1)
  • 法学 (4)
  • 経済学 (4)
  • 読書 (7)
Pages
  • プライバシーポリシー
  • 免責事項
  • プロフィール
Archive
  • 2025年3月 (1)
  • 2025年1月 (9)
  • 2024年12月 (13)
  • 2024年11月 (5)
  • 2024年10月 (10)
  • 2024年9月 (15)
  • 2024年8月 (5)
  • 2024年7月 (6)
  • 2024年6月 (5)
  • 2024年5月 (10)
  • 2024年4月 (24)
  • 2024年3月 (11)
  • 2024年2月 (6)
  • 2024年1月 (10)
  • 2023年12月 (4)
  • 2023年11月 (3)
  • 2023年10月 (2)
  • 2023年9月 (3)
  • 2023年8月 (6)
  • 2023年7月 (3)
  • 2023年6月 (8)
  • 2023年5月 (2)
  • 2023年3月 (1)
  • 2023年2月 (1)
  • 2022年10月 (2)
  • 2022年9月 (2)
  • 2022年8月 (8)
  • 2022年7月 (2)
  • 2022年6月 (6)
  • 2022年5月 (9)
  • 2022年4月 (2)
  • 2022年2月 (4)
  • 2021年12月 (1)
  • 2021年11月 (4)
  • 2021年10月 (8)
  • 2021年9月 (14)
  • 2021年8月 (6)
  • 2021年6月 (1)
  • 2021年5月 (2)
  • 2021年4月 (1)
  • 2021年3月 (1)
  • 2021年2月 (2)
  • 2020年10月 (1)
  • 2020年7月 (1)
  • 2020年4月 (1)
  • 2020年1月 (1)
  • 2019年12月 (2)
© Copyright Syuta Chiba, 2019 All Rights Reserved.