HTML/CSS / LESSON 11 / HT11

HTML/CSS:ボックスモデル

1学習の目的

2基礎解説

すべての要素は四角い箱として扱われます。その箱は内側から中身 → padding → border → margin の4層でできています。

役割覚え方
padding枠の内側の余白中身と枠の距離
border枠線境界そのもの
margin枠の外側の余白他の要素との距離
box-sizing幅の計算方法border-box が便利
✅ 覚えるべき重要ポイント
  1. width: 200px でも実際は200pxにならない。既定では padding と border が外側に足されるため、padding 20px・border 5px なら実際の幅は 200+40+10=250px になる。
  2. box-sizing: border-box を指定すると、指定した幅が「見た目の幅」になる。padding や border は内側に収まるので計算が楽。実務では全要素にこれを指定するのが定番
  3. 値は「上 右 下 左」の時計回りmargin: 10px 20px 30px 40px はこの順。2つなら「上下 左右」、1つならすべて同じ。
  4. margin: 0 auto で横中央に配置できる。ただし幅を指定していないと効かない——幅いっぱいに広がっている要素は、中央に寄せようがないため。
  5. ⚠ 上下のmarginは「相殺」される。上の要素に20px、下に30pxの margin があっても合計50pxにはならず、大きいほうの30pxだけが適用される。

現場使用例:カードの内側の余白、要素同士の間隔、コンテンツの中央配置、ボタンの押しやすさ調整。

/* 4層の構造 */
.box {
  width: 200px;
  padding: 20px;               /* 内側の余白 */
  border: 5px solid #333;      /* 枠線 */
  margin: 10px;                /* 外側の余白 */
}
/* ⚠ 実際の幅 = 200 + 20×2 + 5×2 = 250px */

/* box-sizing で計算方法を変える */
.box {
  box-sizing: border-box;      /* 幅にpaddingとborderを含める */
  width: 200px;                /* 実際も200pxになる */
  padding: 20px;
  border: 5px solid #333;
}

/* 全要素に適用するのが定番 */
* {
  box-sizing: border-box;
}

/* 値の指定方法 */
padding: 20px;                 /* 全方向 */
padding: 10px 20px;            /* 上下 / 左右 */
padding: 10px 20px 30px 40px;  /* 上 右 下 左(時計回り) */

/* 横中央に配置(幅の指定が必須) */
.container {
  width: 800px;
  margin: 0 auto;              /* 上下0、左右auto */
}

/* 枠線と角丸 */
.card {
  border: 1px solid #ddd;
  border-radius: 8px;
}

3基本ドリル(10問)

HT11-D01 div に幅 200px、内側の余白 20px、枠線 2px solid #333 を指定するHTMLを書け。 コーディング★☆☆無料
期待される結果

width・padding・borderが正しい

ヒント

width, padding, border の3つを指定する。

模範解答
<style>
  .box {
    width: 200px;
    padding: 20px;
    border: 2px solid #333;
  }
</style>

<div class="box">箱の中身</div>
解説

border は「太さ 種類 色」をまとめて書くsolid は実線、他に dashed(破線)などがある。

HT11-D02 width: 200px; padding: 20px; border: 5px の要素の実際の幅はいくつか(box-sizing 未指定)。
A. 200px B. 240px C. 250px D. 230px
選択★☆☆無料
期待される結果

解答 == C

ヒント

padding と border は左右両方に付く。

模範解答
C
解説

200 + 20×2 + 5×2 = 250px。既定では padding と border が外側に足される——これがCSS最大の混乱要因。

HT11-D03 box-sizing: border-box を指定し、幅 200px・padding 20px・border 5px でも実際の幅が200pxになる div を作れ。 コーディング★☆☆無料
期待される結果

実際の幅が200px

ヒント

box-sizing: border-box; を追加する。

模範解答
<style>
  .box {
    box-sizing: border-box;
    width: 200px;
    padding: 20px;
    border: 5px solid #333;
  }
</style>

<div class="box">箱</div>
解説

指定した幅が「見た目の幅」になる。padding や border は内側に収まるので、レイアウトの計算が格段に楽になる。

HT11-D04 外側の余白を指定するプロパティを補ってコードを完成させよ。 穴埋め★☆☆無料
コード
<style>
  .box {
    ____: 30px;
  }
</style>

<div class="box">箱</div>
期待される結果

margin が30px

ヒント

「外側の余白」を意味する6文字のプロパティ。

模範解答
margin
解説

margin は他の要素との距離。内側の余白(中身と枠の距離)は padding で、名前も役割も違う。

HT11-D05 padding: 10px 20px は何を意味するか。
A. 上10px、右20px B. 上下10px、左右20px C. すべて10px D. 左10px、右20px
選択★☆☆無料
期待される結果

