CSSのmarginとpaddingの違いを徹底比較|余白設定のコツ

CSSのmarginとpaddingの違いを示すボックスモデル図解。外側余白と内側余白の構造を視覚的に説明したイメージ。
CSSのmarginとpaddingの違いを図解した16:9比率のアイキャッチ画像

CSSで余白を調整するときに必ず登場するのが、marginpadding です。
どちらも「余白」を作るプロパティですが、役割や挙動はかなり異なります。ここをあいまいなままにしておくと、レイアウト崩れや意図しない見た目につながりやすくなります。

本記事では、marginpadding の違いをボックスモデルの基礎から整理し、よく使うレイアウトパターンでの使い分けや、つまずきやすいポイントまでまとめて解説します。

1. margin と padding を理解する前に:ボックスモデルの基礎

HTML要素は、CSSの「ボックスモデル」で表現されます。

+---------------------------+
|        margin(外側)      |
|  +---------------------+  |
|  |    border(枠線)    |  |
|  | +-----------------+ |  |
|  | |  padding(内側) | |  |
|  | | +-------------+ | |  |
|  | | |  content    | | |  |
|  | | +-------------+ | |  |
|  | +-----------------+ |  |
|  +---------------------+  |
+---------------------------+
  • content … 文字や画像など中身そのもの
  • padding … content と枠線のあいだの「内側の余白」
  • border … 要素の境界となる枠線
  • margin … 要素の外側にできる「他の要素とのすき間」

ボックスモデルの詳しいサイズ計算や px / rem などの単位は、「CSSでサイズ指定を理解する|px・em・remの違い」で整理しておくと、margin / padding の理解にも役立ちます。

2. margin と padding の定義

2-1. margin(マージン)とは

margin は「要素の外側」に作る余白です。

.box {
  margin: 16px;
}

この場合、.box の周りに 16px のすき間が追加され、隣の要素や親要素との距離が広がります。

ポイント

  • 背景色や枠線の「外側」にできる余白
  • クリック判定・タップ領域には含まれない
  • 隣接するブロック要素どうしで「marginの相殺(margin collapsing)」が起こる

2-2. padding(パディング)とは

padding は「要素の内側」に作る余白です。

.box {
  padding: 16px;
}

この場合、content の周りに 16px の余白ができ、背景色や枠線は padding 部分まで含めて塗りつぶされます。

ポイント

  • 背景色や枠線の「内側」にできる余白
  • クリック判定・タップ領域に含まれる
  • padding を増やすと、通常は要素の見かけのサイズも大きくなる(box-sizing による)

3. margin と padding の違いを徹底比較

3-1. どこに余白ができるか

項目marginpadding
余白の位置要素の外側要素の内側
背景色の適用範囲背景色は適用されない背景色が塗られる
クリック / タップ領域に含まれない領域に含まれる
隣接要素との関係要素どうしの距離を調整する中身と枠の距離を調整する

3-2. 背景色・枠線との関係

.box {
  background: #f0f8ff;
  border: 1px solid #ccc;
  margin: 16px;
  padding: 16px;
}
  • margin … 水色背景の 外側 のすき間。ページ背景が見える
  • padding … 水色背景の 内側 のすき間。文字と枠線の間隔

カードデザインやボタンなど、背景とテキストの余白をきれいに見せたい場合は、基本的に padding を使って調整します。

3-3. クリック・タップ範囲への影響

ボタンやリンクで違いが分かりやすくなります。

.btn {
  display: inline-block;
  background: #007acc;
  color: #fff;
  padding: 8px 16px;   /* クリックできる領域が広がる */
  margin: 16px;        /* ボタン自体の位置が離れるだけ */
}
  • padding … ボタンのクリック範囲を広げる
  • margin … ボタンと他の要素とのすき間を広げる

アクセシビリティや操作性を考える場合、ボタンやリンクの当たり判定を広げるのは padding で行うのが基本です。

3-4. レイアウトへの影響(marginの相殺など)

ブロック要素どうしで上下に margin を指定すると、「margin の相殺(margin collapsing)」が発生します。

h2 {
  margin-bottom: 24px;
}

p {
  margin-top: 16px;
}

この場合、h2p の間の余白は 24px と 16px の 大きい方 24px だけになります。両方が足し算されて 40px にはなりません。

