CSS(スタイルシート)を編集しているときに、書き足したCSSがなぜか適用されなくて困ってしまう……こんなトラブルは、個人サイト運営あるあるではないでしょうか。
CSSが適用されない理由にはさまざまありますが、そのほとんどがCSSの優先順位が間違っていることが原因で起こります。つまり、CSSの優先順位さえ正しく理解すれば、CSSをサクサク編集できるということです。
この記事では、CSS初心者向けに、CSSの優先順位についてわかりやすく解説します。
CSSの基本ルールをおさらいしよう
まずは、CSSの基本的なルールをおさらいしましょう。
CSSでは、スタイル(デザイン)を適用したいセレクタ(要素)を指定する
CSS(スタイルシート)では、「どのHTML要素にデザイン(CSS記述)を当てるか」を指定する必要があります。そのときに使うのがセレクタと呼ばれるものです。
たとえば、次のようなコードがあるとします。
p {
color: red;
}
この例ではp
がセレクタです。つまり「すべての<p>
タグの文字を赤くする」という指定になります。
セレクタには、HTMLタグそのもの(タグセレクタ)のほかに、クラス名.example
やID名#example
、特定の条件a:hover
などに合わせたものもあります。
セレクタの種類 | 書き方 | 対象 | 例 |
---|---|---|---|
タグセレクタ | タグ名 |
指定したHTMLタグすべて | p {} → すべての段落 |
クラスセレクタ | .クラス名 |
指定したクラスを持つ要素 | .btn {} → class=”btn”の要素 |
IDセレクタ | #ID名 |
指定したIDを持つ要素(1つだけ) | #header {} → id=”header” |
属性セレクタ | [属性名=値] |
特定の属性を持つ要素 | [type="text"] {} |
擬似クラス | :状態 |
特定の状態や条件のときの要素 | a:hover {} → マウスホバー時のリンク |
擬似要素 | ::部分 |
要素の一部(最初の文字など) | p::first-line {} |
子孫セレクタ | A B |
Aの中にあるB | div p {} →divの中のp |
子セレクタ | A > B |
Aの直下にあるB | ul > li {} →ulの直下にあるli |
CSSを書く場所もいろいろある
HTMLテンプレートでは基本的に、style.cssのような名前の外部ファイルにCSSを記述し、それをHTMLファイルに読み込ませる形でスタイルを適用します。
その他にも、CSSを記述、適用する方法はあります。
- HTMLファイル内に、style属性として書き込む(インラインスタイル)
- HTMLファイル内に、
<style>
タグとして書き込む - CSSファイルを読み込む(style.cssなどの外部ファイル。前述した一般的な方法)
CSSの優先順位の基本ルール
優先度が同じ場合は、下に書いたものが優先される
最初に覚えておくべきことは、CSSでは、優先度の同じ指示があった場合には下に書いたものが優先されるということです。例えば、以下のような記述があったとしましょう。
p { color:red; }
p { color:blue; }
この場合は、pという同じセレクタに対して異なる指示が書かれていますが、下段のcolor:blue;
が優先されます。
セレクタの優先度は、ID>クラス、属性、疑似クラス>タグセレクタ
セレクタ指定の優先度は、以下の通り。
- ID指定が最も優先度が高い
- クラス、属性、疑似クラスが次に優先度が高い
- タグセレクタは優先度が低い
つまり、以下のような記述がある場合は……どうなるでしょうか? 考えてみてください。
p { color:red; }
p.abc { color:green; }
p#xyz { color:blue; }
この場合は、以下のような処理になります。
- クラスやIDを持たないp要素は、
color:red;
- abcクラスを持つp要素は、
color:green;
- ID「xyz」を持つp要素は、
color:blue;
- abcクラスと、ID「xyz」の両方を持つp要素は、
color:blue;
インラインスタイルはID指定よりも優先される
セレクタ指定で最強のID指定ですが、インラインスタイルはID指定よりも優先されます。インラインスタイルというのは、HTML記述において、以下のような記述のことです。
<p id="xyz" style="color:pink;">ここの文字色はpinkになります</p>
pタグの中にstyle="color:pink;"
と書かれていて、HTML記述の中で直接スタイルが指定されていますね。この場合、IDセレクタにcolorが指定されていても無視されて、インラインスタイルが優先されます。
!importantをつけると全てに優先される
インラインスタイルよりもさらに優先されるのが、!important
を使用した場合です。例えば、以下のような記述がある場合を考えます。
p#xyz { color:blue !important; }
<p id="xyz" style="color:pink;">ここの文字色はpinkになります</p>
p要素に対して、ID指定とインラインスタイルが指示されています。これだけなら、インラインスタイルであるcolor:pink;
が優先されますが、CSSで!important
が記述されているため、実際にはp#xyz
に対して指示されたcolor:blue;
が適用されます。
この場合はどっちが優先される?
では、以下のような場合は、どちらの記述が優先されるでしょうか? 考えてみましょう。
.box
とdiv.box
p
とheader p
div.box
とdiv.box.red
div.box.red
とdiv.box#blue
ちなみに、正解は以下の通りです。
.box
よりもdiv.box
が優先される(ただのboxクラスより、boxクラスのついたdiv要素という指定の方が詳細だから)p
よりもheader p
が優先される(ただのpよりも、header要素の中のpという指定の方が詳細だから)div.box
よりもdiv.box.red
が優先される(複数のクラスを持つdiv要素まで絞られるから)div.box.red
よりもdiv.box#blue
が優先される(クラスセレクタよりもIDセレクタのほうが優先されるから)
どうしてもCSSの書き方が分からない場合は……
ここまででCSSの優先順位を見て勉強してきたけど、どうしても作業中のCSSが適用されなくて困ってる! そんなときにはデベロッパーツールを使ってみましょう。
なんだか難しそうに見えるかもしれませんが、デベロッパーツールを使いこなせるようになれば、「ここのデザインを変えたいけど、どうCSSを編集したらいいのか分からない……」という場面はほぼなくなります! CSS編集を頑張りたい方には必要不可欠のツールです。ぜひ触ってみてください。
※コメントは最大500文字、5回まで送信できます