最近在研究css3的flex。遇到的flex:1;這一塊,非常很糾結,flex-grow、flex-shrink、flex-basis始終搞不清,最經蒐集了大量的介紹,應該能算是明白了。
網上大部分解釋是
flex-grow 是擴展比率
flex-shrink 是收縮比率
flex-basis 伸縮基準值css
假設flex盒子父級寬度固定爲800px;html
Flex-grow、Flex-shrink、Flex-basis 是Flex屬性的分寫模式;css3
如
.box {
flex: 4 3 100px;
}
等於
.box {
flex-grow: 4;
flex-shrink: 3;
flex-basis: 100px;
}flex
看如下例子htm
<div class="flex-parent">
<div class="flex-son"></div>
<div class="flex-son"></div>
<div class="flex-son"></div>
</div>
<style type="text/css">
.flex-parent {
width: 800px;
}
</style>ip
第一種狀況
flex-parent 是父級,並且他的寬度是固定爲800px,不會改變;
開始設置子級flex屬性;
<style type="text/css">
.flex-son:nth-child(1){
flex: 3 1 200px;
}
.flex-son:nth-child(2){
flex: 2 2 300px;
}
.flex-son:nth-child(3){
flex: 1 3 500px;
}
</style>
flex-basis總和加起來爲1000px; 那麼 1000px > 800px (父級的寬度);子元素勢必要壓縮;溢出了200px;文檔
son1 = (flex-shrink) * flex-basis;
son2 = (flex-shrink) * flex-basis;
…..
sonN = (flex-shrink) * flex-basis;get
若是flex-basis的總和加起來大於父級寬度,子級被壓縮,最後的選擇是flex-shrink來進行壓縮計算
加權值 = son1 + son2 + …. + sonN;class
那麼壓縮後的計算公式就是擴展
壓縮後寬度 w = (子元素flex-basis值 * (flex-shrink)/加權值) * 溢出值
因此最後的加權值是
1*200 + 2*300 + 3*500 = 2300px
son1的擴展量:(200 * 1/ 2300) * 200,即約等於17px;
son2的擴展量:(300 * 2/ 2300) * 200,即約等於52px;
son3的擴展量:(500 * 3/ 2300) * 200,即約等於130px;
最後son一、son二、son3,的實際寬度爲:
200 – 16 = 184px;
300 – 52 = 248px;
500 – 130 = 370px;
第二種狀況
上面的例子已經說明,繼續看第二個例子,一樣上面的例子,咱們改下父級寬度爲1200px;
flex-basis的總和爲 1000px,小於父級寬度,將有200px的剩餘寬度;
既然有剩餘,咱們就不要加權計算,剩餘的寬度將根據flex-grow,值得總和進行百分比,那麼200px就會根據份數比來分配剩餘的空間;
剩餘後寬度 w = (子元素flex-grow值 /全部子元素flex-grow的總和) * 剩餘值
總分數爲 total = 1 + 2 + 3;
son1的擴展量:(3/total) * 200,即約等於100px;
son2的擴展量:(2/total) * 200,即約等於67px;
son3的擴展量:(1/total) * 200,即約等於33px;
最後son一、son二、son3,的實際寬度爲:
200 + 100 = 300px;
300 + 67 = 367px;
500 + 33 = 533px;
總結
因此以上兩種狀況下,第二種flex-basis和flex-shrink是不列入計算公式的;第一種flex-grow是不列入計算公式的
ok,上面的兩種狀況總結完畢,可是不少時候咱們的父級是不固定的,那麼怎麼辦,其實很簡單了,對照上面的公式,前提是已經設置了flex-basis值得元素,若是寬度的隨機值小於flex-basis的時候就按第一種計算,反之第二種;明白了吧。
可是在實際中,咱們有些子元素不想進行比例分配,永遠是固定的,那麼flex就必須設置爲none;
不然設置的寬度(width)將無效;
flex: 1, 則其計算值爲 flex: 1 1 0%;
flex: auto, 則其計算值爲 flex: 1 1 auto;
flex: none, 則其計算值爲 flex: 0 0 auto;
根據上面的公式
flex:1的時候第一種方式實際上是無效的,由於加權值是0,因此只能是第二種方式計算;
flex:none的時候,兩種都失效,本身元素不參與父級剩餘仍是溢出的分配,flex:none的應用場景仍是不少的;