ボックスモデルしたい(box-sizing)

/* どちらも width: 300px */
.content-box {
    box-sizing: content-box;  /* 初期値 */
    width: 300px;
    padding: 20px;
    border: 5px solid;
    /* 見た目の幅は 300 + 20*2 + 5*2 = 350px */
}

.border-box {
    box-sizing: border-box;
    width: 300px;
    padding: 20px;
    border: 5px solid;
    /* 見た目の幅は 300px */
}

box-sizingプロパティで、widthやheightで指定した数値の基準を変更できます。 初期値はcontent-boxで、いちばん内側のcontent(内容)の幅が基準となっています。

見た目の幅を基準にしたい(border-box)

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

box-sizing: border-boxで、widthとheightの基準をcontent + padding + borderに変更できます。 paddingとborderが基準の内側に含まれるため、指定した数値がそのまま見た目の幅になります。

box-sizingは継承されないプロパティなので、*(すべての要素を選ぶセレクター)と擬似要素にまとめて指定します。 新しくCSSを書き始めるときは、まずこれを書いておくと余白まわりの計算で悩まなくなります。

Tip

border-boxのほうが「指定した数値=見た目の幅」で計算しやすいため、 多くのCSSフレームワークやリセットCSSは、この指定を最初に入れています。

すべてのHTML要素は「長方形の箱」として配置されます。 これは、CSSレイアウトの大前提です。 この箱は、内側から「内容(content)」「内側の余白(padding)」「枠線(border)」「外側の余白(margin)」の4つの層でできています。 要素の大きさや余白は、それぞれの層をどれだけ広げるかで決まります。

+-----------------------------------+
|             margin                |  外側の余白(他の要素との間隔)
|  +-----------------------------+  |
|  |          border            |  |  枠線
|  |  +-----------------------+  |  |
|  |  |       padding         |  |  |  内側の余白(枠線と内容の間隔)
|  |  |  +-----------------+  |  |  |
|  |  |  |    content      |  |  |  |  内容(文字や画像)
|  |  |  +-----------------+  |  |  |
|  |  +-----------------------+  |  |
|  +-----------------------------+  |
+-----------------------------------+

デフォルトのcontent-boxはcontentの幅を基準とするため、paddingやborderを広げると、見た目の幅が大きくなります。

リファレンス