The difference between flex:1 and flex
In mdn
flex:1
means the same as
flex-grow:1
. However, in fact it has different show in browser.
You can try it in this jsFiddle by changing the comment in css.
When I use flex: 1
the element who's classname is test-container
will be height:100%
but it won't happen when you use flex-grow: 1
.
I don't understand why. Looking for some help. Thanks very much.
.flex-1 {
display: flex;
flex-direction: column;
height: 500px;
background: red;
}
.child-1 {
height: 50px;
background: blue;
}
.child-2 {
flex-grow: 1;
/* flex:1; */
background: green;
}
.test-container {
display: flex;
flex-direction: row;
background: white;
height: 100%;
}
<div class="flex-1">
<div class="child-1"></div>
<div class="child-2">
<div class="test-container"></div>
</div>
</div>
flex
The flex
property is a shorthand for setting:
flex-grow
flex-shrink
flex-basis
The flex: 1
rule is supposed to compute to this:
flex-grow: 1
flex-shrink: 1
flex-basis: 0
These values are defined in the spec. See section 7.1.1. Basic Values of flex
I say "supposed to compute" because, in IE11 and possibly other browsers, a unit of measure, such as px
or %
, is appended to the 0
value in flex-basis
. This can make a difference (example).
flex-grow
The flex-grow property (which distributes free space in the container among flex items), when declared by itself, leaves flex-shrink
and flex-basis
at their initial values.
So when you set flex-grow: 1
, the browser renders this:
flex-grow: 1
(overrides the default value, which is 0) flex-shrink: 1
(this is the default value) flex-basis: auto
(this is the default value) The difference between flex: 1
and flex-grow: 1
Ultimately, the difference between flex: 1
and flex-grow: 1
is that the former sets flex-basis: 0
, and the latter keeps the default flex-basis: auto
.
For a complete explanation of the difference between flex-basis: 0
and flex-basis: auto
see this post:
Your code example
The reason you're seeing a difference in your code is that flex-basis
controls height in a column-direction container.
In Chrome, with flex-basis: auto
, the height of the element is 450px (500px parent - 50px header). In other words, flex-grow
is free to distribute the free space.
With flex-basis: 0
, the height of the element is 0, and flex-grow
has no free space to distribute.
The height: 100%
on the child of the flex item is simply ignored because it isn't being applied properly, as explained in these posts:
height
property and percentage values In reading the posts above you'll also understand why your code renders differently in Firefox, Safari, Edge and IE.
l get the reason why that happen. In fact
flex:1
=== flex-grow:1;flex-shrink:1;flex-basis:0%
the key is the flex-basis:0%
. If you use flex-grow:1
,the flex-basis
will be auto. In this sutation, you can't let the height:100%
work .
However I don't sure when the
flex:1
=== flex-grow:1;flex-shrink:1;flex-basis:0%
will happen. In the doc
flex:1
!== flex-grow:1;flex-shrink:1;flex-basis:0%
上一篇: 行包装盒中的嵌套列柔性盒
下一篇: flex:1和flex之间的区别