CSSのスタイルの優先順位のルールと優先度を上げる方法を解説!
CSSではスタイルの指定が複数あり重複しているときに優先順位を考える必要があります。CSSの優先順位のルールと優先度の上げ方について解説していきます。
CSSのスタイルの優先順位のルール
CSSでスタイルを適用していっても、「あれ?CSSを書いたのに適用されていない?」といった経験はないでしょうか?もちろん書き方の文法的な間違いなどもありますが、正しい文法で書いていても適用されないといった事態は現場でも往々にしてあります。
一番多いパターンとしては「CSSのスタイルの優先順位」の問題です。
例えば以下の例を見てみましょう。
この例ではh1
と.heading
という2つのセレクタでスタイルを重複して定義していますが、前者のスタイルは適用されず無視され、後者のスタイルが適用されます。
このようにCSSでは指定されているスタイルが重複している場合に、どちらを適用させるかの優先順位のルールが存在します。
CSSの優先順位のルール
CSSで複数のスタイルがある場合に、どのスタイルが適用されるかは点数方式で下記の計算式で分かります。
セレクタの指定 | 点数 | 例 |
---|---|---|
タグのstyle属性で指定 | 1,000点 | style="color: blue;" |
IDセレクタ | 100点 | #header |
classセレクタ | 10点 | .header |
属性セレクタ | 10点 | a[href="qumeru.com"] |
疑似要素 | 1点 | :beforeなど |
要素名 | 1点 | liなど |
ユニバーサルセレクタ | 0点 | * |
以上が優先順位のルールになります。あとは今指定しているセレクタを見て、上記の表で何点になるのかを計算しましょう。
またもしも点数が同点の場合ですが、後から読み込まれた方のスタイルが適用される(上書きされる)ルールとなっていますのでご注意下さい。
例
上記の表で例を紹介します。
セレクタの指定 | 計算 | 点数 |
---|---|---|
div style="color: blue;" | 1,000点 | 1,000点 |
#header | 100点 | 100点 |
div.header | 10点+1点 | 11点 |
ul li | 1点+1点 | 2点 |
li:first-child | 1点+1点 | 2点 |
header + *[href="qumeru.com"] | 1点+0点+10点 | 11点 |
ではこのルールにのっとり、スタイルの優先順位を上げるにはどうしたらいいかを見ていきましょう。
CSSのスタイルの優先度を上げる方法
それでは前章で紹介したスタイルの優先順位のルールに則り、今適用したいスタイルの優先度をどうやって優先させるのか、その方法を見ていきます。
CSSでスタイルの優先順位をあげるには基本的には前章の点数をあげていく戦略となりますが、いくつかやり方がありますので、見ていきましょう。
セレクタの指定を詳細にしていく(より詳細度を上げていく)
例えば下記の例で前者のスタイルを適用させたい場合を考えてみましょう。
このままでは上記例では後者のスタイルが適用され文字が青になります。では前者を適用するにはどうしたらいいでしょうか?
点数を計算
まずは点数を計算してみましょう。前者であるli
タグのセレクタは「1点」です。一方で後者の.item
はクラスの指定なので10点となります。
つまり前者のスタイルを適用させるには最低11点が必要です。(同点であれば後者のスタイルが適用させるのでやはり11点必要)
11点以上に持っていく1つの方法は下記の通りです。
前者のセレクタを.list li
としたことで10点+1点で、11点となりこちらのスタイルが適用されます。
このようによりセレクタの詳細度をあげたいったり、疑似要素を指定するなど点数を稼ぎ優先順位を上げていきましょう!
どうしてもスタイルが効かない場合の最終手段「!important」
最後にスタイルが効かない場合の最終手段である!important
を紹介します。この方法をつかえば点数に関係なく強制的に指定したスタイルが適用されます。
ただし!important
を使うと、メンテナンス性が著しく落ちるためおすすめは出来ません。あくまで最終手段として知っておきましょう。
!importantの使い方
例えば下記の例を見てみましょう。
CSSのスタイルが2つあり、明らかに後者の方が点数が高そうに見えます。しかし、前者のcolor red
の指定のあとに!important
と記述することで、点数を無視してこのスタイルが強制的に適用されるようになります。
一件すると便利に見えますが、この!important
を多様すると、CSSが!important
だからけになり、点数計算どころではなく想定外のスタイルが適用されるなど後々に問題が出てきます。利用は最小限に留めましょう。
