flex布局的一点发现

179 阅读3分钟

flex-basis

此属性用于设置或检索弹性盒伸缩基准值,可选值有number|auto|initial|inherit

有一点需要注意的是,当父容器的宽度或高度确定,此属性设置的值为number时,不管设置的是 具体像素值  或是 百分比 (以父容器的宽度或高度为基准计算),最终该子元素呈现出来的宽度或高度绝对不会大于父容器内部 剩余空间宽度(除去所有其他子元素宽度和子元素的所有margin值)。

举个栗子,当flex-basis设置为100%时,子元素呈现的宽度就等于父容器内部剩余空间宽度。

flex-shrink

此属性指定了 flex 元素的收缩规则,仅在所有子元素宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。

举个栗子,如下代码:

css代码

#content { display: flex; width: 500px; } 

#content div { flex-basis: 120px; border: 3px solid rgba(0,0,0,.2); } 

.box { flex-shrink: 1; } 

.box1 { flex-shrink: 2; }

html代码

<div id="content"> 

<div class="box" style="background-color:red;">A</div> 

<div class="box" style="background-color:lightblue;">B</div> 

<div class="box" style="background-color:yellow;">C</div> 

<div class="box1" style="background-color:brown;">D</div> 

<div class="box1" style="background-color:lightgreen;">E</div> 

</div>

解析:

flex-shrink的默认值为1,如果没有显示定义该属性,将会自动按照默认值1在所有因子相加之后计算比率来进行空间收缩。

本例中A、B、C 显式定义了 flex-shrink 为 1,D、E 定义了 flex-shrink 为 2,所以计算出来总共将剩余空间分成了 7 份,其中 A、B、C 占 1 份,D、E 占 2 份,即1:1:1:2:2

我们可以看到父容器定义为 500px,子项被定义为 120px,子项相加之后即为 600 px,超出父容器 100px。那么超出的 100px 需要被 A、B、C、D、E 消化 通过收缩因子,所以加权综合可得 100*1+100*1+100*1+100*2+100*2=700px。

于是我们可以计算 A、B、C、D、E 将被移除的溢出量是多少:

A 被移除溢出量:(100*1/700)*100,即约等于14px
B 被移除溢出量:(100*1/700)*100,即约等于14px
C 被移除溢出量:(100*1/700)*100,即约等于14px
D 被移除溢出量:(100*2/700)*100,即约等于28px
E 被移除溢出量:(100*2/700)*100,即约等于28px

flex

此属性是flex-grow、flex-shrink、flex-basis的组合简写。

关于这个属性,有一个布局小技巧可以说一下,这个属性适用于一侧定宽,一侧自适应的布局情况。

此时,将定宽的一侧flex-basis设置为定宽,自适应的一侧flex设置为1即可。