HomeGuideLabGlossary

box-sizing in Flexbox

You size the flex item content box by default

box-sizing lets you specify if sizing properties should be sizing the content box or the border box area of a box.

11box-sizing: content-boxbox-sizing: border-boxinline-size: 100pxinline-size: 100pxpadding: 20pxpadding: 20px

When sizing boxes, we often consider the border and padding to optically belong to the box. When we say that a box is 100 pixels wide, we usually mean that the border and padding are included in that measurement.

The box is 100 pixels wideThisNot this11

Because the initial value of box-sizing is content-box, all sizing properties will be sizing the content box, and the border padding will be added on top of that.

So if you have a row flex container in a horizontal writing mode, then flex-basis, inline-size and width will all be sizing the width of the flex item content box.

For example, you give a flex item a flex-basis: 100px and padding: 20px. You’ll get a content box sized at 100 pixels, and a padding box sized at 140 pixels.

1flex-basis: 100pxpadding: 20pxbox-sizing: content-box

Sizing the border box might feel more intuitive

If you set box-sizing: border-box on a box, then you’ll get a content box sized at 60 pixels, and a padding box sized at 100 pixels. That’s more in line with our expectation of a box that’s “100 pixels wide”.

1flex-basis: 100pxpadding: 20pxbox-sizing: border-box

The content box can’t have a negative size, which might mess up flex item proportions

The content box can never have a negative size. So if you set box-sizing: border-box, set flex-basis: 0, and add some padding, then you’ll end up with a border box that is not 0 pixels.

This is why flex items don’t end up with sizes proportional to their flex-grow ratios when they have padding and border. It’s because padding and border are fixed, and they take away from the remaining space on a flex line. So the space available for growing is smaller than the full length of the flex line.

1flex-basis: 0padding: 20pxbox-sizing: border-boxWe specifiedBut the flex base size takes padding into account