You will very rarely see the flex-grow
, flex-shrink
, and flex-basis
properties used individually; instead they are combined into the flex
shorthand. The flex
shorthand allows you to set the three values in this order — flex-grow
, flex-shrink
, flex-basis
.
The live sample below allows you to test out the different values of the flex shorthand; remember that the first value is flex-grow
. Giving this a positive value means the item can grow. The second is flex-shrink
— with a positive value the items can shrink, but only if their total values overflow the main axis. The final value is flex-basis
; this is the value the items are using as their base value to grow and shrink from.
<div class="box">
<div class="one">One</div>
<div class="two">Two</div>
<div class="three">Three</div>
</div>
.box > * {
border: 2px solid rgb(96 139 168);
border-radius: 5px;
background-color: rgb(96 139 168 / 0.2);
}
.box {
border: 2px dotted rgb(96 139 168);
display: flex;
}
.one {
flex: 1 1 auto;
}
.two {
flex: 1 1 auto;
}
.three {
flex: 1 1 auto;
}
There are also some predefined shorthand values which cover most of the use cases. You will often see these used in tutorials, and in many cases these are all you will need to use. The predefined values are as follows:
flex: initial
flex: auto
flex: none
flex: <positive-number>
The initial
value is a CSS-wide value that represents the initial value for a property. Setting flex: initial
resets the item to the initial values of for the three longhand properties, which is the same as flex: 0 1 auto
. The initial value of flex-grow
is 0
, so items will not grow larger than their flex-basis
size. The initial value of flex-shrink
is 1
, so items can shrink if they need to rather than overflowing. The initial value of flex-basis
is auto
. Items will either use any size set on the item in the main dimension, or they will get their size from the content size.
Using flex: auto
is the same as using flex: 1 1 auto
; this is similar to flex: initial
, except that the items can grow and fill the container as well as shrink if needed.
Using flex: none
will create fully inflexible flex items. It is as if you wrote flex: 0 0 auto
. The items cannot grow or shrink and will be laid out using flexbox with a flex-basis
of auto
.
The shorthand you often see in tutorials is flex: 1
or flex: 2
and so on. This is the same as writing flex: 1 1 0
or flex: 2 1 0
and so on, respectively. The items can grow and shrink from a flex-basis
of 0
.
Try these shorthand values in the live sample below.
<div class="box">
<div class="one">One</div>
<div class="two">Two</div>
<div class="three">Three</div>
</div>
.box > * {
border: 2px solid rgb(96 139 168);
border-radius: 5px;
background-color: rgb(96 139 168 / 0.2);
}
.box {
border: 2px dotted rgb(96 139 168);
display: flex;
}
.one {
flex: 1;
}
.two {
flex: 1;
}
.three {
flex: 1;
}