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 根据盒子内容比例分配盒子大小,盒子大小不一定一样











3227

被折叠的 条评论
为什么被折叠?



