カスケーディング

CSSには複数のプロパティ指定が重複した場合、どちらが優先するかを決める厳密なルールがあります。カスケーディングというのですが、これについて簡単に説明します。*1

*1 : 必ずしも正確ではない用語を使っていますが、分かりやすさを優先させているためです。ご了承ください。

カスケーディングの例

CSS
.color { color:red; }
span.color { color: blue; }
HTML
<span class="color">色付き文字</span>

としたとき、クラスcolor には2種類の色が指定されています。どちらの色が優先されて出力されるでしょうか?*2

色付き文字

赤という色指定と青という色指定が2つあって結果的には青が表示されました。これがカスケーディングです。<span class="color">色付き文字</span>という要素に対する指定は2種類ありましたが、要素名が付いているspan.colorの方が優先度が高いのです。

ではCSSを変更するとどうなるでしょう。

.color { color:red; font-weight: bold; }
span.color { color: blue; }

色付き文字

優先度の高いspan.colorで太字を指定してないにも関わらず太字になりました。これは、カスケーディングによる優先度評価が起こるのは競合する(同じ効果の)プロパティを指定したときのみ*3だからです。

*2 : HTMLを構成する都合上、本文のソースでは直接色などを指定しています

*3 : 「効果の」付くのは、例えば「margin」と「margin-left」は異なるプロパティですが重複したものを指定しているため(指定の競合がおこるため)化スケーディングが起こります。

優先度のルール

  1. IDによる指定
  2. クラスによる指定
  3. 親子関係による指定
  4. 同時クラス指定
  5. 順序

IDの指定

IDによる指定はすべてに優先します。

CSS
#color { color:red; } /* IDによる指定 */
span { color: blue; }
span.green { color:green; }
HTML
<span class="green" id="color">色付き文字</span>

色付き文字

クラスによる指定

CSS
span { color: blue; }
span.green { color:green; }
HTML
<span class="green">色付き文字</span>

色付き文字

親子関係による指定

CSS
div.red span { color: red; }
span { color: blue; }
HTML
<div class="red"><span class="green">色付き文字</span></div>

色付き文字

親子関係を指定した方が優先されます。親子関係の階層数は深ければ深いほど優先されます。すでに設定されている設定値を上書きする際に、よくクラス修飾を深くして記述するなどの方法が取られます。

クラス同時指定

CSS
span.red  { color: red; }
span.blue { color: blue; }
span.red.blue { color: magenta; } /* クラス同時指定 */
HTML
<span class="red blue">色付き文字</span>

色付き文字

順序

CSS
span.color { color: red; }
span.color { color: blue; }
span.color2 { color: green; }
HTML
<span class="color">色付き文字</span>
<span class="color color2">色付き文字</span>
<span class="color2 color">色付き文字</span>

色付き文字

色付き文字

色付き文字

同レベルの優先度ならば(CSS中で)後から指定された方が優先されます。