box-sizing: border-boxとは|幅の計算と全体指定のやり方

box-sizing: border-boxとは|幅の計算と全体指定のやり方 CSS基礎

box-sizing: border-boxとは

width: 300px と書いたのに、画面上では300pxより広い。これは、CSSの初期値である box-sizing: content-box では、widthが「中身の幅」だけを指すためです。padding と border は、その外側に足されます。box-sizing: border-box を指定すると、width に padding と border が含まれ、見たままの大きさで設計できます。

基本(構文・仕組み)

値 width の意味 実際の横幅
content-box(初期値) 中身(content)だけ width + padding + border
border-box content + padding + border width そのまま

ボックスは内側から、content → padding → border → margin の順に重なります。border-box でも margin は含まれません。MDN では、<table> <select> <button> などは、ブラウザ標準で border-box を使うことがあると説明されています。

全要素に指定する、よく使われる書き方です。

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

box-sizing は継承されないため、html だけに書いても子要素には効きません。そのため、全要素セレクタや、html { box-sizing: border-box; } *, *::before, *::after { box-sizing: inherit; } の形が使われます。

サンプルコード(実行結果つき)

<style>
.b { width: 300px; padding: 20px; border: 5px solid #333; }
.cb { box-sizing: content-box; }
.bb { box-sizing: border-box; }
.full { width: 100%; padding: 20px; border: 5px solid #333; }
.full.bb2 { box-sizing: border-box; }
</style>
<div class="b cb">content-box</div>
<div class="b bb">border-box</div>
<div class="full">content-box 100%</div>
<div class="full bb2">border-box 100%</div>

動作確認(検証環境と結果)

  • 環境: Windows 11 / Microsoft Edge 154(Chromium系、headless)/ render.ps1 + getBoundingClientRect()
  • ファイル: C:Tempks2techtestst2box-sizing.html
指定 計算 実測した横幅
content-box / width 300px 300 + 20×2 + 5×2 350px
border-box / width 300px 300 のまま 300px
content-box / width 100% 親の幅 + 50 1216px(親の内側は1166px)
border-box / width 100% 親の幅そのまま 1166px

width: 100% に padding を足すと、親から50pxはみ出すことを実測で確認しました。

box-sizing: border-boxの注意点

  • border-box では、padding と border の合計がwidthを超えると、content の幅は0になり、見た目は崩れます。
  • aspect-ratio や height も box-sizing の影響を受けます。比率指定した要素に padding を付けると、見た目の比率が変わることがあります。
  • position: absolute の要素を、content-box 基準で配置したい場面は例外的にあります。
  • 既存の古いCSSに、全体指定を後から入れると、レイアウトがずれることがあります。

box-sizing: border-boxでよくあるミス

  • width: 50% を2つ並べて、padding を付けたら折り返された。content-box のままだと、合計が100%を超えます。
  • 全体指定を body にだけ書いて、input や button に効かなかった。
  • box-sizing を継承されるものと考え、親だけに書いた。
  • 疑似要素(::before ::after)に指定が漏れた。

ブラウザ対応・バージョン

MDN によると、box-sizing は2015年7月から主要ブラウザで使える Baseline の機能です。IE7以前を相手にする場面は、現在はほとんどないため、ベンダープレフィックスは通常不要です。最新の対応状況は MDN で確認してください。

box-sizing: border-boxのチェックリスト

  • リセットCSSまたは共通CSSの先頭で、全要素に border-box を指定したか。
  • *::before *::after にも適用されているか。
  • width: 100% と padding・border を併用していないか(border-box なら安全)。
  • DevTools のボックスモデル表示で、実寸を確認したか。

box-sizing: border-boxのFAQ(よくある質問)

Q. なぜ初期値は content-box なのですか?
A. CSS1 からの仕様の経緯によるものです。使い勝手の面で、border-box を選ぶ人が多くなっています。

Q. border-box にすると margin も含まれますか?
A. 含まれません。margin は常に外側です。

Q. 全要素に指定すると遅くなりますか?
A. 通常の規模のサイトで、体感できる差が出ることはまれです。気になる場合は、計測してから判断してください。

筆者の見解(box-sizing: border-box)

border-box は、新規に作るCSSでは最初に入れておく設定と考えます。「見たままの数字」で計算できるため、2カラムや余白の調整が楽になります。ただし、既存サイトに途中から導入するときは、全ページを目視で確認する前提で進めるのが安全です。

box-sizing: border-boxの関連項目

出典(一次情報)

タイトルとURLをコピーしました