更新日
#15 paddingとmarginの違いとボックスモデルの理解
本講座のゴール
「#08_よく使う10個のプロパティを覚えよう」で学習したpadding
とmargin
ですが、「どんな時にpaddingを使って」逆に「どんな時にmarginを使う」のか、いまいちピンときていませんよね。
この講座では最終的に小テストを用意して「このケースはmarginとpaddingどっち?」というクイズを出します。そのクイズの正答率が7割越えるようになれば良いと思います!
paddingとmarginは余白を調整するために使う
padding
とmargin
が「何を」調整するために使用されるものかというと「余白」になります。ここでいう余白とは要素同士の間隔という意味です。

HTMLは通常上と左へ要素を詰めて配置されます。そのためpadding
やmargin
で余白を確保しないと綺麗に見せることができません。
を調整する.jpg)
「要素」という言葉についておさらい
<開始タグ>〜〜</終了タグ>
のひとまとまりを要素と呼びます。例えば、<h1>大見出し</h1>
←これはh1要素であり、<img src="photo.jpg">
←これはimg要素と呼びます。
ボックスモデルについて
margin
とpadding
をきっちり理解したいなら、「ボックスモデル」という概念の理解を避けることはできません。
しかし、このボックスモデルさえ理解すればmarginとpaddingの違いが嘘みたいに理解できるようになります!
「ボックスモデルの理解 = margin、paddingの違いの理解」と言っても良いくらいです。
こちらの動画を一度見てから以下の解説をみると理解が早いです!
それでは解説していきます。
ボックスモデルとは要素が持つ「領域」のことです。なんだか難しそうに聞こえてしまった人はとりあえず以下の画像をみてください。

これを見てもまだ少し難しいと思います。そこでみなさんが普段見ているWEBサイトの要素がどのようなボックスモデルになっているか見てみましょう。

例を見るとわかるように
- 見出しには上下に線がついていて、
- 見出しと線の間に余白があって
- 見出しと画像の間にも余白があります
これらがボックスモデルで見るとどのような内訳になっているか?というものが右の画像です。
この例からわかることは、
- 見出しと枠線の間に余白を入れるためにはpaddingを使う
- 枠線と画像の間に余白を入れるためにはmarginを使う
ということがわかりますね。
つまりボックスモデルを理解するということは「要素のこの箇所に余白を入れたいけど、paddingとmarginどっちを使ったらいいの?を適切に判断する」ということに繋がります。
前回の講座で解説した家で例えた場合…

前回以下のようにmargin
とpadding
の違いを家でたとえたのを覚えていますか?
自分の敷地を広げて(内側の余白を広げて)距離を取るのがpadding
相手との距離を取る(外側に余白を広げる)のがmargin
という使い分けと説明しました。
そして、このイメージに対してボックスモデルを当てはめると以下のようになります。

こうやってみると、なぜ要素の内側の余白をつける時がpadding
で、要素同士を離す時はmargin
なのかはっきりとわかりますよね。
paddingとmarginをアニメーションで理解しよう
ここまで少し理屈っぽい説明が続いて疲れてしまったと思うので、一度感覚でmargin
とpadding
を理解してみましょう。
ボタンをクリックして動きを確認しよう
これからサンプルをいくつか見せます。ボタンをクリックすると余白がついたり消えたりするので、アニメーションの動きからpadding
とmargin
の違いを確認しましょう。
例01:見出しの余白
見出し

- テキストと枠線の余白はpadding
- 見出しと画像の余白はmargin
が使われていることがわかりますね。
例02:ボックスの余白
- ボックスの内側の余白を広げる時はpadding
- ボックス同士を離すときの余白はmargin
が使われていることがわかりますね。
さて、ここまででボックスモデルとpadding
とmargin
の基本は理解できたと思うので実際にどのように書いていくのか解説していきます。
paddingとmarginの書き方
padding
とmargin
の余白は上下左右の4つがあり「上だけにmarginをつける」「左右にだけpaddingをつける」「上下左右にmargin」をつけるということができます。

