CSSマージンとパディング

CSSの余白には2つのタイプがあります:パディングとマージンです。これらは要素の「内側の余白」と「外側の余白」を制御する重要なプロパティです。

余白プロパティ早見表

プロパティ よく使う値 用途
padding 16px10px 20px10px 5px 15px 20px パディング(上、右、下、左)
padding-top/right/bottom/left 16px5% 片側のパディング
margin 20px0 auto10px 0 20px 0 マージン(上、右、下、左)
margin-top/right/bottom/left 10pxauto 片側のマージン
auto margin: 0 auto ブロック要素を水平方向に中央揃え
💡 マージンの省略ルール: 4つの値(上、右、下、左)→ 3つの値(上、左+右、下)→ 2つの値(上+下、左+右)→ 1つの値(すべての側が等しい)。

パディング

paddingはコンテンツエリアとボーダーの間のスペースで、要素の「内側の余白」です。

サンプル

HTML
<style>
.box {
  padding: 20px;  /* 上下左右すべて20px */
  background: #fff3e0;
  border: 1px solid #ffb74d;
}
</style>
<div class="box">20pxのパディングがコンテンツとボーダーの間にスペースを作成</div>
▶ 試してみよう

個別の側を設定

サンプル

HTML
<style>
.box {
  padding-top: 10px;
  padding-right: 20px;
  padding-bottom: 30px;
  padding-left: 40px;
  background: #fce4ec;
  border: 1px solid #e91e63;
}
</style>
<div class="box">異なるパディング:上10px、右20px、下30px、左40px</div>
▶ 試してみよう

パディングの省略ルール

💡 記憶のコツ: パディング/マージンの省略形は「上」から時計回り——上、右、下、左。覚えられない?「12時の方向から時計回り」と考えましょう。2つの値は「上+下、左+右」を意味します。

CSS
/* 1つの値:すべての側が等しい */
padding: 20px;

/* 2つの値:上+下、左+右 */
padding: 10px 20px;

/* 3つの値:上、左+右、下 */
padding: 10px 20px 30px;

/* 4つの値:上、右、下、左(時計回り) */
padding: 10px 20px 30px 40px;

パディングのよく使うケース

サンプル

HTML
<style>
/* ボタンにパディングを追加してクリックしやすくする */
.button {
  padding: 12px 24px;
  background: #3498db;
  color: white;
  border: none;
  border-radius: 4px;
}

/* カードコンテンツの余白 */
.card {
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  background: #f9f9f9;
}

/* ナビゲーションアイテムのタップエリア */
.nav-item {
  padding: 10px 16px;
  background: #e8eaf6;
  display: inline-block;
}
</style>
<button class="button">ボタン</button>
<div class="card">ボーダーから快適な余白を持つカードコンテンツ</div>
<nav class="nav-item">ナビゲーションアイテム</nav>
▶ 試してみよう

パディングの注意点

📌 インライン要素の注意: <span><a>などのインライン要素のパディングは水平方向にのみ効果があります。インライン要素で完璧なクリックエリアを作りたい場合は、display: inline-blockを設定してください。

マージン

marginは要素のボーダーと他の要素の間のスペースで、要素の「外側の余白」です。

サンプル

HTML
<style>
.box {
  margin: 20px;  /* 上下左右すべて20px */
  background: #e8f5e9;
  border: 1px solid #66bb6a;
  padding: 10px;
}
</style>
<div class="box">20pxのマージンが他の要素から20pxの間隔を維持</div>
▶ 試してみよう

マージンの省略ルール

パディングと同じです:

CSS
margin: 20px;            /* すべての側が等しい */
margin: 10px 20px;       /* 上+下、左+右 */
margin: 10px 20px 30px;  /* 上、左+右、下 */
margin: 10px 20px 30px 40px; /* 上、右、下、左 */

マージンのよく使うケース

サンプル

HTML
<style>
/* コンテナを中央揃え */
.container {
  width: 1200px;
  margin: 0 auto;   /* 水平中央 */
  background: #e3f2fd;
  padding: 10px;
}

