Reputation: 5540
As we all know, the flex
property is a shorthand for the flex-grow
, flex-shrink
, and the flex-basis
properties. Its default value is 0 1 auto
, which means
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
but I've noticed, in many places flex: 1
is used. Is it shorthand for 1 1 auto
or 1 0 auto
? I can't understand what it means and I get nothing when I google.
Upvotes: 288
Views: 405688
Reputation: 41
If you use flex:1 inside flex container then all flex items will occupy same space.
If you use flex:1 inside specific flex item then that flex item will occupy remaining space.
Upvotes: 3
Reputation: 2522
The flex
property is a shorthand for flex-grow
, flex-shrink
, and flex-basis
.
But if the flex property has only a single value, then it only sets the "flex-grow" and other properties are omitted so they get a default value. (Not initial value)
For flex: 1;
flex-grow -> User defined = 1 (above value)
flex-shrink -> Defaults to 1 when omitted. (initial is 0)
flex-basis -> Defaults to 0 when omitted. (initial is auto)
Upvotes: 1
Reputation: 41
If you use flex :1 to each element which are items of flex parent then all items will have same width.
Upvotes: 0
Reputation: 34297
In some browsers:
flex:1;
does not equal flex:1 1 0;
flex:1;
= flex:1 1 0n;
(where n is a length unit).
The key point here is that flex-basis requires a length unit.
In Chrome for example flex:1
and flex:1 1 0
produce different results. In most circumstances it may appear that flex:1 1 0;
is working but let's examine what really happens:
Flex basis is ignored and only flex-grow and flex-shrink are applied.
flex:1 1 0;
= flex:1 1;
= flex:1;
This may at first glance appear ok however if the applied unit of the container is nested; expect the unexpected!
Try this example in CHROME
.Wrap{
padding:10px;
background: #333;
}
.Flex110x, .Flex1, .Flex110, .Wrap {
display: -webkit-flex;
display: flex;
-webkit-flex-direction: column;
flex-direction: column;
}
.Flex110 {
-webkit-flex: 1 1 0;
flex: 1 1 0;
}
.Flex1 {
-webkit-flex: 1;
flex: 1;
}
.Flex110x{
-webkit-flex: 1 1 0%;
flex: 1 1 0%;
}
FLEX 1 1 0
<div class="Wrap">
<div class="Flex110">
<input type="submit" name="test1" value="TEST 1">
</div>
</div>
FLEX 1
<div class="Wrap">
<div class="Flex1">
<input type="submit" name="test2" value="TEST 2">
</div>
</div>
FLEX 1 1 0%
<div class="Wrap">
<div class="Flex110x">
<input type="submit" name="test3" value="TEST 3">
</div>
</div>
The latest versions of all major browsers appear to implement flex: 1
and conform to W3C standard. This was verified on Chrome, Opera, Edge, Firefox, Safari, Chromium and a few Chromium variants like Brave on macOS, Windows, Linux, iOS, and Android. When attempting to test in Internet Explorer the Edge browser was force-loaded on Windows 10.
If you expect users to still implement older versions of browser then adding units is a safer bet.
Upvotes: 130
Reputation: 146
Flex: 1
is equivalent to Flex: 1 0 0
and Flex: 1 1 0
Please see the images I took showing the output, respectively, for Flex: 1
and Flex: 1 0 0
and Flex: 1 1 0
below
Flex: 1
Flex: 1 0 0
Flex: 1 1 0
Upvotes: -1
Reputation: 4074
The default values are set to 1 1 0%
(which are the shorthand values for flex-grow flex-shrink flex-basis
respectively) probably because these are the values that make the most sense for "flex" items. Here are what exactly those values mean:
E.g., what if one of the three items had a flex-grow of 5 and the other ones were still on their default values(i.e., 1)? Then the one with the flex-grow of 5 would get (300px / (1+1+5)) * 3 of the extra space.
Another useful example is, if you have a flex container and you want each of the children to take exactly the full width of the parent(e.g., an image carousel), in that case you may use a flex: 0 0 100%
on all children so that items will have a flex-basis of taking the full-width of the parent, and turning their growing/shrinking off.
Upvotes: 17
Reputation: 436
I was also confused with flex: 1
, so I will share here my way of understanding this property :)
To understand the concept of flex: 1
, first we have to make sure the parent element has a display property set to flex i.e., display: flex
. Now, the nested flexed elements inside the parent can make use of flex: 1.
Ok now the question is what will this do to the flexed element? If an element has flex: 1
, this means the size of all of the other elements will have the same width as their content, but the element with flex: 1
will have the remaining full space given to it. See the illustration below.
Upvotes: 24
Reputation: 6595
flex: 1
sets flex-grow
to 1
(whereas the default value is 0
).
What this does:
If all items have flex-grow set to 1, the remaining space in the container will be distributed equally to all children. If one of the children has a value of 2, the remaining space would take up twice as much space as the others (or it will try to, at least).
(Source: CSS Tricks)
In the case of a one-value flex syntax with a unitless number (rather than a value for flex-basis
, the other option),
...it is interpreted as
flex: <number> 1 0
; theflex-shrink
value is assumed to be1
and theflex-basis
value is assumed to be0
.
(Source: MDN)
Upvotes: 3
Reputation: 422
In Chrome Ver 84, flex: 1
is equivalent to flex: 1 1 0%
. The followings are a bunch of screenshots.
Upvotes: 20
Reputation:
Here is the explanation:
https://www.w3.org/TR/css-flexbox-1/#flex-common
flex: <positive-number>
Equivalent to flex: <positive-number> 1 0. Makes the flex item flexible and sets the flex basis to zero, resulting in an item that receives the specified proportion of the free space in the flex container. If all items in the flex container use this pattern, their sizes will be proportional to the specified flex factor.
Therefore flex:1
is equivalent to flex: 1 1 0
Upvotes: 149
Reputation: 5167
flex: 1
means the following:
flex-grow : 1; ➜ The div will grow in same proportion as the window-size
flex-shrink : 1; ➜ The div will shrink in same proportion as the window-size
flex-basis : 0; ➜ The div does not have a starting value as such and will
take up screen as per the screen size available for
e.g:- if 3 divs are in the wrapper then each div will take 33%.
Upvotes: 265