paddingの4方向
padding-top
(上の内側余白)padding-right
(右の内側余白)padding-bottom
(下の内側余白)padding-left
(左の内側余白)
marginの4方向
margin-top
(上の外側余白)margin-right
(右の外側余白)margin-bottom
(下の外側余白)margin-left
(左の外側余白)
ということで例をもとにpadding
やmargin
の書き方を見ていきましょう。
例1:見出しの余白をつける
余白適用前

こうしたい

<h1>見出しタイトル</h1>
<img src="cat">
h1{
border-top:solid 2px; /*上線*/
border-bottom:solid 2px; /*下線*/
padding-top:10px; /*上の内側余白*/
padding-bottom:10px; /*下の内側余白*/
margin-bottom:20px /*下の外側余白*/
}
- 見出しのテキストに
border-top
とborder-bottom
で線をつけます。 - 見出しと線の上下(要素の内側)に余白をつけたいので
padding-top:10px
とpadding-bottom:10px
を書きます。 - 見出しと画像を離すために下側に余白である
margin-bottom:20px
を書きます。
例2:ボックスの余白をつける
余白適用前
cat01

cat02

cat03

こうしたい
cat01

cat02

cat03

<div class="card">
<p>cat01</p>
<img src="cat01.png">
</div>
<div class="card">
<p>cat02</p>
<img src="cat02.png">
</div>
<div class="card">
<p>cat03</p>
<img src="cat03.png">
</div>
.card{
background: #fbf4b3;
border: solid 2px #ded57e;
padding-top: 8px;
padding-right: 8px;
padding-bottom: 8px;
padding-left: 8px;
margin-right: 5px;
margin-left: 5px;
}
.card p{
margin-bottom:10px;
}
- テキストと画像を離すための余白を作りたいので
p
にmargin-bottom:10px
と書きます - ボックスの内側に対して余白を作りたいので
.card
のpaddingを上下左右にそれぞれ8pxつけます - ボックスを離すための余白を作りたいので
margin-right:5px
とmargin-left:5px
で左右にそれぞれmarginをとります
padding
とmargin
のつけ方を少しはイメージできたでしょうか?
ショートハンドで指定をまとめる
「例02」で紹介したような余白を上下左右につける際にpadding-top
、padding-right
、padding-left
、padding-bottom
といちいち書いていたら大変ですよね。
そういった指定をまとめて書くためのショートハンド(短縮系の書き方)がpadding
とmargin
にはあります。
全方向同じ指定
padding: 10px;
/*
内訳
padding-top: 10px
padding-right: 10px
padding-left: 10px
padding-bottom: 10px
*/
上 右 下 左
padding: 5px 10px 15px 20px;
/*
内訳
padding-top: 5px
padding-right: 10px
padding-left: 15px
padding-bottom: 20px
*/
上 左右 下
padding: 5px 20px 10px;
/*
内訳
padding-top: 5px
padding-right: 20px
padding-left: 20px
padding-bottom: 10px
*/
上下 左右
padding: 10px 20px;
/*
内訳
padding-top: 10px
padding-right: 20px
padding-left: 20px
padding-bottom: 10px
*/
margin
も同じルールでショートハンドを書くことができます。
paddingはどんな時に使う?2つのケース
『padding』はこんなときに使おう!
❶要素の範囲を広げたい時
❷要素内側に押し込めたい時
❶要素の範囲を広げたい時
見出しを広げる例
適用前
見出しテキスト
こうしたい
見出しテキスト
テーブルのセルを広げる例
適用前
見出し | セル |
---|---|
見出し | セル |
見出し | セル |
こうしたい
見出し | セル |
---|---|
見出し | セル |
見出し | セル |
このように要素の範囲を広げたい時はpaddingを使用します。
❷子要素を内側に押し込めたい時
ボックスの中に余白を入れる例
適用前


