The box-sizing
property is used to tell the browser how to calculate the width and height of an element. By default, this is set to content-box
, which may cause some unexpected behavior for someone new to CSS.
content-box
tells the browser:
- to calculate displayed
height
: useheight
+padding
+border
- to calculate displayed
width
: usewidth
+padding
+border
So, if you set height: 20px
, you're telling the browser that you want the content to have a height of 20px. It does not mean that it will get displayed at 20px. This can cause some issues with layout, especially if you have some fixed dimension containers. You could probably get by with calculating the correct height
and width
for your element manually, but who wants to do that?
Enter: border-box
border-box
is a way to tell the browser that when you set height: 20px
, you want the rendered height to be 20px
.
In this example, both divs contain similar styles.
div {
width: 200px;
height: 200px;
margin: 20px;
padding: 10px;
border: 5px solid #ffe66d;
}
The difference is, the one on the left has box-sizing: content-box;
and the one on the right has box-sizing: border-box
. The CSS markup is telling the divs to have a height of 200px
and a width of 200px
. However, because of the box-sizing
difference, they get rendered differently. The content-box
gets rendered with 230px
(200 + 10 + 10 + 5 + 5), while the border-box
makes the content area smaller to account for a total width and height of 200px
. My suggestion is to use border-box
for a more intuitive behavior and avoid unnecessary cognitive load to account for borders and paddings when using content-box
.