AI先生のロボットキャラクター
第3章 - セクション4

CSSの継承(Inheritance)を理解しよう

親要素から子要素へスタイルが引き継がれる継承の仕組みと、継承制御キーワード、カスケードとの協調動作を学ぶ

男子生徒のアイコン

先生、カスケードのことはわかったんですが、それ以外にも「継承」っていう仕組みがあるって聞きました。カスケードと継承ってどう違うんですか?

AI先生のアイコン

大事なポイントだね。継承とカスケードは、どちらもCSSでスタイルがどう適用されるかに関わる仕組みだけど、全く違う働きをするんだ。カスケードが「競合するスタイルの優先順位を決める仕組み」なのに対して、継承は「親から子へスタイルが自動的に引き継がれる仕組み」なんだよ。

女子生徒のアイコン

親から子へって、HTMLの要素の階層構造のことですか?

AI先生のアイコン

その通り!例えば、<body>要素にフォントを設定すると、その中の全ての段落や見出しに自動的にそのフォントが適用されるんだ。これが継承の基本的な動きなんだよ。今日は、この2つの違いをしっかり理解して、使い分けできるようになろう。

継承(Inheritance)とは

男子生徒のアイコン

では具体的に継承について教えてください!

AI先生のアイコン

継承は、親要素に指定したスタイルが、子要素や孫要素に自動的に引き継がれる仕組みなんだ。家族で考えるとわかりやすいよ。親の特徴が子どもに受け継がれるように、HTMLの親要素のスタイルも子要素に受け継がれるんだ。

継承(Inheritance)とは、HTMLの階層構造において、親要素に設定されたスタイルが、子要素や孫要素に自動的に適用される仕組みです。

継承の仕組み
親要素のスタイルが子要素に自動的に引き継がれる
親要素 (.parent)
color: blue
font-size: 18px
自動継承
子要素 (<p>)
color: blue
font-size: 18px
CSSで指定していないが継承される
さらに継承
孫要素 (<span>)
color: blue
font-size: 18px
CSS
/* 親要素に設定 */
.parent {
color: blue;
font-size: 18px;
}
HTML
<div class="parent">
親要素のテキスト
<p>
子要素のテキスト
<span>孫要素のテキスト</span>
</p>
</div>
表示結果
親要素のテキスト

子要素のテキスト 孫要素のテキスト

すべての要素が同じ青色・18pxで表示される
継承の仕組み
  • 継承は、親要素に設定したスタイルが子要素に自動的に適用される仕組み
  • すべてのCSSプロパティが継承されるわけではない
  • テキスト関連のプロパティは継承されやすいが、ボックスモデル関連のプロパティは継承されないことが多い
  • 子要素で明示的にスタイルを指定すれば、継承されたスタイルより優先される

継承の基本動作

継承がどのように動作するか、具体例で見てみましょう:

<article>
    <h2>記事のタイトル</h2>
    <p>この段落のテキストは...</p>
    <div>
        <span>このテキストも...</span>
    </div>
</article>

この場合、article要素に設定したfont-familycolorline-heightは、h2pdivspanなど、すべての子孫要素に自動的に適用されます。

実際に色などを変更して動作を確認してみましょう:

CSSコード:
プレビュー:

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

すべてのCSSプロパティが継承されるわけではありません。一般的に、テキスト関連のプロパティは継承され、ボックスモデル関連のプロパティは継承されないという特徴があります。

継承されるプロパティ(主なもの)

  • フォント関連 font-family, font-size, font-weight, font-style, line-height
  • テキスト関連 color, text-align, text-decoration, letter-spacing
  • リスト関連 list-style, list-style-type, list-style-position
  • その他 cursor, visibility

継承されないプロパティ(主なもの)

  • ボックスモデル width, height, margin, padding, border
  • 配置関連 position, top, right, bottom, left, display
  • 背景関連 background, background-color, background-image
  • その他 z-index, overflow, float

継承される例とされない例

実際の記事構造を使って、継承がどう働くか見てみましょう。article要素にだけスタイルを設定し、h2pulには何も指定しないことで、継承の動作を確認します:

<article class="blog-post">
    <h2>ブログ記事のタイトル</h2>
    <p>この段落は親要素のフォント設定を継承します。</p>
    <ul>
        <li>リスト項目1</li>
        <li>リスト項目2</li>
    </ul>
</article>
  • h2pulliに継承されないプロパティを指定して、違いを確認してみましょう。継承されていないことがわかります。
