【HTML+CSS初心者講座05】margin と padding で余白を自在にコントロールする方法

余白はウェブページを見やすく、そして美しく見せるためにとても大事なポイントです。今回はCSS初心者にとって最大の難関である余白設定(margin と padding)を、図解とコード例を使いながらイチから解説します。

1. margin と padding とは?

CSSでは要素のまわりの余白を margin(マージン)と padding(パディング)というプロパティで指定します。

プロパティ 位置 背景色は塗られる?
padding 要素の内側の余白 ✅ 塗られる
margin 要素の外側の余白 ❌ 塗られない

1-1. ボックスモデル(余白の構造)

CSSの余白の考え方は「ボックスモデル」と呼ばれます。内側から順に、以下の4層で構成されています。

ボックスモデルのイメージ図
margin(要素の外側の余白)

border(線)

padding(内側の余白)

内容(テキスト・画像など)
← width / height はここの大きさ

1-2. pタグで余白を確認してみよう

<p>これは要素です</p> を例に、余白の変化を見てみましょう。

padding: 0(余白なし)
p {
  background: orange;
  padding: 0;
}

表示結果

これは要素です

padding: 10px(内側に余白)
p {
  background: orange;
  padding: 10px;
}

表示結果

これは要素です

💡 padding 部分にも背景色が塗られます。テキストまわりの余白を取りつつ背景色もきれいに見せたいときは padding を使います。

さらに bordermargin を加えてみましょう。

border を追加
p {
  background: orange;
  padding: 10px;
  border: solid 3px black;
}

表示結果

これは要素です

margin をさらに追加
p {
  background: orange;
  padding: 10px;
  border: solid 3px black;
  margin: 10px;
}

表示結果

これは要素です

1-3. width / height はどこの大きさ?

width と height は要素の「内容」部分の大きさを指定します。padding と border はその外側に加算されます。

⚠️ width: 200px; padding: 10px; と指定した場合、要素の実際の幅は 200 + 10 + 10 = 220px になります。padding が幅に含まれないことに注意しましょう。
これを解決するには box-sizing: border-box; を使います。

2. margin と padding の書き方

margin と padding は書き方も指定できる値もまったく同じです。セットで覚えてしまいましょう。

2-1. 上下左右をまとめて指定

4方向すべてに同じ値を設定したいときは、値を1つだけ書きます。

HTMLコード
<p class="above">前の要素</p>
<p class="middle">要素</p>
<p class="under">後の要素</p>

CSSコード
.middle {
  background: orange;
  padding: 10px;
  margin: 10px;
}
.above { background: skyblue; }
.under { background: silver; }

表示結果

前の要素

要素

後の要素

2-2. 上下左右の一部だけ指定

特定の方向だけ指定したいときはプロパティ名を変えます。

方向 margin padding
上だけ margin-top padding-top
下だけ margin-bottom padding-bottom
左だけ margin-left padding-left
右だけ margin-right padding-right
CSSコード(左padding・上margin)
.middle {
  background: orange;
  padding-left: 20px;
  margin-top: 20px;
}

表示結果

前の要素

要素

後の要素

2-3. 上・右・下・左を一度にまとめて指定(時計回り)

4方向に異なる値を指定するとき、上から時計回り(上・右・下・左)の順に半角スペースで区切って並べます。

margin:

20px
10px
5px
0px



CSSコード(下・左だけ20px)
.middle {
  background: orange;
  /* 上0 右0 下20px 左20px */
  margin:  0 0 20px 20px;
  padding: 0 0 20px 20px;
}

表示結果

前の要素

要素

後の要素

2-4. 上下と左右をまとめて指定(2値指定)

値を2つ書くと「上下」と「左右」をまとめて指定できます。

margin:

10px
0
上・下 = 10px
左・右 = 0

CSSコード(marginは上下・paddingは左右)
.middle {
  background: orange;
  /* 上下20px 左右0 */
  margin: 20px 0;
  /* 上下0 左右20px */
  padding: 0 20px;
}

表示結果

前の要素

要素

後の要素

📌 書き方まとめ
値1つ:上下左右すべて同じ値
値2つ:上下 左右
値4つ:上 右 下 左(時計回り)

3. margin と padding を % で指定する

margin と padding は px だけでなく % で指定することもできます。%指定は主に左右の余白を指定するときに使います(上下の余白に%を使うことはほとんどありません)。

3-1. %指定の計算方法

margin・padding を % で指定したとき、基準になるのは親要素の「横幅(width)」です。

親要素の width が 1000px のとき
padding: 10%
→ 1000px × 10% = 100px
margin: 20%
→ 1000px × 20% = 200px

