HTML、CSSでコーディングしていると、要素からはみ出してしまう現象に出会うと思います。
今回は「要素からpadding部分がはみ出てしまう」「線がはみ出てしまう」といった問題をbox-sizingで解決する方法を紹介します。
「要素の幅(width)と高さ(height)の中にpaddingとborderを含めるかどうか」という設定ができます。
box-sizingでは以下の3つの値を指定できます。
paddingとborderを幅(width)と高さ(height)に含めない
box-sizing: content-box
は初期値です。何も指定をしていないときは、この値を取っています。
要素が作り出す幅は、width + padding + borderの太さ + marginになります。pxでwidthやpaddingを指定する分にはこれでも別に良いのですが、問題はレスポンシブデザインのために%で指定するときです。
marginを左右で30%に、paddingを左右で30%に、widthを40%に、などとして要素の作る幅を計100%にすれば、親要素にピッタリとはまっていい感じになるわけですね。しかし計100%にするためには、一部の値だけをpx指定にするわけにはいきません。paddingだけ10pxにしたら計100%にできなくなってしまいます。
box-sizing: content-box
の状態で%指定したときに、問題になるのはborderの太さを指定しているときです。borderの太さは%指定ができません。
paddingとborderを幅(width)と高さ(height)に含める
width: 50px
と決まっているなら、paddingとborderもその50pxの中に含まれるようになります。
そのため、線(border)とpaddingをどれだけ大きくしても、要素の大きさ(widthとheight)は変わりません。
border-boxは幅や余白を%で指定したいときに便利です。%指定はレスポンシブデザインデザインを作るうえでは欠かせません。
その理由は「親要素にピッタリはまりやすくなるから」です。言い換えると横の%合計を100%にしやすくなるのです。
レスポンシブデザインのウェブサイトを作るのであれば、全ての要素をあらかじめbox-sizing: border-box
にしておくと楽でしょう。
具体的にはCSSに以下のように書いておきます。セレクタに*(アスタリスク)を使うと「全ての要素に対して適用させる」という意味になります。
合わせて疑似要素に対しても合わせて指定しておくのが良いでしょう。
*, *:before, *:after {
-webkit-box-sizing: border-box;
box-sizing: border-box
}