セクション間の余白を margin で管理するときは、この挙動を理解しておくと、意図したスペースが作りやすくなります。ブラウザごとの初期スタイルの違いが気になる場合は、「CSSリセットの基本|ブラウザ差異をなくす方法」で解説されているようなリセットCSSの活用も有効です。

3-5. box-sizing との関係

デフォルトの box-sizingcontent-box です。

.box {
  width: 300px;
  padding: 16px;
  border: 1px solid #ccc;
}

この場合、実際の見かけの幅は

  • 300px(content) + 16px × 2(左右padding) + 1px × 2(左右border)
    = 334px

となります。これが分かりにくい場合は、次のような指定で「枠の外側のサイズ」を一定にすることがよく行われます。

*,
*::before,
*::after {
  box-sizing: border-box;
}

border-box では width に padding / border を含めて計算されるため、レイアウトが組みやすくなります。サイズ指定の考え方は「CSSでサイズ指定を理解する|px・em・remの違い」と合わせて整理しておくと理解しやすくなります。

4. margin と padding の基本的な使い分けルール

4-1. 原則

  • 要素同士の距離を調整したいときmargin
    例:セクションとセクションの間、カード同士の間隔など
  • 要素の中身と枠の距離を調整したいときpadding
    例:見出しの上下の余白、ボタンの内側の余白、カード内のテキストまわりなど

この原則を軸にしておくと、スタイルガイドやBEMなどの設計とも相性が良くなります。

4-2. よくある UI コンポーネントでの使い分け

例1:セクション見出し
.section {
  margin-top: 80px;
}

.section__title {
  padding-bottom: 8px;
  border-bottom: 2px solid #007acc;
}
  • .section … セクション全体の上部余白を margin で調整
  • .section__title … 見出しテキストと下線の距離を padding-bottom で調整
例2:カードレイアウト
.card-list {
  display: flex;
  gap: 24px; /* カード同士の間隔(最近は gap を使う) */
}

.card {
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 4px 8px rgba(0,0,0,.05);
  padding: 16px; /* カードの内側の余白 */
}

カード同士の間隔は margin でも作れますが、Flexbox や Grid を使う場合は gap の方が管理しやすいケースが増えています。レイアウト全体やメディアクエリの使い方は「CSSでメディアクエリを使う方法」と合わせて整理しておくと便利です。

例3:ボタン
.btn {
  display: inline-block;
  padding: 10px 20px;
  border-radius: 4px;
  background: #007acc;
  color: #fff;
}

.btn + .btn {
  margin-left: 8px; /* ボタン同士の間隔のみ margin で調整 */
}

ボタン自身の大きさ・クリック範囲は padding で決め、ボタン同士の距離だけ margin-left で調整すると、スタイルが整理されます。

5. 実務で使いやすい余白パターン

5-1. セクション間の余白設計

ページ全体で余白のリズムを整えるため、セクション間の margin をルール化しておく方法がよく使われます。

.section {
  margin-top: 80px;
}

.section:first-of-type {
  margin-top: 40px;
}
  • ページの上部は少し狭め(40px)
  • 以降のセクションは一定間隔(80px)

といったように、余白サイズを数パターンに絞るとデザインが整いやすくなります。

5-2. テキストブロックの余白

.article p + p {
  margin-top: 1.5em;
}

段落同士の余白は margin-top を使うことが多く、em 単位を使うことで文字サイズに応じて自然な間隔になります。単位の詳しい違いは「CSSでサイズ指定を理解する|px・em・remの違い」で整理されています。

5-3. フォームの余白

.form-item {
  margin-bottom: 24px;
}

.form-item__label {
  display: block;
  margin-bottom: 8px;
}

.form-item__input {
  width: 100%;
  padding: 8px 12px;
}
  • .form-item … 項目同士のすき間 → margin-bottom
  • .form-item__label … ラベルと入力欄の距離 → margin-bottom
  • .form-item__input … 入力欄内の余白 → padding

入力欄内の文字と枠の距離を padding でとることで、可読性が上がります。

6. margin / padding の指定方法

6-1. 基本の指定

.box {
  margin-top: 16px;     /* 上だけ */
  margin-right: 8px;    /* 右だけ */
  margin-bottom: 16px;  /* 下だけ */
  margin-left: 8px;     /* 左だけ */
}

