【入門】CSSの反映優先順位
CSSの上書きのルール
CSSで装飾をしていると、なぜが反映されないことってありますよね?!それって、CSSには上書きのルールがあるからなんです。
最初に指定した設定は、後から指定した設定、もしくは、より詳細なセレクターのプロパティーの値を継承するという事です。
このような一連の動作を「カスケード(cascade)」といい、滝のように段階的に読み取っていくというような意味になります。
1ページで終わるようなwebサイトだったり、簡単なものも場合は、然程気にすることはないのですが、何ページにもなる物などの場合だと、色々と問題になってくるので、理解しておいたほうが良いです。
一番影響力の弱いCSSは、デフォルト値のプロパティーになり、その次が製作者が決めた値で、もっとも強いのが、「!important」です。ただ、「!important」は極力使わないことをお勧めします。言ってみれば裏技のようなもので、CSSのルールを無視しつけることになるので、もし、制作に当たって上手く反映されてないと思ったら、何が反映されているか確認をして直しましょう。慣れるまでは大変ですが、結果的にCSSを書く上で軽いファイルを作れたり、使い回しが効いたり、修正しやすいサイト作成に繋がっていきます。
セレクターの種類
セレクターにはどんな種類があるか見ていきましょう!
全ての要素に反映させるセレクターを「ユニバーサルセレクター(全域セレクター)」と言い、「*」の記号で表します。次に「タイプセレクター」で、要素そのものに装飾していきます。例えば、h1,h2,pなどです。
そして、「idセレクター」と「classセレクター」があり、それぞれ表し方を「#idにつけた名前」、「.classにつけた名前」でCSSファイルに書きます。
次に挙げる4つは少しややこしいですが、なるべくわかりやすく説明できるように頑張ります。
1つ目が「子セレクター」で、親要素の直下の子要素に対して装飾します。書き方が「li>a{~}」
2つ目が子セレクターに似ている「子孫セレクター」で、親要素から下にある要素に対してです。書き方を「li a{~}」で表します。
例を挙げてみてみましょう!!
HTML
1
2
3
4
5
6
|
<ul>
<li><span><a>ここに文章が入ります。</a></span></li>
<li><a>ここに文章が入ります。</a></li>
<li><a>ここに文章が入ります。</a></li>
<li><a>ここに文章が入ります。</a></li>
</ul>
|
---|
CSS
1
2
3
4
5
6
7
|
li>a{
color: #ff0000;
}
li a{
color: #ff0000;
}
|
---|
上記の様に書いた場合、一見同じように見えますが、結果はどのようになるのでしょう!?
result(li>a)
「子セレクター」の表記の場合は、HTMLの二行目の「span」が入っている「li」以外が全て赤い文字になります。
result(li a)
「子孫セレクター」の表記の場合は、HTMLの二行目の「span」が入っている「li」も含めて全てが赤い文字になります。
この様に「>」が付くか付かないかで意味が変わります。
次に3つ目と4つ目のセレクターの種類を見ていきましょう。
HTML
1
2
3
4
5
6
7
8
9
|
<h1>メインの見出し</h1>
<p>ここは文章を入れます。ここは文章を入れます。</p>
<p>ここは文章を入れます。ここは文章を入れます。</p>
<div>
<p>ここは文章を入れます。ここは文章を入れます。</p>
</div>
<p>ここは文章を入れます。ここは文章を入れます。</p>
<h2>サブの見出し</h2>
<p>ここは文章を入れます。ここは文章を入れます。</p>
|
---|
3つ目が「隣接兄弟セレクター(adjacent sibling selector)」で、同じ並びの要素の次に出てきた要素に装飾します。「h1+p」のように表します。
result(h1+p)
メインの見出し
ここに文章を書きます
ここに文章を書きます
ここに文章を書きます
ここに文章を書きます
サブ見出し
ここに文章を書きます
「一般兄弟セレクター(general sibling selector)」で同じ並びの要素で次に出てきた要素全てを装飾します。「h1~p」のように表します。
result(h1~p)
メインの見出し
ここに文章を書きます
ここに文章を書きます
ここに文章を書きます
ここに文章を書きます
サブ見出し
ここに文章を書きます
上記で見てみると、「隣接兄弟セレクター」は、「h1」の次にある「p」要素のみに適用されます。そして、「一般兄弟セレクター」は、「h1」以降にある「p」要素全てにかかります。「h2」の後にある「p」要素にもかかります。ただ、「<div>」タグの下の階層にある「p」には反映されていません。3個目と4個目はh1と同じ階層にあるpタグに反映するという意味なので階層の違うpタグには反映されないのです。
詳細度と優先順位
優先順位をしっかりとやっていても、反映しない時があったりしたという経験あると思います。そういったときに詳細度が関わって来たりしてる事があります。詳細度とは名前の通り、自分がCSSで装飾したい要素を指定するときにどれだけ詳しくセレクターを書くかです。大げさに言えば、
CSS
1
2
3
4
5
6
7
|
body ul li a{
color: #ff0000;
}
li a{
color: #ffEE00;
}
|
---|
上記のように書いたとして、
全てをまとめると、デフォルト値 < タイプセレクター(子、子孫セレクター)< class属性 < id属性 < インラインの順番になります。
注意として、詳細度を上げてどれもこれも書いていくと、ページ数が少なかったりすれば問題なかったりしますが、ページ数が増えていくと予期しないところで反映しなかったりし、あとで探したりするのが面倒になるので、なるべく詳細度は高くせずかけることを心がけてやっていくことをお勧めします。