flex布局的几个进阶面试题
-
flex属性默认值是多少,flex:1代表什么?
flex属性默认值:flex: 0 1 auto
flex: 1代表flex-grow: 1; flex-shrink: 0; flex-basis: auto; -
flex伸缩的计算公式
答:以第i个flex子项的flex属性设置为
flex:伸展因子算法:
压缩因子算法:
flex子项在主轴方向上的尺寸,其中为伸缩空间
当然这是在flex子项本身在主轴方向没有其他尺寸限制属性的情况下的计算。如果存在其他限制,则采用先预计算;如果符合限制,则和没有限制一样,采用预计算方案直接布局;如果不符合限制,将有限制的子项元素按照限制layout以后,再由其他flex子项元素按照上述公式进行计算得出尺寸。
举一些例子
-
伸展
<div class="flex-container container-1"> <div class="flex-item item-1"></div> <div class="flex-item item-2"></div> <div class="flex-item item-3"></div> </div>.flex-container { height: 200px; width: 500px; margin: 100px auto; border: 1px solid #5b5252; display: flex; } .flex-item { height: 100%; } .container-1 > .item-1 { flex: 1 3 100px; } .container-1 > .item-2 { flex: 6 1 200px; } .container-1 > .item-3 { flex: 3 6 100px; }最终布局:
flex子项总宽度:,所以flex子项伸展,伸缩空间:
item-1宽度:
item-2宽度:
item-3宽度: -
压缩
<div class="flex-container container-2"> <div class="flex-item item-1"></div> <div class="flex-item item-2"></div> <div class="flex-item item-3"></div> </div>.flex-container { height: 200px; width: 500px; margin: 100px auto; border: 1px solid #5b5252; display: flex; } .flex-item { height: 100%; } .container-2 > .item-1 { flex: 1 3 100px; } .container-2 > .item-2 { flex: 6 1 200px; } .container-2 > .item-3 { flex: 3 6 300px; }最终布局:
flex子项总宽度:,所以flex子项需要压缩,伸缩空间:
item-1宽度:
item-2宽度:
item-3宽度: -
伸展+max-width限制
<div class="flex-container container-3"> <div class="flex-item item-1"></div> <div class="flex-item item-2"></div> <div class="flex-item item-3"></div> </div>.flex-container { height: 200px; width: 500px; margin: 100px auto; border: 1px solid #5b5252; display: flex; } .flex-item { height: 100%; } .container-3 > .item-1 { flex: 1 3 100px; } .container-3 > .item-2 { flex: 6 1 200px; } .container-3 > .item-3 { flex: 3 6 100px; max-width: 120px; }最终布局:
预计算:
flex子项总宽度:,所以flex子项伸展,伸缩空间:
item-1宽度:
item-2宽度:
item-3宽度:
item-3预计算宽度130px,超过max-width:120px限制,为item-3设置满足限制的尺寸,排除item-3进行重新计算flex子项总宽度:,所以flex子项伸展,伸缩空间:
item-1宽度:
item-2宽度:
item-3宽度: -
压缩+min-width限制
<div class="flex-container container-4"> <div class="flex-item item-1"></div> <div class="flex-item item-2"></div> <div class="flex-item item-3"></div> </div>.flex-container { height: 200px; width: 500px; margin: 100px auto; border: 1px solid #5b5252; display: flex; } .flex-item { height: 100%; } .container-4 > .item-1 { flex: 1 3 100px; } .container-4 > .item-2 { flex: 6 1 200px; } .container-4 > .item-3 { flex: 3 6 300px; min-width: 280px; }预计算:
flex子项总宽度:,所以flex子项压缩,伸缩空间:
item-1宽度: item-2宽度:
item-3宽度:
item-3预计算宽度221。74px,不满足min-width:280px限制,为item-3设置满足限制的尺寸,排除item-3进行重新计算
flex子项总宽度:,所以flex子项伸展,伸缩空间:
item-1宽度:
item-2宽度:
item-3宽度:
-
flex: 1的正常伸展情况<div class="flex-container container-5"> <div class="flex-item item-1"></div> <div class="flex-item item-2"></div> </div>.flex-container { height: 200px; width: 500px; margin: 100px auto; border: 1px solid #5b5252; display: flex; } .flex-item { height: 100%; } .container-5 > .item-1 { flex: 0 0 100px; } .container-5 > .item-2 { flex: 1; }
item-1 宽度:100px
item-2 伸展,宽度: -
flex: 1的溢出情况<div class="flex-container container-6"> <div class="flex-item item-1"> <span class="item-text">我撑开父元素的宽度</span> </div> <div class="flex-item item-2"> <span class="item-text">我也撑开父元素的宽度,我也撑开父元素的宽度,我也撑开父元素的宽度</span> </div> </div>.flex-container { height: 200px; width: 500px; margin: 100px auto; border: 1px solid #5b5252; display: flex; } .flex-item { height: 100%; } .container-6 > .item-1 { flex: 0 0 100px; } .container-6 > .item-1 > .item-text { white-space: nowrap; } .container-6 > .item-2 { flex: 1; } .container-6 > .item-2 > .item-text { white-space: nowrap; }
观察到
item-1和item-2的宽度都存在异常。- 即使
item-1的flex-grow指定为0,其宽度仍然超过flex: 0 0 100px中的100px - 即使
item-2的flex-shrink指定为0,其宽度仍然导致溢出。
原因请看第三个问题的答案。
- 即使
-
-
flex布局为什么会出现flex子项设置了
<span style="font-weight: bold;" data-type="strong">flex-grow: 0</span>尺寸仍然超过<span style="font-weight: bold;" data-type="strong">flex-basis</span>设置,flex子项开启了压缩(<span style="font-weight: bold;" data-type="strong">flex-shrink</span>不为0)仍然产生溢出的现象?
min-width/min-height 这两个属性在一般情况下默认值都是0,也就是说没有限制最小尺寸。但是flexbox规范中明确规定,当container开启flex布局以后,flex子项的min-width/min-height属性默认值会被修改为auto。auto的含义:
当flex子项还具有子元素时,flex子项在主轴方向的默认最小限制是该子项的子元素尺寸和该子项本身的
<span style="font-weight: bold;" data-type="strong">width/height</span>的较小值所以
flex: 0 0 300px 的元素不一定在主轴方向是300px,flex: 0 1 auto的元素在主轴方向上不一定不溢出。 -
flex布局中
flex-basis,width/height,以及主轴尺寸关系
flex-basis定义flex子项在主轴方向上伸缩的基础尺寸。
width/height在flex-basis为auto时,设定flex-basis的同时,设置flex子项的默认最小宽度限制主轴尺寸:当flex容器没有设定主轴尺寸时,主轴尺寸由各个flex子项的主轴尺寸决定。
-
主轴方向为column的flex布局,很多时候没有开启的必要,请不要随手开启。