解答 == B

ヒント

2つの値なら「縦」と「横」。

模範解答
B
解説

2つなら「上下 / 左右」。4つなら「上 右 下 左」の時計回り、1つならすべて同じ値になる。

HT11-D06 padding を上10px・右20px・下30px・左40pxと個別に指定した div を作れ(1行で書くこと)。 コーディング★★☆広告解放
期待される結果

4方向のpaddingが正しい

ヒント

padding: 10px 20px 30px 40px; と時計回りに書く。

模範解答
<style>
  .box {
    padding: 10px 20px 30px 40px;
  }
</style>

<div class="box">箱</div>
解説

上から時計回り(上→右→下→左)。時計の針の動きを思い浮かべると覚えやすい。

HT11-D07 要素を横中央に配置するコードを完成させよ。 穴埋め★★☆広告解放
コード
<style>
  .container {
    width: 300px;
    margin: 0 ____;
  }
</style>

<div class="container">中央</div>
期待される結果

左右のmarginがauto

ヒント

「自動」を意味する4文字のキーワード。

模範解答
auto
解説

左右を auto にすると余白が均等に分配される。ただし幅を指定していないと効かない点に注意。

HT11-D08 上の要素に margin-bottom: 20px、下の要素に margin-top: 30px を指定すると、間隔はいくつになるか。
A. 50px B. 30px C. 20px D. 25px
選択★★☆広告解放
期待される結果

解答 == B

ヒント

上下のmarginは相殺(マージンの重なり)が起きる。

模範解答
B
解説

大きいほうだけが適用される——これを「マージンの相殺」と呼ぶ。合計されると思い込むと、間隔の計算が合わなくなる。

HT11-D09 枠線 1px solid #ddd角丸 8px を持つカードを作れ(padding 16px も指定)。 コーディング★★☆広告解放
期待される結果

border-radiusが8px

ヒント

border-radius で角を丸められる。

模範解答
<style>
  .card {
    border: 1px solid #ddd;
    border-radius: 8px;
    padding: 16px;
  }
</style>

<div class="card">カードの中身</div>
解説

角丸は柔らかい印象を与える。4〜8pxが一般的で、大きくしすぎると子どもっぽくなる。

HT11-D10 全要素box-sizing: border-box を適用するCSSを書け(div も1つ配置)。 コーディング★★☆広告解放
期待される結果

全要素にborder-boxが適用

ヒント

* { … } で全要素を指定できる。

模範解答
<style>
  * {
    box-sizing: border-box;
  }

  .box {
    width: 200px;
    padding: 20px;
  }
</style>

<div class="box">箱</div>
解説

実務ではこれを最初に書くのが定番。すべての要素で幅の計算が直感的になり、レイアウト崩れが激減する。

4実践シナリオ(5問)

HT11-S01 【カードの余白設計】.card に box-sizing: border-box、幅 300px、padding 20px、枠線 1px solid #ddd、角丸 8px、下方向の margin 16px を指定せよ。 コーディング★★☆広告解放
期待される結果

実際の幅が300px、各指定が正しい

ヒント

margin-bottom で下だけに余白を付ける。

模範解答
<style>
  .card {
    box-sizing: border-box;
    width: 300px;
    padding: 20px;
    border: 1px solid #ddd;
    border-radius: 8px;
    margin-bottom: 16px;
  }
</style>

<div class="card">1枚目のカード</div>
<div class="card">2枚目のカード</div>
解説

border-box のおかげで実際の幅も300px。もし指定していなければ 300+40+2=342px になり、横並びにしたときレイアウトが崩れる。

HT11-S02 【コンテンツの中央配置】幅 800px.container横中央に配置し、中に段落を入れよ。 コーディング★★☆広告解放
期待される結果

marginが0 autoで中央配置

ヒント

margin: 0 auto; を使う。幅の指定が必須。

模範解答
<style>
  .container {
    width: 800px;
    margin: 0 auto;
  }
</style>

<div class="container">
  <p>中央に配置されたコンテンツ</p>
</div>
解説

これがWebサイトの標準的な中央配置。画面が広くても、コンテンツは中央の一定幅に収まる。

HT11-S03 【ボタンの余白】.btn に padding 12px 24px(上下12px・左右24px)、背景 #0066cc、文字色白、角丸 4px、枠線なしを指定せよ。 コーディング★★☆広告解放
期待される結果

paddingとborderが正しい

ヒント

border: none; で枠線を消す。

模範解答
<style>
  .btn {
    padding: 12px 24px;
    background-color: #0066cc;
    color: #ffffff;
    border: none;
    border-radius: 4px;
  }
</style>

<button class="btn">送信する</button>
解説

ボタンは左右の padding を大きめに取る。文字の周りに余裕があるほど押しやすく、押せることも伝わりやすい。