CSSコード:
プレビュー:
女子生徒のアイコン

わかりました!記事全体のフォントを1箇所で設定するだけで、見出しも段落もリストも全部同じフォントになるんですね。

AI先生のアイコン

その通り!これは理にかなっているんだ。もしpaddingmarginまで継承されたら、子要素がどんどん小さくなったり、余白が増え続けたりして大変なことになってしまうからね。

継承を制御するキーワード

女子生徒のアイコン

継承は便利ですけど、逆に継承を止めたい時とか、強制的に継承させたい時もありますよね?

AI先生のアイコン

まさにその通り!CSSには継承を明示的にコントロールするための特別なキーワードが4つ用意されているんだ。これらを使えば、継承の動作を自由に操作できるよ。

継承の動作を明示的に制御するために、CSSには以下の4つの特別なキーワード値が用意されています。

継承制御の4つのキーワード

継承を制御する4つのキーワード
すべてのプロパティで使用できる特殊な値
inherit
継承させる
親要素の値を強制的に継承する。通常は継承されないプロパティでも継承できる。
initial
初期値に戻す
CSS仕様で定められた初期値にリセットする。継承も上書きもすべて無視。
unset
自動判定
継承可能なら inherit、不可能なら initial。プロパティの性質に応じて自動判定。
revert
ブラウザデフォルトに戻す
ブラウザのデフォルトスタイルに戻す。ユーザースタイルシートより前の状態。

4つのキーワードのまとめ

キーワード使用場面よくあるケース
inherit継承されないプロパティを継承させたい子要素にも親と同じborderを適用
initial継承や指定を完全にリセット親の影響を受けない独立した要素
unsetプロパティ性質に応じた自動リセット複数プロパティを一括リセット
revertブラウザデフォルトに戻したいリセットCSSを一部解除
使い分けのポイント
  • inheritは、具体的な意図が明確な場合に使用
  • unsetは、複数のプロパティを一括でリセットしたい場合に便利
  • initialrevertはブラウザのデフォルトスタイルに依存するため、予期せぬ動作を避けるために注意が必要
  • allプロパティと組み合わせて、すべてのスタイルを一括リセットすることも可能。
    例:all: unset;all: initial;

実践例:inheritキーワード

通常、borderプロパティは継承されませんが、inheritを使うことで親のborderを子要素にも適用できます。

HTMLコード
<div class="parent">
    親要素
    <div class="child">通常の子要素</div>
    <div class="child">通常の子要素</div>
    <div class="child inherit">inherit指定の子要素</div>
</div>
CSSコード:
プレビュー:
男子生徒のアイコン

なるほど!inheritを使えば、本来継承されないプロパティも親から受け取れるんですね。

AI先生のアイコン

その通り!特にborderbackgroundなど、デザインの統一感を出したい時に便利だよ。

実践例:initialキーワード

initialは、親の影響を完全に無視してCSS仕様の初期値に戻します。

HTMLコード
<div class="parent">
    親要素
    <div class="child">通常の子要素</div>
    <div class="child">通常の子要素</div>
    <div class="child">通常の子要素</div>
    <div class="child initial">initial指定の子要素</div>
</div>
CSSコード:
プレビュー:
女子生徒のアイコン

initialを使うと、親の設定が全部無視されて真っ黒になるんですね。

AI先生のアイコン

そうなんだ。initialは「CSS仕様書に書かれた初期値」に戻すから、colorなら黒色になる。親の影響を完全に断ち切りたい時に使うよ。

実践例:unsetキーワード

unsetは、プロパティが継承可能ならinherit、不可能ならinitialとして動作します。

親から継承されたスタイルと、子要素に直接指定されたスタイルがある場合、unset直接指定を取り消し、継承に戻すことができます。

HTMLコード
<div class="parent">
    親要素
    <div class="child">通常の子要素</div>
    <div class="child">通常の子要素</div>
    <div class="child unset">unset指定の子要素</div>
</div>
CSSコード:
プレビュー:
男子生徒のアイコン

なるほど!最初の2つは.childで赤色、3つ目は.unset.childの指定を取り消して親の青色に戻るんですね。

AI先生のアイコン

その通り!実務では、共通クラス(.child)で一括指定したけど、特定の要素だけ例外的に親の継承に戻したい時にunsetが便利なんだ。わざわざ個別に色を指定し直さなくても、unset一つで継承に戻せるからね。

