CSSの継承を制するものがレイアウトを制する|現場で使える実践テクニック

CSSの継承を制するものがレイアウトを制する|現場で使える実践テクニック
C
クリオ
Web制作ディレクター / フロントエンジニア

こんにちは!

今日は「CSSの継承を理解して、予期しないスタイル問題を解決する方法」について解説します。

なぜ継承のトラブルは起きるのか

実はね、僕も新人時代、継承の仕組みをちゃんと理解してなくて、めっちゃ苦労した経験があります。
「親要素に font-size を指定したら、なぜか子要素全部に反映されちゃった」とか、「子要素だけ別のサイズにしたいのに、親の指定が邪魔をしてる」みたいなことがほんま よくありました。

CSSには「継承」という概念があるんですが、これを理解してないと、コードを書いてるたびに「あれ、なんで効かないの?」っていう状況に陥ります。
現場でよく見るのは、初心者が「親要素のスタイルが勝手に子要素に反映されてしまう」という悩みなんです。

継承自体は CSS の仕様の一部で、むしろ便利な機能なんですよ。
ただし、それをちゃんと理解して使い分けないと、後々メンテナンスが大変になっちゃうということなんです。

継承されるプロパティと継承されないプロパティ

まず、大事なポイントとして、CSSの全てのプロパティが継承されるわけじゃない、ということを知っておきましょう。
継承されるプロパティと継承されないプロパティがあるんです。

継承される主なプロパティ:

  • font-sizefont-weightfont-familyなどのフォント関連
  • color(テキストカラー)
  • line-height
  • text-align
  • letter-spacing

継承されない主なプロパティ:

  • marginpadding(外側・内側の余白)
  • border(枠線)
  • widthheight(幅・高さ)
  • background(背景)
  • displayposition(レイアウト系)

ほら、よくあるんですよ。
「親に margin: 20px; を指定すれば、子もマージンが入るんだろ」って思って試したら、全く効かなかった、みたいなケース。
これは margin が継承されないプロパティだからなんです。

逆に font-size を親に指定すると、特に指定しない限り、子要素はその font-size を継承しちゃうんですよ。
これが「あれ、意図してないのに…」っていう状況を生むわけです。

親の指定が子に影響してしまう問題と解決法

では、実際に困る状況と、その解決法をお話しします。

よくある状況:親に color を指定したら、全ての子要素のテキストカラーが変わってしまった

例えば、<header> 要素にこんな感じで書いたとします:

header {
  color: #333;
}

すると、その <header> の中に入ってる <a> タグとか <span> とか、全部の要素がこの色を継承しちゃいます。
「アクセスリンクの色は別色にしたいのに…」みたいな状況になる、わけです。

解決法1:子要素で上書きする

header {
  color: #333;
}

header a {
  color: #0066cc; /* 子要素で上書き */
}

これが一番シンプルな方法ですね。
親で継承されたスタイルを、子要素のセレクターで上書きしちゃう、というやり方です。

解決法2:継承を明示的に無効化する

時には、「この子要素には親の継承を一切受け取らせたくない」という場合もあります。
その時は inherit: initial; を使うといいですよ。

header a {
  color: initial; /* 親の色を無視して、デフォルト値に戻す */
}

ただし initial はブラウザのデフォルト値に戻すので、自分で色を指定する必要があるんです。

実際の現場での困りごと:複数の親要素からの継承が重なる

複雑な構造になると、こんなことが起きます。
<body>font-size: 14px;
<main>font-size: 16px;
<article>font-size: 18px;
…こうなると、どの値が最終的に適用されるのか、わかんなくなっちゃう、わけです。

こういう時は rem 単位を使うといいですよ。
rem は常にルート要素(<html>)の font-size を基準にするので、継承の複雑さを避けられます。

html {
  font-size: 16px; /* ここが基準 */
}

h1 {
  font-size: 2rem; /* 16px * 2 = 32px */
}

p {
  font-size: 1rem; /* 16px */
}

このようにすることで、継承による複雑さを最小限に抑えられます。

まとめ

CSSの継承は、本当は便利な機能なんです。
でも、その仕組みを理解してないと、予期しないスタイルになったり、デバッグが大変になったりしちゃいます。

覚えておきましょう:

  • フォント関連と色は継承される
  • マージン、パディング、サイズは継承されない
  • 継承を上書きしたい時は、子要素でセレクターを指定して上書きする
  • 複数階層の継承が絡む時は rem 単位を活用する

これらを意識して、CSSを書くようにするといいですよ。
最初は戸惑うか