咱們使用Flexbox 實現垂直水平居中、自適應容器寬度樂此不疲,由於確確實實很方便。能夠簡便、完整、響應式地實現各類頁面佈局,目前已獲得全部現代瀏覽器的支持。但Flex屬性如何計算呢?css
Flex是Flexible Box的縮寫,翻譯成中文就是「彈性盒子」,用來爲盒狀模型提供最大的靈活性。任何一個容器均可以指定爲Flex佈局。html
採用Flex佈局的元素,被稱爲Flex容器(flex container),簡稱「容器」。其全部子元素自動成爲容器成員,稱爲Flex項目(Flex item),簡稱「項目」。前端
容器默認存在兩根軸:水平方向主軸(main axis)和垂直方向交叉軸(cross axis),默認項目按主軸排列。(因此Flex 佈局默認direction 爲 row) 算法
- main start/main end:主軸開始位置/結束位置;
- cross start/cross end:交叉軸開始位置/結束位置;
- main size/cross size:單個項目佔據主軸/交叉軸的空間;
容器上的6個屬性 | 項目的6個屬性 |
---|---|
flex-direction | order |
flex-wrap | flex-grow |
flex-flow | flex-shrink |
justify-content | flex-basis |
align-items | flex |
align-content | align-self |
flex 屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值爲0 1 auto。後兩個屬性可選。瀏覽器
/* Specify <'width'> */
flex-basis: 10em;
flex-basis: 3px;
flex-basis: auto;
/* Intrinsic sizing keywords */
flex-basis: fill;
flex-basis: max-content;
flex-basis: min-content;
flex-basis: fit-content;
/* Automatically size based on the flex item’s content */
flex-basis: content;
/* Global values */
flex-basis: inherit;
flex-basis: initial;
flex-basis: unset;
複製代碼
The flex-basis property is specified as either the keyword content or a <'width'>. 好多新的屬性值,和width的 屬性值 相似。佈局
描述flex
效果—1 max-content spa
效果—2 min-content 翻譯
效果—3 fit-content 3d
效果—4 fill-available
當Flex容器有必定的剩餘空間時,flex-grow可讓Flex項目分配Flex容器剩餘的空間,每一個Flex項目將根據flex-grow因子擴展,從而讓Flex項目佈滿整個Flex容器(有效利用Flex容器的剩餘空間)。當全部的Flex項目具備一個相同的flex-grow值時,那麼Flex項目將會平均分配Flex容器剩餘的空間。
flex-shrink是用來控制Flex項目縮放因子。當全部Flex項目寬度之和大於Flex容器時,將會溢出容器(flex-wrap爲nowrap時),flex-shrink就能夠根據Flex項目設置的數值比例來分配Flex容器的不足空間,也就是按比例因子縮小自身的寬度,以避免溢出Flex容器。
假設:一個 寬度 837px 的 Flex 容器 下有2 個 Flex項目,如圖:
如何 grow ?
// Flex 項目1
height: 100px;
background-color: red;
flex-grow: 5;
flex-shrink: 5;
flex-basis: 200px;
複製代碼
// Flex 項目2
height: 100px;
background-color: blue;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 200px;
複製代碼
grow 計算:
容器 寬度 837px - flex-basis[1] - flex-basis[2] > 0 即 有剩餘空間
剩餘空間 = 容器 寬度 837px - flex-basis[1] - flex-basis[2] = 837px - 200px -200px = 437px
flex-grow 發揮做用以下:
flex-grow [1] * x + flex-grow[2] * x = 437px
5x + 1x = 437
x= 72.83px
因此
Flex 項目1 的總寬度 = flex-basis[1] + flex-grow[1] * x = 200px + 72.83px * 5 = 564.17px
Flex 項目2 的總寬度 = flex-basis[2] + flex-grow[2] * x = 200px + 72.83px * 1 = 272.83px
複製代碼
如何 shrink ?
// Flex 項目1
height: 100px;
background-color: red;
flex-grow: 5;
flex-shrink: 5;
flex-basis: 800px;
複製代碼
// Flex 項目2
height: 100px;
background-color: blue;
flex-grow: 1;
flex-shrink: 1;
flex-basis: 800px;
複製代碼
shrink 計算:
容器 寬度 837px - flex-basis[1] - flex-basis[2] < 0 即 有不足空間
不足空間 = 容器 寬度 837px - flex-basis[1] - flex-basis[2] = 837px - 800px -800px = -763px
flex-shrink 發揮做用以下:
flex-shrink [1] * x + flex-shrink[2] * x = 763px
5x + 1x = 763px
x = 127.17px
因此
Flex 項目1 的總寬度 = flex-basis[1] - flex-shrink[1] * x = 800px - 127.17px * 5 = 164.17px
Flex 項目2 的總寬度 = flex-basis[2] + flex-shrink[2] * x = 800px - 127.17px * 1 = 672.83px
複製代碼
但願本篇文章能幫助你們進一步瞭解Flex屬性是如何計算。最後借用一張清晰的圖來作個總結吧。
快狗打車前端團隊專一前端技術分享,按期推送高質量文章,歡迎關注點贊。
參考連接:
[1]: www.w3cplus.com/css/flex-it…
[2]: ithelp.ithome.com.tw/articles/10…