unsetの実践的な使い方
  • all: unset CSSフレームワークのスタイルを一括リセット
  • コンポーネント分離 外部スタイルの影響を受けないウィジェット作成
  • 詳細度の問題解決 複雑なセレクタの影響を回避
  • 必要なスタイルだけ再指定 リセット後、本当に必要なプロパティのみ追加

実践例:revertキーワード

revertは、ブラウザのデフォルトスタイルシートに記載された値に戻します。initialが「CSS仕様の初期値」に戻すのに対し、revertは「ブラウザが独自に設定したデフォルト値」に戻す点が異なります。

また、ブラウザのデフォルトスタイルシートに記載がないプロパティは、継承が維持されます。

HTMLコード
<div class="parent">
    親要素
    <h2 class="child">通常の見出し</h2>
    <h2 class="child">通常の見出し</h2>
    <h2 class="child revert">revertの見出し</h2>
</div>
CSSコード:
プレビュー:
男子生徒のアイコン

あれ?revertを指定した見出しが大きくなってますね。親は20pxなのになんでですか?

AI先生のアイコン

これはrevertの重要な特性なんだ。h2のブラウザデフォルトはfont-size: 1.5em;という相対値なんだよ。だからrevertで戻ると、親の20px × 1.5 = 30pxになるんだ。

女子生徒のアイコン

なるほど!revertは「ブラウザデフォルトの値」に戻すけど、その値がem単位だったら計算が必要なんですね。

AI先生のアイコン

その通り!これはrevertの挙動を理解する上でとても重要なポイントなんだ。ブラウザデフォルトが相対値の場合、親要素の影響を完全には無視できないんだよ。

revertと相対値の関係

revertでブラウザデフォルトに戻す際、そのデフォルト値がemなどの相対単位の場合、親要素の値を基準に計算されます。

  1. 親:font-size: 20px;
  2. h2のブラウザデフォルト:font-size: 1.5em;
  3. revertの結果:20px × 1.5 = 30px

これはCSS仕様の正常な動作です。

カスケードと継承が協調する仕組み

女子生徒のアイコン

先生、継承を制御するキーワードまで学んだので、だいぶ理解できました!でも実際のWebサイトでは、継承と前回のレッスンで学んだカスケードをどう使い分ければいいんですか?

AI先生のアイコン

いい質問だね!これまで学んだ継承とカスケード、それぞれには得意分野があるんだ。この使い分けを理解すると、効率的で保守しやすいCSSが書けるようになるよ。実際の開発現場でどう活用されているか見ていこう。

継承とカスケードは、別々の仕組みではありますが、実際のWebサイトでは密接に連携してスタイルを決定します。それぞれの得意分野を理解し、適切に使い分けることで、保守性の高いCSSを書くことができます。

前回の学習が役立ちます

両者の関係性を理解するために、前回学んだ内容を復習しておくと良いでしょう。


「CSSの優先順位とカスケード」を復習する

それぞれの役割と使い分け

継承とカスケードの使い分け
それぞれの得意分野を活かす
継承
共通スタイルの配布
得意分野
サイト全体やセクション全体で統一したいスタイルの設定
適している例
• font-family
• color
• line-height
• text-align
• cursor
メリット
✓ コードの重複が減る
✓ 一括変更が簡単
✓ メンテナンス性が向上
カスケード
個別スタイルの上書き
得意分野
特定の要素に個別のスタイルを適用したり、上書きする
適している例
• 特定要素の色変更
• レイアウト調整
• 状態による変化
• コンポーネント固有
• 例外的なスタイル
メリット
✓ 柔軟なカスタマイズ
✓ 優先順位の明確化
✓ 部分的な上書きが可能
協調動作のイメージ
継承で基礎を作り
(body に font-family, color, line-height)
カスケードで個別調整
(h1 は大きく、.alert は赤色に)
効率的で保守しやすいCSSが完成!
女子生徒のアイコン

なるほど!継承で全体の雰囲気を決めて、カスケードで個別に調整するんですね。

AI先生のアイコン

まさにその通り!実際の開発では、この2つを組み合わせて使うことで、効率的にスタイルを管理できるんだ。次は、具体的な実装例を見てみよう。

実践例:ブログ記事のスタイリング

実際のブログ記事を例に、継承とカスケードの協調動作を見てみましょう:

