css编辑样式的时候经常会用到flex:1来占满父元素的剩余空间,那么这个属性值具体是什么意思呢?
先来看下flex的使用语法:
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
所以flex
属性是flex-grow
,flex-shrink
和flex-basis
这 3 个 CSS 属性的缩写.
接下来我们了解一下这三个属性分别代表什么(以下flex-direction均为row情况下讨论):
flex-grow
flex-grow
规定在空间允许的情况下,子元素如何按照比例分配可用剩余空间:
-
如果所有的子元素的属性都设定为 1,则父元素中的剩余空间会等分给所有子元素。
-
如果其中某个子元素的
flex-grow
设定为2,则在分配剩余空间时该子元素将获得其他元素二倍的空间(至少会尽力获得)。
它的默认值为0,意味着即使有剩余空间,各子元素也不会放大。
初始默认flex为0:
当第一个盒子flex为1:
当第二个盒子flex为2:
另外,flex-grow
不能设置负值。
flex-shrink
与flex-grow属性类似,flex-shrink定义了空间不足时项目的缩小比例:
-
如果其中某个子元素的
flex-shrink
值为0,则空间不足时该子元素并不会缩小。 -
如果其中某个子元素的
flex-shrink
值为2时,则空间不足时该子元素会以二倍速度缩小。
flex-shrink
的默认值为1,当所有子元素都为默认值时,则空间不足时子元素会同比例缩小。
初始默认的三个盒子宽度之和大于外部时,由于flex未设置换行三个盒子挤在一行里,此时默认flex-shrink都为1:
当第一个盒子设为flex-shrink:0时:
当第二个盒子设为flex-shrink:2时:
flex-basis
flex-basis定义了在计算剩余空间之前子元素默认的大小,可以设置为某个长度(比如 20%, 4rem 等,相当于width)或者关键字。
默认初始样式:
当第一个盒子设为flex-basis:50%时
flex-basis默认值是关键字auto
,代表这子元素会按照其本来的大小显示。
flex:1是什么的缩写?
回到flex的基本语法
flex: none
很好理解,元素会根据自身宽高来设置尺寸。它是完全非弹性的:既不会缩短,也不会伸长来适应 flex 容器,相当于将属性设置为 flex: 0 0 auto
。
再来看看 flex
设置成其他值时规则:
(1) 如果 flex
的属性值只有 1 个值,则具体规则如下:
-
如果是数值,如
flex:1
,则这个1
为flex-grow
属性的值,此时flex-shrink
属性和flex-basis
属性的值分别是1
和0%
。注意,这里的flex-basis
属性是0%
,而不是默认值auto
。 -
如果是长度值,如
flex:100px
,则这个100px
显然为flex-basis
属性的值,因为 3 个缩写的 CSS 属性中只有flex-basis
的属性值支持长度值。此时flex-grow
属性和flex-shrink
属性的值都是1
,注意,这里的flex-grow
属性的值是1
,而不是默认值0
。
(2) 如果 flex
的属性值有 2 个值,则第一个值一定是 flex-grow
属性值,第二个值根据值的类型不同对应不同的CSS属性,具体规则如下。
-
如果第二个值是数值,例如
flex:1 2
,则这个2
是flex-shrink
属性的值,此时flex-basis
属性计算值是0%
,并非默认值auto
。 -
如果第二个值是长度值,例如
flex:1 100px
,则这个100px
为flex-basis
属性值。
(3) 如果 flex
属性值有 3 个值,则长度值为 flex-basis
属性值,其余两个数值分别为 flex-grow
和 flex-shrink
的属性值。
如以下两种写法效果含义是一样的
flex: 1 2 50%;
flex:50% 1 2;
flex:1和flex:auto的区别?
初始无设置,盒子大小也未设置固定宽度:
此时三个盒子flex:1 即 flex:1 1 0%,等比扩大充满盒子
设置三个盒子为flex:auto 即 flex:1 1 auto,按照盒子自身大小比例充满盒子
综上,flex:1和flex:auto的主要区别在于flex-basis的值,
flex:1 平均分配盒子大小,所有盒子一样大,而 flex:auto 根据盒子内容比例分配盒子大小,盒子大小不一定一样