padding も同じ書き方です。

6-2. 一括指定(ショートハンド)

/* 上右下左 */
margin: 10px 20px 30px 40px;

/* 上下 | 左右 */
margin: 10px 20px;

/* 上 | 左右 | 下 */
margin: 10px 20px 30px;

padding もまったく同じルールで指定できます。

6-3. 論理プロパティ(縦書き対応など)

最近は、レイアウトの向きに依存しない「論理プロパティ」も使われています。

.box {
  margin-block: 16px;    /* 上下(縦方向) */
  margin-inline: 8px;    /* 左右(横方向) */

  padding-block: 8px;
  padding-inline: 16px;
}

将来的に多言語対応や縦書きを考慮したい場合は、論理プロパティで統一しておくと保守性が高まります。

7. margin / padding でよくあるつまずきと対処法

7-1. margin が効かないように見えるケース

次のような場合、margin が効いていないように見えることがあります。

  • インライン要素(span など)に上下の margin を指定している
  • Flexbox の子要素で、親に gap も同時指定している
  • 親要素に overflow: hidden;display: flex; などが設定されている

CSS全体が正しく読み込まれていないケースも含め、「CSSが反映されないときの原因と対処法まとめ」で基本的な確認手順を押さえておくと、トラブルシューティングがしやすくなります。

7-2. margin の相殺(margin collapsing)

前述の通り、ブロック要素の上下 margin は重なり合うと相殺されます。セクションの最初の要素が margin-top を持っている場合、親要素の padding-top を使って余白を作ると、相殺を避けられます。

.section {
  padding-top: 40px; /* 子要素の margin-top ではなく、親の padding-top で余白を作る */
}

7-3. padding で幅がはみ出す

box-sizing: content-box のまま padding を増やすと、想定よりも幅や高さが大きくなり、横スクロールの原因になることがあります。この場合は、次のどちらかで対処します。

  • コンテナ幅を calc() などで調整する
  • box-sizing: border-box; を採用する

レイアウト調整の際は、ブラウザの開発者ツールでボックスモデルを確認しながら進めると、原因を特定しやすくなります。

8. 余白設計をルール化するコツ

8-1. 余白のスケールを決める

サイト全体の余白をバラバラに指定すると、統一感がなくなりやすくなります。
たとえば次のように「スケール」を決める方法があります。

  • 4px 単位で増やす: 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64…
  • 8px 単位で増やす: 8 / 16 / 24 / 32 / 48 / 64…

コンポーネントごとに「このパターンから選ぶ」というルールを決めておくと、デザインのブレを防ぎやすくなります。

8-2. 「どちら側に margin を持たせるか」を決める

レイアウト全体の保守性を考えると、次のようなルールを決めておく方法も有効です。

  • セクションの「上余白」はセクション自身の margin-top に統一する
  • リストアイテムは「下余白」に margin-bottom を持たせる
  • 要素内の余白は必ず padding で付ける

このようなルールは、WordPressテーマのテンプレートやSCSS設計とも関連してきます。テーマファイルの編集方針は「WordPressでテーマファイルを編集する方法(初心者向け)」などとあわせて整理しておくと、実装が安定しやすくなります。

9. 関連知識とあわせておきたいポイント

margin / padding の設計は、次のような基本知識と一緒に整理しておくと、よりスムーズに扱えるようになります。

これらの基礎をそろえておくことで、margin と padding を使った余白設計が再現しやすくなり、デザインの再利用もしやすくなります。

まとめ

  • margin は「要素の外側の余白」
    要素同士の距離を調整し、背景色は適用されず、クリック領域にも含まれない。
  • padding は「要素の内側の余白」
    中身と枠の距離を調整し、背景色が塗られ、クリック領域にも含まれる。
  • セクション間の距離など「レイアウトのすき間」は margin、ボタンやカード内テキストのような「中身を読みやすくするための余白」は padding で調整するのが基本。
  • margin の相殺や box-sizing の違いを理解しておくと、予期しないレイアウト崩れを防ぎやすい。
  • サイト全体で余白のスケールやルールを決めると、見た目に統一感が出て保守性も高まる。

margin と padding の役割を明確に分けて使うことで、CSSレイアウトのコントロールが格段にしやすくなります。