<body>
  <article class="blog-post">
    <h1>記事タイトル</h1>
    <p>本文の段落です。</p>
    <p class="highlight">重要な段落です。</p>
    <ul>
      <li>リスト項目1</li>
      <li>リスト項目2</li>
    </ul>
  </article>
</body>
CSSコード:
プレビュー:

この例では:

  • 継承の役割 bodyで設定したfont-familycolorline-heightが、すべての子孫要素に自動的に適用される
  • カスケードの役割 特定の要素(h1.highlight)で個別にスタイルを上書きし、独自のデザインを実現
  • 協調動作 基礎は継承で統一し、個別の調整はカスケードで行うことで、効率的で保守しやすいCSSになる

継承とカスケードの協調パターン

実務でよく使われる、継承とカスケードの協調パターンを見てみましょう:

パターン1:テーマの切り替え

/* 基本テーマ(継承で配布) */
.theme-light {
    color: #333;
    background: #fff;
}

.theme-dark {
    color: #e5e7eb;
    background: #1f2937;
}

/* 個別調整(カスケードで上書き) */
.theme-light .button {
    background: #3b82f6;
    color: white;
}

.theme-dark .button {
    background: #60a5fa;
    color: black;
}

パターン2:コンポーネントの基礎と変種

/* 基礎スタイル(継承) */
.card {
    font-family: 'Arial', sans-serif;
    line-height: 1.6;
}

/* 変種(カスケードで調整) */
.card.card-primary {
    color: #1e40af;
    border-color: #3b82f6;
}

.card.card-danger {
    color: #991b1b;
    border-color: #ef4444;
}
男子生徒のアイコン

わかりました!継承で基礎を作って、カスケードで細かく調整する。この組み合わせが大事なんですね。

AI先生のアイコン

その通り!この使い分けができると、CSSのコード量が減り、変更も楽になる。ただし、継承とカスケードが同時に働く時には、注意すべきポイントもあるんだ。次はその競合ケースを見ていこう。

継承とカスケードの協調のポイント
  • 継承の活用 サイト全体やセクション全体で統一したいスタイルは、親要素に設定して継承させる
  • カスケードの活用 特定の要素に個別のスタイルを適用する場合は、詳細度を意識してセレクタを記述
  • 効率的な設計 基礎スタイルは継承で、個別調整はカスケードで行うことで、保守性の高いCSSになる
  • 優先順位の理解 継承された値は詳細度0なので、どんな直接指定でも上書きできることを覚えておく

継承とカスケードの競合

女子生徒のアイコン

先生、協調の仕組みはわかったんですが、もし親から継承された値と、子要素への直接指定が競合したらどうなるんですか?

AI先生のアイコン

重要なポイントだね!実は、継承とカスケードが競合した場合、明確な優先順位のルールがあるんだよ。このルールを理解すると、予期しないスタイルの上書きに悩まされなくなる。具体例で見ていこう。

継承とカスケードが競合するケースでは、両方の仕組みが同時に働きます。次のコードを見てください:

/* 子要素に直接スタイル指定 */
p {
    color: red;
}

/* 親要素にスタイル指定 */
.container {
    color: blue;
}
<div class="container">
    <p>このテキストは何色になる?</p>
</div>
男子生徒のアイコン

えっと…親の.containerblueが設定されているから、継承で青色になる?

女子生徒のアイコン

でも、p要素に直接redが指定されているから、赤色じゃないですか?

AI先生のアイコン

まさにこれが、継承とカスケードの混同ポイントなんだ!実は赤色になるんだよ。なぜなら、継承された値よりも、直接指定された値の方が優先されるからなんだ。 これを理解するには、カスケードの「詳細度」の仕組みを思い出す必要がある。

では、ブラウザは具体的にどのようなプロセスでこの判定を行っているのでしょうか?ステップごとに見ていきましょう。:

継承値 vs 直接指定:どちらが勝つ?
カスケードと継承の協調を理解していないと解決できない
CSS
/* 子要素に直接指定 */
p {
color: red;
}

/* 親要素に指定 */
.container {
color: blue;
}
HTML
<div class="container">
<p>このテキストは?</p>
</div>
ブラウザの判定プロセス
継承とカスケードが協調して最終的な値を決定
01
継承の確認
親の.container { color: blue }が子の<p>に継承される
02
カスケードの判定
<p>には2つのcolor値が候補
① 継承値: blue(親から)
② 直接指定: red(pセレクタから)
03
詳細度で比較(カスケード第3ステップ)
継承値 = 詳細度0(特別扱い)
p = 詳細度1(要素セレクタ)