/* 要素間の余白 */
.box {
  margin-bottom: 20px;
}

/* 見出しの下のスペース */
h1 {
  margin-bottom: 16px;
}
</style>
<div class="container">子要素を含むコンテナ要素</div>
<div class="box">ボックスモデルのスタイリングを示すボックス要素</div>
<h1>見出し1</h1>
▶ 試してみよう

margin: autoによる中央揃え

margin: 0 autoは、ブロック要素を親要素内で水平方向に中央揃えできます:

サンプル

HTML
<style>
.box {
  width: 400px;      /* 幅を指定する必要がある */
  margin: 0 auto;    /* 水平中央 */
}
</style>
<div class="box">ボックスモデルのスタイリングを示すボックス要素</div>
▶ 試してみよう

マージンの折りたたみ

⚠️ 古典的な罠: 隣接する垂直マージンは大きい方の値に折りたたまれます——これを「マージンの折りたたみ」と呼びます。最も簡単な修正方法は、親要素にoverflow: hiddenまたはpadding: 1pxを追加することです。flexコンテナを使用しても防止できます。

これは重要なCSS概念です——隣接する垂直マージンは1つに折りたたまれ、大きい方の値を採用します。

シナリオ1:隣接する兄弟要素

サンプル

HTML
<style>
.box1 {
  margin-bottom: 30px;
}
.box2 {
  margin-top: 20px;
}
/* 実際の間隔は30px(大きい方の値)、50pxではない */
</style>
<div class="box1">ボックス1</div>
<div class="box2">ボックス2</div>
▶ 試してみよう

シナリオ2:親子要素

親にパディング、ボーダー、コンテンツがない場合、子のマージンが親の外側に「貫通」します:

サンプル

HTML
<style>
.parent {
  background: #eee;
  /* パディングやボーダーなし */
}
.child {
  margin-top: 20px;  /* このマージンで親も「落下」する */
}
</style>
<div class="parent">親コンテナ</div>
<div class="child">子コンテンツ</div>
▶ 試してみよう

回避方法:

シナリオ3:空の要素

コンテンツ、パディング、ボーダーのないブロック要素も、上下のマージンが折りたたまれます。

マージンが折りたたまれないケース

パディングとマージンの選択

シナリオ どちらを使うか
ボタンのテキストが端に触れないようにする パディング
2つのカードを離す マージン
コンテンツをボーダーから離す パディング
コンテナをページの中央に配置 margin: auto
背景エリアのサイズを制御 パディング

簡単な判断方法:背景色がこのエリアをカバーすべきですか? はいならパディング、いいえならマージンを使用します。


❓ よくある質問

Q マージンの折りたたみとは何ですか?
A 隣接する垂直マージンは大きい方の値に折りたたまれます。例えば、1つの要素が`margin-bottom: 30px`、次の要素が`margin-top: 20px`の場合、実際の間隔は30pxで50pxではありません。親に`overflow: hidden`を追加するか、flexレイアウトを使用すると防止できます。
Q パディングで要素が大きくなりすぎ怎么办?
A グローバルに`box-sizing: border-box`を設定してください。これにより、パディングとボーダーが要素の合計幅/高さに含まれ、拡張が防止されます。ほぼすべてのモダンプロジェクトがこれを行っています。
Q margin: 0 autoの中央揃えに必要な条件は何ですか?
A 要素には明示的な幅(autoではない)が必要で、ブロック要素(display: block)でなければなりません。インライン要素と幅が設定されていないブロック要素は、margin: autoで中央揃えできません。

📖 まとめ

📝 演習

  1. 3つのカードを含む「カードグループ」ページを作成し、マージンでカード間の間隔を制御してください。
  2. ナビゲーションバーを作成し、パディングで各ナビアイテムのテキストからボーダーまでの距離を制御してください。
  3. 「マージンの折りたたみ」を実演し、少なくとも2つの異なる方法で解決してください。
  4. margin: 0 autoを使用して、800px幅のコンテナをページの水平方向に中央揃えにしてください。
100%