適用前


ボックスの中に余白を入れて子要素を押し込めたい時もpaddingを使いましょう。
marginはどんな時に使う?1つのケース
『margin』はこんなときに使おう!
❶別の要素と距離を取りたいとき
❶別の要素との距離を取りたい時
余白適用前
cat01

cat02

cat03

こうしたい
cat01

cat02

cat03

別の要素と距離を取りたいという時は基本marginを使うことを考えましょう。
なぜ要素を離すにはmargin?
なぜ要素同士を離す時にはmarginを使うのか?それにはしっかりとした理由があります。

background-color
(背景色)はボックスモデルの「要素」と「padding」につくborder
はボックスモデルのborder部分(padding領域の外側)につくmargin
はボックスモデルのborderより外側につく(=背景色はつかない)
ブロック要素とインライン要素でmarginとpaddingのつき方が違うのでおさらいしておきましょう。
【小テスト】marginとpaddingどっち?
さて、ここからは先ほどまでで学んだ内容をもとに、「この場合paddingとmarginどちらを使う?」という形式で4問出題したいと思います。
padding
かmargin
どちらになるか予測した上で「👉答えを見る」をクリックしてくださいね。

答えを見る
正解は「margin」を使うです。
<div>
<img src="dog01.jpg">
<img src="dog02.jpg">
<img src="dog03.jpg">
</div>
img{
margin-right: 15px;
margin-left: 15px;
}

答えを見る
正解は❶が「padding」、❷が「margin」です。
<div>
<h1>これは犬です</h1>
<img src="dog.jpg">
</div>
h1{
border-bottom: solid 3px;
padding-bottom: 20px; /*線の内側に余白*/
margin-bottom: 20px; /*下に余白*/
}

背景色がついた箇条書きリストをそれぞれ余白をつけて離す場合なので注意です。
答えを見る
正解は「padding」を使うです。paddingを使った場合、要素についた背景色も同時に広がります。
逆に背景色を伸ばさずに項目のみを離したいなら「margin」を使います。
<ul>
<li>箇条書きリスト</li>
<li>箇条書きリスト</li>
<li>箇条書きリスト</li>
</ul>
li{
background-color: green;
padding: 20px; /*背景色を含めて余白を広げる*/
}

答えを見る
正解は❶が「padding」、❷が「margin」です。
色のついたパネルの内側に余白をつけたいので「❶はpadding」
「DOG」の文字と「好きな食べ物」はそれぞれ別の要素の距離を取りたいので「❷はmargin」
という付け方になります。
<div>
<img src="dog.jpg" alt="犬">
<h3>DOG</h3>
<h4>好きな食べ物</h4>
<ul>
<li>ささみ</li>
<li>チーズ</li>
<li>お芋</li>
</ul>
</div>
div{
padding: 40px; /*パネルの内側に40pxの余白*/
}
h3{
margin-bottom: 40px; /*DOGの下に余白40px*/
}
記事のおさらいと確認をしよう
記事の内容がしっかり頭にはいっているか確認してみましょう。
- Q.paddingとmargin、それぞれ内側と外側どちらに余白がつく?
- paddingは内側、marginは外側
- Q.
border-top
がついている<h1>
にpadding-top
をつけた場合、余白は線の上と下どちらにつく? - 線の下(ボックスモデルでpaddingは線の内側、marginは線の外側につくため)
- Q.
background-color
がついている<h1>
にpadding-top
をつけた場合、背景色はどうなる? - paddingでつけた余白分広がる
- Q.
background-color
がついている<h1>
にpadding-top
をつけた場合、背景色はどうなる? - paddingでつけた余白の分だけ広がる
- Q.
padding
は〇〇したいときと、〇〇したいときに使う - 要素の範囲を広げたい時、子要素を内側に押し込めたい時に使う
- Q.
margin
は〇〇したいときに使う - 別の要素との距離を取りたい時に使う