詳細度の時点で勝負が決まる
実行されない
04
出現順で比較(カスケード第4ステップ)
詳細度で決着がついたため、
出現順の比較には到達しない
(詳細度が同じ場合のみ出現順を見る)
最終結果
color: red
直接指定(p)の詳細度1 > 継承値の詳細度0
重要な原則
継承された値は、詳細度が0(ゼロ)として扱われる。
そのため、要素に直接指定されたスタイル(どんなに詳細度が低くても)は、常に継承された値に勝つ。
女子生徒のアイコン

図を見るとよくわかりますね。継承された値は詳細度0だから、どんな直接指定でも上書きできるんですね。

AI先生のアイコン

その通り!この継承値の詳細度0という原則を覚えておけば、スタイルの優先順位で迷うことがなくなるよ。協調と競合、両方の仕組みを理解できたら、実践的なCSSが書けるようになるんだ。

理解度チェッククイズ

AI先生のアイコン

ここまで学んだ内容を確認するために、クイズに挑戦してみよう!継承とカスケードの違い、そして協調動作を理解できているかチェックしてみてね。

継承とカスケードの理解度チェック

次のコードで、`<p>`要素のテキスト色は何色になりますか?
<style>
  .container {
      color: blue;
  }
  p {
      color: red;
  }
</style>
<div class="container">
  <p>このテキストは?</p>
</div>
赤色(red)
青色(blue)
黒色(デフォルト)
ブラウザによって異なる
次のプロパティの中で、**継承されない**プロパティはどれですか?
color
font-family
line-height
border
`inherit`キーワードの説明として正しいものはどれですか?
CSS仕様の初期値に戻す
ブラウザのデフォルトスタイルに戻す
親要素の値を強制的に継承する
すべての設定をリセットする
次のコードで、`.child`要素の`font-size`は何になりますか?
.parent {
  font-size: 20px;
}

.child {
  font-size: unset;
}
20px(親から継承)
16px(ブラウザデフォルト)
medium(CSS初期値)
0px
継承とカスケードの使い分けとして**最も適切**なものはどれですか?
継承は使わず、すべてカスケードで指定すべき
継承で全体の基礎を作り、カスケードで個別調整する
カスケードは使わず、すべて継承で管理すべき
継承とカスケードは別々に使い、混在させない
次のHTMLとCSSで、`.box`にはボーダーが表示されますか?
<!-- HTML -->
<body>
  <div class="box">
      <p>テキスト</p>
  </div>
</body>

/* CSS */
body {
  border: 2px solid red;
}

.box {
  /* borderの指定なし */
}
表示される(bodyから継承)
表示されない(borderは継承されない)
ブラウザによって異なる
p要素だけに表示される

まとめ

男子生徒のアイコン

継承とカスケード、最初は別々のものかと思っていましたが、実際には協力して働いているんですね。

女子生徒のアイコン

それと継承で全体の雰囲気を作って、カスケードで個別に調整する。この使い分けが大切なんだって理解できました。

AI先生のアイコン

素晴らしい!継承とカスケードは、CSSの中でも特に重要な概念なんだ。この2つの仕組みを理解すると、なぜそのスタイルが適用されるのか、なぜ思った通りにならないのかが見えてくるよ。今日学んだことを整理しておこう。

継承とカスケードの重要ポイント
  • 継承の役割 親要素のスタイルが子孫要素に自動的に伝わる仕組み。サイト全体の統一感を作るのに最適
  • 継承されるプロパティ テキスト関連(color, font-family, line-heightなど)が中心。ボックスモデル関連は継承されない
  • 継承制御キーワード inherit(強制継承)、initial(CSS初期値)、unset(自動判定)、revert(ブラウザデフォルト)で継承を制御
  • カスケードとの協調 継承で基礎スタイルを設定し、カスケードで個別調整することで効率的なCSSを実現
  • 競合時の優先順位 継承された値の詳細度は0。直接指定されたスタイルは常に継承値より優先される
  • 実践的な使い分け 継承=全体の統一、カスケード=個別のカスタマイズという役割分担を意識する

次回は、継承とカスケードの知識を活かして、保守しやすいCSS設計の実践テクニックを学んでいきます。

学習チェック

このレッスンを理解できたら「完了」をクリックしてください。
後で見直したい場合は「未完了に戻す」で進捗をリセットできます。

レッスン完了!🎉

お疲れさまでした!