💡 横の %合計が 100% になるように指定しましょう。margin・padding・width の合計が 100% を超えると、親要素からはみ出てしまいます。

HTMLコード
<div class="parent">
  <p>これは例文です</p>
</div>

CSSコード(左右margin 20% ずつ、width 60%)
.parent {
  background: silver;
  width: 200px;
}
.parent p {
  width: 60%;
  margin: 0 20%; /* 左右20%ずつ */
  padding: 0;
  background: orange;
}

表示結果(親要素200px)

これは例文です

左右に各40px(200px × 20%)の余白

3-2. border を加えるときの注意点

margin・padding・width を % で合計 100% に揃えていても、border の太さは % 指定できないため、border を追加するとその分だけ親要素からはみ出てしまいます。

⚠️ この問題を解決するには box-sizing: border-box; を指定します。これにより border と padding が width の内側に含まれるようになります。

3-3. %指定の使いどころ

margin・padding の % 指定は、レスポンシブデザインを作るときにとても便利です。

指定方法 スマホ(幅320px) PC(幅1200px)
margin: 20px(px固定) 20px(大きすぎる) 20px(小さすぎる)
margin: 2%(%指定) 6.4px(ちょうど良い) 24px(ちょうど良い)

4. margin の相殺

前後に並んだ要素それぞれに margin が設定されているとき、margin の相殺という現象が起こります。これが CSS の余白設定を分かりづらくしている原因のひとつです。

4-1. margin が並ぶと1つしか適用されない

前の要素の margin-bottom と、後ろの要素の margin-top が隣接すると、どちらか大きい方のみが適用されます(合算はされません)。

marginの相殺イメージ
要素1
↓ margin-bottom: 10px
↑ margin-top: 20px
実際の余白 = 20px(大きい方のみ)

要素2

例:前の要素のmargin-bottom 10px と後ろのmargin-top 20px が相殺
.element1 {
  margin-bottom: 10px;
}
.element2 {
  margin-top: 20px;
}
/* → 要素間の実際の余白は 20px(大きい方)になる */

4-2. 親要素との間でも相殺は起こる

親要素の margin-top と、その中の子要素の margin-top が隣接するときも相殺が起こります。前の要素との余白は値の大きいほうが適用されます。

⚠️ 「marginを指定したのに余白が思い通りにならない」と感じたら、相殺が起きている可能性があります。padding を使うと相殺は起こりません。

4-3. padding では相殺は起こらない

前後の要素と並んだとき 親要素と並んだとき
margin ⚠️ 相殺が起こる ⚠️ 相殺が起こる
padding ✅ 相殺しない ✅ 相殺しない

5. 要素を左右中央配置にするテクニック

margin の値に auto を指定すると、余白を自動で均等に配分してくれます。これを活用すれば display: block の要素を簡単に中央配置できます。

5-1. margin: 0 auto で中央配置

margin-left: auto;
+
margin-right: auto;
左右の margin が均等になる → 要素が中央寄せになる

上下の margin は 0 にしたい場合、2値指定を使って margin: 0 auto とシンプルに書けます。

HTMLコード
<div class="parent">
  <p>例文</p>
</div>

CSSコード
.parent {
  background: silver;
  width: 250px;
}
.parent p {
  width: 80px;
  margin: 0 auto; /* 中央配置の呪文 */
  background: orange;
}

表示結果

例文

オレンジの要素が中央に配置された

5-2. 注意事項

方法 結果
margin: 0 auto 左右中央に配置できる
上下の margin に auto ❌ 上下中央にはならない
padding: 0 auto ❌ padding の auto 指定は中央配置にならない
display: inline の要素 ❌ 効かない(text-align: center を使う)

💡 margin: 0 auto で中央配置できるのは display: block の要素だけです。display: inline の要素(a・span など)を中央寄せしたい場合は、親要素に text-align: center を指定しましょう。

📝 まとめ

  • padding = 要素の内側の余白 / 背景色が塗られる
  • margin = 要素の外側の余白 / 背景色は塗られない
  • width / height が指定するのは「内容」部分の大きさ。padding・border は外側に加算される
  • 書き方は値1つ(全方向)・2つ(上下 / 左右)・4つ(上・右・下・左 の時計回り)
  • 上下左右ごとに指定する場合は margin-top など方向付きプロパティを使う
  • %指定の基準は親要素の横幅。横の %合計が 100% になるように調整する
  • border は % 指定できないため、%指定と border を併用するときは box-sizing: border-box を使う
  • 【marginの相殺】隣接する margin は合算されず、大きいほうのみが適用される
  • padding では相殺は起こらない
  • margin: 0 autodisplay: block の要素を左右中央配置できる

次のステップ

次は display プロパティで inline・block・inline-block の違いと使い方を学びましょう。