HT11-S04 【box-sizing の比較】同じ指定(幅200px・padding 20px・border 5px)で、.a は box-sizing 未指定、.b は border-box とし、実際の幅の違いを確認せよ。 コーディング★★★広告解放
期待される結果

aが250px、bが200px

ヒント

2つの div を作り、片方だけに box-sizing を指定する。

模範解答
<style>
  .a {
    width: 200px;
    padding: 20px;
    border: 5px solid red;
  }

  .b {
    box-sizing: border-box;
    width: 200px;
    padding: 20px;
    border: 5px solid blue;
  }
</style>

<div class="a">未指定(250px)</div>
<div class="b">border-box(200px)</div>
解説

同じ width なのに50pxも違う。この差が横並びレイアウトで「なぜか収まらない」原因になる。

HT11-S05 【セクションの余白設計】.section に上下 60px・左右 20px の padding を指定し、中の .inner を幅 960px で中央配置せよ。 コーディング★★★広告解放
期待される結果

paddingとmargin autoが正しい

ヒント

外側で余白を作り、内側で幅を制限して中央寄せする。

模範解答
<style>
  .section {
    padding: 60px 20px;
  }

  .inner {
    box-sizing: border-box;
    width: 960px;
    margin: 0 auto;
  }
</style>

<section class="section">
  <div class="inner">
    <h2>セクションタイトル</h2>
    <p>内容が入ります。</p>
  </div>
</section>
解説

外側で余白、内側で幅制限——これがWebサイトの基本構造。左右20pxの padding があるので、スマホでも文字が画面端にくっつかない。

5仕上げ課題

HT11-FINAL 【商品カードのレイアウト】ボックスモデルを使い、余白の整った商品カードを作れ。

CSSの指定
*(全要素):box-sizing: border-box
body:背景 #f5f5f5、margin 0、padding 40px 20px
.container:幅 600px横中央配置
.card:背景白、padding 24px、枠線 1px solid #ddd、角丸 8px、下 margin 16px
.card h3:margin 0 0 12px 0(上0・右0・下12px・左0)
.card p:margin 0
.btn:padding 12px 24px、背景 #0066cc、文字白、枠線なし、角丸 4px

HTML の内容
・div.container の中に div.card を2つ
・各カードに h3(商品名)と p(説明)
・container の最後に button.btn「もっと見る」

確認したいこと.card の実際の幅が600px(border-box が効いている)
総合★★★広告解放
期待される結果

すべての余白と幅が正しい

ヒント

box-sizing: border-box を全要素に指定すれば、padding や border を足しても幅が変わらない。h3 の margin を 0 0 12px 0 にするのは、既定の上マージンを消して間隔を制御するため。

模範解答
<style>
  * {
    box-sizing: border-box;
  }

  body {
    background-color: #f5f5f5;
    margin: 0;
    padding: 40px 20px;
  }

  .container {
    width: 600px;
    margin: 0 auto;
  }

  .card {
    background-color: #ffffff;
    padding: 24px;
    border: 1px solid #ddd;
    border-radius: 8px;
    margin-bottom: 16px;
  }

  .card h3 {
    margin: 0 0 12px 0;
  }

  .card p {
    margin: 0;
  }

  .btn {
    padding: 12px 24px;
    background-color: #0066cc;
    color: #ffffff;
    border: none;
    border-radius: 4px;
  }
</style>

<div class="container">
  <div class="card">
    <h3>ノートPC</h3>
    <p>軽量で持ち運びに便利なモデルです。</p>
  </div>

  <div class="card">
    <h3>ワイヤレスマウス</h3>
    <p>静音設計で作業に集中できます。</p>
  </div>

  <button class="btn">もっと見る</button>
</div>
解説

このカードの実際の幅は、指定どおり600pxになっている。padding 24px と border 1px が加わっているにもかかわらず——box-sizing: border-box のおかげだ。もしこれが無ければ 600+48+2=650px になり、container からはみ出していた。

.card h3 { margin: 0 0 12px 0; } にも重要な意図がある。ブラウザは h3 に最初から上下のマージンを付けているので、そのままだとカードの padding と重なって余白が過剰になる。いったん0にリセットし、必要な分だけ自分で指定する——これが余白を正確に制御するコツだ。

body { margin: 0; } も同じ理由による。ブラウザは body に既定で8pxの余白を付けているため、これを消さないとページの端に微妙な隙間が残る。

余白の設計は、地味だが最も効果が大きい。色やフォントを凝らなくても、余白が整っているだけでページは「きちんとして見える」。逆に余白がバラバラだと、どれだけ配色に凝っても素人っぽさが残る。

次章では display を学ぶ。要素が縦に積まれるか横に並ぶか——その挙動を決める仕組みを理解する。