はじめに
CSSでスタイリングを行う際、「親要素に設定した文字色が子要素にも適用されている」「なぜかmarginが0になっている」といった現象に遭遇することがあります。これらの挙動を理解するためには、CSSの継承と初期値の仕組みを把握することが不可欠です。
本記事では、CSSの継承メカニズムと初期値について、以下の内容を解説します。
- 継承されるプロパティと継承されないプロパティの違い
- CSS初期値の定義と確認方法
inherit・initial・unset・revertキーワードの使い分け- ブラウザデフォルトスタイル(User Agent Stylesheet)の仕組み
- リセットCSSとNormalize.cssの役割と選び方
CSSの継承と初期値を理解することで、効率的なスタイル設計ができるようになり、予期しないスタイルの挙動に悩まされることが減ります。
前提条件
本記事を読み進めるにあたり、以下の知識があることを前提としています。
- HTMLの基本的なタグ構造
- CSSの基本構文(セレクタ・プロパティ・値の関係)
- CSSの詳細度(Specificity)とカスケードの基本概念
動作確認環境
- Google Chrome 131以降
- Firefox 133以降
- Safari 18以降
- Microsoft Edge 131以降
CSSの継承とは
CSSの継承とは、親要素に設定されたプロパティの値が、子要素に自動的に引き継がれる仕組みです。すべてのプロパティが継承されるわけではなく、継承されるプロパティと継承されないプロパティが明確に分かれています。
MDN Web Docsでは、継承を次のように説明しています。
CSSにおいて、継承は要素のプロパティに値が指定されていない場合に何が起こるかを制御します。
継承されるプロパティ(Inherited Properties)
継承されるプロパティとは、親要素で設定した値が、明示的な指定がなくても子孫要素に自動的に伝播するプロパティです。主にテキスト関連のプロパティが該当します。
代表的な継承されるプロパティを以下に示します。
| カテゴリ | プロパティ |
|---|---|
| フォント関連 | font-family, font-size, font-weight, font-style |
| テキスト関連 | color, text-align, text-indent, text-transform |
| 行・文字間隔 | line-height, letter-spacing, word-spacing |
| リスト関連 | list-style, list-style-type, list-style-position |
| その他 | visibility, cursor, direction |
以下の例で、継承の動作を確認してみましょう。
|
|
|
|
この例では、<p>要素にcolor: greenを設定しています。colorプロパティは継承されるため、<em>要素にも緑色が適用されます。<em>要素にはcolorを明示的に指定していませんが、親要素である<p>の値を継承しています。
継承されないプロパティ(Non-inherited Properties)
継承されないプロパティとは、親要素で設定した値が子孫要素に伝播しないプロパティです。主にレイアウトや装飾に関連するプロパティが該当します。
代表的な継承されないプロパティを以下に示します。
| カテゴリ | プロパティ |
|---|---|
| ボックスモデル | margin, padding, border, width, height |
| 背景関連 | background, background-color, background-image |
| 配置関連 | position, top, right, bottom, left, z-index |
| 表示関連 | display, overflow, float, clear |
| Flexbox/Grid | flex, grid, align-items, justify-content |
以下の例で、非継承の動作を確認してみましょう。
|
|
|
|
この例では、<p>要素にborderを設定しています。borderは継承されないプロパティのため、<em>要素には枠線が適用されません。<em>要素のborderは初期値であるnoneとなります。
継承の確認方法
あるプロパティが継承されるかどうかは、MDN Web Docsの各プロパティのリファレンスページで確認できます。「Formal definition(形式的定義)」セクションに「Inherited: yes」または「Inherited: no」と記載されています。
たとえば、colorプロパティのページには「Inherited: yes」と記載されており、継承されるプロパティであることがわかります。一方、borderプロパティのページには「Inherited: no」と記載されています。
CSSの初期値とは
CSS初期値とは、プロパティに値が指定されていない場合にブラウザが使用するデフォルト値です。すべてのCSSプロパティには、CSS仕様で定義された初期値が存在します。
初期値の適用ルール
初期値が適用されるタイミングは、プロパティが継承されるかどうかによって異なります。
継承されるプロパティの場合、以下のルールで値が決定されます。
- 明示的に値が指定されている場合は、その値が適用される
- 値が指定されていない場合は、親要素の計算値(Computed Value)を継承する
- ルート要素(
<html>)で値が指定されていない場合のみ、初期値が適用される
継承されないプロパティの場合、以下のルールで値が決定されます。
- 明示的に値が指定されている場合は、その値が適用される
- 値が指定されていない場合は、初期値が適用される
代表的なプロパティの初期値
主要なプロパティの初期値を以下に示します。
| プロパティ | 初期値 | 継承 |
|---|---|---|
color |
canvastext(ブラウザ依存、通常は黒) |
あり |
font-size |
medium(ブラウザ依存、通常は16px) |
あり |
font-weight |
normal(400相当) |
あり |
display |
inline |
なし |
margin |
0 |
なし |
padding |
0 |
なし |
border |
medium none currentcolor |
なし |
background-color |
transparent |
なし |
position |
static |
なし |
width |
auto |
なし |
初期値はCSS仕様で定義された値であり、ブラウザのデフォルトスタイルシート(User Agent Stylesheet)で設定される値とは異なる点に注意してください。たとえば、<h1>要素のfont-sizeの初期値はmediumですが、ブラウザのデフォルトスタイルシートでは2em程度に設定されています。
継承制御キーワード
CSSには、継承や初期値を明示的に制御するための4つのグローバルキーワードがあります。これらのキーワードは、すべてのCSSプロパティに対して使用できます。
inherit - 親要素の値を強制継承
inheritキーワードは、通常は継承されないプロパティでも、親要素の値を強制的に継承させます。
|
|
|
|
この例では、borderは通常継承されないプロパティですが、inheritを指定することで親要素のborder値を継承しています。結果として、<p>要素にも青い枠線が適用されます。
inheritは、継承されるプロパティに対しても使用できます。この場合、他のスタイルルールで上書きされた値を無効にして、親要素の値を再度継承させることができます。
|
|
initial - 初期値にリセット
initialキーワードは、プロパティをCSS仕様で定義された初期値にリセットします。
|
|
|
|
この例では、<em>要素のcolorをinitialに設定しています。colorの初期値はcanvastext(通常は黒)のため、<em>要素のテキストは黒色で表示されます。
initialを使用する際は、初期値がブラウザのデフォルトスタイルとは異なる場合があることに注意してください。たとえば、displayの初期値はinlineですが、<div>要素のブラウザデフォルトはblockです。<div>要素にdisplay: initialを適用すると、インライン要素として表示されます。
unset - 継承可否に応じて動作を切り替え
unsetキーワードは、プロパティが継承されるかどうかによって動作が変わります。
- 継承されるプロパティの場合:
inheritと同じ動作(親要素の値を継承) - 継承されないプロパティの場合:
initialと同じ動作(初期値にリセット)
|
|
|
|
この例では、colorは継承されるプロパティのため、unsetはinheritと同じ動作をします。.parent pのcolorは親要素の緑色を継承します。
|
|
|
|
この例では、border-colorは継承されないプロパティのため、unsetはinitialと同じ動作をします。結果として、枠線の色は初期値であるcurrentcolor(テキスト色と同じ)になります。
revert - ブラウザデフォルトに戻す
revertキーワードは、プロパティの値をユーザーエージェント(ブラウザ)のデフォルトスタイルに戻します。initialとの違いは、initialがCSS仕様の初期値を適用するのに対し、revertはブラウザのデフォルトスタイルシートで定義された値を適用する点です。
|
|
|
|
この例の違いを整理します。
| キーワード | font-weight | color |
|---|---|---|
revert |
bold(ブラウザデフォルト) |
black(ブラウザデフォルト) |
unset |
normal(継承プロパティのためbodyから継承) |
継承された値 |
revertは、特定のスタイルをブラウザデフォルトに戻したい場合に有効です。all: revertを使用すると、すべてのプロパティをブラウザデフォルトに戻すことができます。
|
|
キーワードの比較表
4つのキーワードの違いを以下の表にまとめます。
| キーワード | 継承されるプロパティ | 継承されないプロパティ |
|---|---|---|
inherit |
親要素の値を継承 | 親要素の値を継承 |
initial |
CSS仕様の初期値 | CSS仕様の初期値 |
unset |
親要素の値を継承(inheritと同じ) | CSS仕様の初期値(initialと同じ) |
revert |
ブラウザデフォルト値 | ブラウザデフォルト値 |
キーワードの動作フロー
以下のフローチャートで、各キーワードがどのように値を決定するかを視覚的に理解できます。
flowchart TD
A[継承制御キーワード] --> B{どのキーワード?}
B -->|inherit| C[親要素の計算値を継承]
B -->|initial| D[CSS仕様の初期値を適用]
B -->|unset| E{継承されるプロパティ?}
E -->|はい| C
E -->|いいえ| D
B -->|revert| F[ブラウザデフォルトを適用]ブラウザデフォルトスタイルとは
ブラウザデフォルトスタイル(User Agent Stylesheet)とは、ブラウザが標準で持っているスタイルシートです。CSSを一切記述しなくても、<h1>が大きく太字で表示されたり、<a>が青色で下線付きになったりするのは、このブラウザデフォルトスタイルが適用されているためです。
ブラウザデフォルトスタイルの例
主要な要素に対するブラウザデフォルトスタイルの例を以下に示します。(Chrome基準)
|
|
ブラウザ間の差異
ブラウザデフォルトスタイルは、ブラウザごとに微妙に異なります。たとえば、<body>要素のマージンはChromeとFirefoxでは8pxですが、古いブラウザでは異なる値が設定されていることがあります。
このブラウザ間の差異が、クロスブラウザ対応における課題となります。この問題を解決するために、リセットCSSやNormalize.cssが使用されます。
デベロッパーツールでの確認方法
ブラウザのデベロッパーツールを使用すると、要素に適用されているブラウザデフォルトスタイルを確認できます。
- 確認したい要素を右クリックし、「検証」または「要素を調査」を選択
- 「Styles」パネルを確認
- 「user agent stylesheet」と表示されているルールがブラウザデフォルトスタイル
この方法で、特定の要素にどのようなデフォルトスタイルが適用されているかを把握できます。
リセットCSSとNormalize.css
ブラウザデフォルトスタイルの差異を解消し、一貫したスタイリングの基盤を作るために、リセットCSSやNormalize.cssが広く使用されています。
リセットCSSとは
リセットCSSは、ブラウザデフォルトスタイルをすべてリセット(初期化)するアプローチです。margin、padding、font-sizeなどを0やnoneに設定し、すべての要素を同じ状態からスタートさせます。
代表的なリセットCSSであるEric Meyer’s Reset CSSの一部を以下に示します。
|
|
リセットCSSのメリットとデメリットは以下のとおりです。
メリット
- すべての要素が同じ状態からスタートするため、予測しやすい
- ブラウザ間の差異を完全に排除できる
デメリット
- 便利なデフォルトスタイル(リストのマーカーなど)もリセットされる
- 必要なスタイルをすべて自分で定義する必要がある
- CSSファイルのサイズが大きくなりやすい
Normalize.cssとは
Normalize.cssは、ブラウザデフォルトスタイルを完全にリセットするのではなく、ブラウザ間の差異を正規化(normalize)するアプローチです。有用なデフォルトスタイルは保持しつつ、バグや不整合を修正します。
|
|
Normalize.cssのメリットとデメリットは以下のとおりです。
メリット
- 有用なデフォルトスタイルが保持される
- 必要最小限の修正のみ行うため、ファイルサイズが小さい
- バグ修正や一貫性の向上に焦点を当てている
デメリット
- 一部のデフォルトスタイルが残るため、完全な統一にはならない
- プロジェクトによっては追加のリセットが必要
現代的なCSS Reset
現代では、従来のリセットCSSとNormalize.cssの良いところを組み合わせた、モダンなCSS Resetが使用されることが増えています。
|
|
選択のポイント
プロジェクトに適したリセット方法を選択する際のポイントを以下に示します。
| 条件 | 推奨されるアプローチ |
|---|---|
| 完全にカスタムなデザインを実装する | リセットCSS |
| ブラウザのデフォルトを活用しつつ一貫性を保ちたい | Normalize.css |
| モダンなベストプラクティスを採用したい | Modern CSS Reset |
| CSSフレームワーク(Tailwind CSS等)を使用する | フレームワーク付属のリセットを使用 |
継承を活用したスタイル設計
CSSの継承を効果的に活用することで、効率的でメンテナンスしやすいスタイル設計が可能になります。
ルート要素でのベーススタイル設定
継承されるプロパティは、ルート要素(<html>または<body>)で設定することで、サイト全体に適用できます。
|
|
この設定により、サイト内のすべての要素がこれらのスタイルを継承します。個別に変更が必要な要素のみ、上書きすればよいのです。
フォーム要素の継承問題
<input>、<button>、<textarea>などのフォーム要素は、ブラウザのデフォルトスタイルによりfont-familyやfont-sizeを継承しない場合があります。これを解決するには、明示的にinheritを指定します。
|
|
font: inheritは、font-family、font-size、font-weightなどのフォント関連プロパティをすべて親要素から継承させます。
継承の活用パターン
以下に、継承を効果的に活用するパターンを示します。
|
|
よくある問題と解決方法
CSSの継承と初期値に関連してよく発生する問題と、その解決方法を紹介します。
問題1: 意図しないスタイルの継承
リンク要素に親要素のcolorが継承されてほしくない場合があります。
|
|
問題2: フォーム要素のスタイルが適用されない
フォーム要素がサイト全体のフォント設定を継承しない問題があります。
|
|
問題3: リセットCSSが強すぎる
リセットCSSによりリストのマーカーが消えてしまう問題があります。
|
|
問題4: 初期値とブラウザデフォルトの混同
initialとrevertの違いを理解していないことによる問題があります。
|
|
まとめ
本記事では、CSSの継承と初期値について詳しく解説しました。重要なポイントを振り返ります。
CSSの継承について理解すべき点は以下のとおりです。
- 継承されるプロパティ(
color、font-familyなど)と継承されないプロパティ(margin、borderなど)がある - 継承されるプロパティは親要素の計算値が子孫要素に伝播する
- 継承されないプロパティは初期値が適用される
CSS初期値について理解すべき点は以下のとおりです。
- 初期値はCSS仕様で定義されたデフォルト値
- ブラウザデフォルトスタイル(User Agent Stylesheet)とは異なる
継承制御キーワードについて理解すべき点は以下のとおりです。
inherit: 親要素の値を強制継承initial: CSS仕様の初期値にリセットunset: 継承可否に応じてinheritまたはinitialとして動作revert: ブラウザデフォルトスタイルに戻す
リセットCSSについて理解すべき点は以下のとおりです。
- リセットCSS: すべてのスタイルを初期化
- Normalize.css: ブラウザ間の差異を正規化
- Modern CSS Reset: 両者の良いところを組み合わせたアプローチ
これらの知識を活用することで、予期しないスタイルの挙動を防ぎ、効率的なCSSの設計ができるようになります。