CSSの継承

CSSのスタイルは、親要素から子要素へ引き継がれます。

本ページでは、CSSの継承について説明しています。

継承とは?

継承とは、CSSのスタイルが親要素から子要素に引き継がれることです。

親要素から子要素への継承

CSSで、以下の記述があったとします。

【divの文字を赤字に定義】
div {
  color: red;
}

また、以下のHTMLがあったとします。

【div要素の子要素としてh1とp要素を利用】
<div>
文章
<h1>タイトル</h1>
<p>本文</p>
</div>

この場合、「文章」の文字だけでなく、「タイトル」や「本文」の文字も赤字で表示されます。

これは、親要素のdivで宣言されたcolor:red;が、子要素のh1要素やp要素でも有効なためです。これが、継承です。継承されることで、いちいち子要素に同じ宣言を記述しなくて済みます。

継承されるプロパティは決まっています。以下は、例です。

【継承されるプロパティ例】
プロパティ 説明
color テキストの色
font フォント全般
line-height 行の高さ
text-align 画像や文字の水平位置
list-style リストマーカー全般

上記でリンクをクリックすると、それぞれの説明ページが開けます。

なお、fontであればfont-family(fontの内、種類だけ設定)などで個別に指定した場合も継承されます。

継承されないプロパティ

継承されないプロパティもあります。以下は、例です。

【継承されないプロパティ例】
プロパティ 説明
background 背景全般
margin 外側の余白
padding 内側の余白
width 横幅
height 高さ
border 枠全般
float 回り込み
display 表示形式
position 表示位置
overflow はみ出た時の表示方法

backgroundであれば、background-color(backgroundの内、背景色だけ設定)など、個別に指定した場合も継承されません。

継承されないプロパティは、高さや幅など通常は親要素と子要素で異なるスタイルにしたいものです。これらが継承されると面倒なので、継承されないようになっています。

inherit

プロパティの値にinheritを使うと、強制的に継承させることもできます。

【inheritで強制的に継承】
div {
  border: solid;
}

p {
  border: inherit;
}

border: solid;は、divの周りに枠線を表示します。このborderは、通常は継承されませんが、inheritが指定されているためpがdivの子要素だった場合、p要素にも枠線が表示されます。

継承のオーバーライド

親要素から継承したスタイルを変えたい場合、子要素に直接スタイルを適用することでオーバーライド(上書き)できます。

【オーバーライド例】
p {
  color: blue;
}

div {
  color: red;
}

HTMLは、以下とします。

【div要素の子要素としてh1とp要素を利用】
<div>
文章
<h1>タイトル</h1>
<p>本文</p>
</div>

div要素も、その子要素であるh1も赤字で表示されますが、p要素は青字で表示されます。つまり、p要素ではdiv要素から継承したcolor: redをオーバーライドして、color: blueが有効になります。

これは、CSSでcolor: blueとcolor:redのどちらが後にあるかは関係なく、継承しているスタイルのcolor:blueより直接スタイルを適用したcolor:redの方が優先されるためです。

親要素からの相対値となるケース

継承した値を完全に打ち消すのではなく、親要素からの相対値になる時があります。以下のCSSがあったとします。

【親要素からの相対値になるCSS例】
div {
  font-size: 90%;
}

p {
  font-size: 90%;
}

HTMLは、以下です。

【親要素からの相対値になるHTML例】
<div>
フォントサイズは90%
<h1>フォントサイズは90%</h1>
<p>フォントサイズは81%</p>
</div>
<p>フォントサイズは90%</p>

赤字部分は、フォントサイズが81%で表示されます。ブラウザのデフォルトのフォントサイズが16pxだった場合、12.96px(= 16px × 0.81)となります。

親要素のdivが90%のため、子のp要素はdivからの相対値なので90%×90%と掛け算となるためです。divの子でないp要素は、90%のままです。また、div要素自体や子のh1要素なども90%です。

これは、emで指定した時も同じです。emも親要素からの相対値で、1.2em(1.2倍)などと指定します。

もし、対象となる要素で直接font-size: 14px;と絶対値で指定した場合は、このように親要素からの相対値にはなりません。

ルート要素からの相対値となるrem

font-size: 0.9rem;と指定すると、divなど親要素の値から影響を受けません。remは、ルート要素(html要素)からの相対値になるためです。

ルート要素には、ブラウザのデフォルトのフォントサイズが反映されています。このため、ブラウザのデフォルトが16pxだった場合、0.9remは14.4pxになります。親要素で0.9remや0.9emなどが指定されていても、関係ありません。

ルート要素からの相対値という点は、留意しておくポイントです。例えば、以下のCSSがあったとします。

【h1にremを利用する例】
h1 {
  font-size: 0.9rem;
}

h1要素は、デフォルトのフォントサイズの2倍(32px)など大きく表示されますが、ルート要素のフォントサイズが16pxだった場合、上記CSSによってh1要素は14.4pxで表示されます。つまり、32pxからの相対値ではないということです。

サイト内で関連ページをチェック

ホームページ作成「CSS/スタイルシートの基本