前言:
這是我看過最好的flex佈局教程:
30分鐘完全弄懂flex佈局html
文檔流:塊級元素獨佔一行,從上往下排列,行級元素從左往右排列。佈局
display inline-block主要用來作橫向的佈局。
用分離負maigin用來產生位移。學習
學習flex我分紅兩個部分,第一個部分是元素佈局。如下幾個屬性影響着元素的佈局。flex
/*容器上:*/ justify-content align-items flex-direction flex-wrap flex-flow align-content /*元素上:*/ order align-self
作完下面的遊戲,看完下面的兩篇文章,理解了上面幾個屬性的用法,就理解了元素的佈局。他們已經寫得很詳細了。這裏不須要我班門弄斧。
30分鐘完全弄懂flex佈局
Flex 佈局教程:語法篇flexbox
CSS3【Flex佈局】有趣的青蛙遊戲
遊戲一共24關,每關把全部顏色青蛙移動到對應顏色荷葉上便可過關
通關後就會使用影響佈局的屬性。spa
而影響大小和伸縮與尺寸的屬性flex-grow
、flex-shrink
、flex-basis
這三個屬性比較難理解,能夠看30分鐘完全弄懂flex佈局和深刻理解flex佈局的flex-grow、flex-shrink、flex-basiscode
在這裏記錄一下本身的理解。htm
flex-basis
用於設置元素在主軸上的大小(若是軸體變成從上到下,就會覆蓋height)。flex-basis: 0
表示元素根據內容撐開寬度,width
無論用了。flex-basis
優先級比width
高。flex-basis
爲auto
時,如設置了width
則元素尺寸由width
決定;沒有設置則由內容決定。(默認就是auto)因此若是一個容器設置爲flex佈局,那麼他裏面的元素在沒有設置寬高的時候,大小都由內容撐開!詳細仍是看30分鐘完全弄懂flex佈局講的很是明白blog
flex-wrap: nowrap;
主軸上的元素總和超了容器寬度,那麼默認會縮小。flex-shrink
默認是1
,即縮小因子是1,也就是當不夠分配時,元素都將等比例縮小,佔滿整個寬度。flex-shrink
是0表示這個元素不縮小,若是超了,就在其餘元素上動手腳縮小。詳細仍是看30分鐘完全弄懂flex佈局講的很是明白。教程
flex-grow:0
,即,不擴大。原來是多大就是多大(flex-basic
或者width
、height
的長度)50px
沒有分配,兩個子元素flex-grow:
分別爲flex-grow:3
和flex-grow:2
,那麼第一個元素就分配30px,第二個元素分配20px。flex-grow
爲1,另外一個沒有設置,那麼多出來的所有的大小都會分配給第一個元素。詳細仍是看30分鐘完全弄懂flex佈局講的很是明白。
flex = flex-grow + flex-shrink + flex-basis
一些簡寫
flex: 1 = flex: 1 1 0%// flex: 2 = flex: 2 1 0% flex: auto = flex: 1 1 auto; flex: none = flex: 0 0 auto; // **經常使用於固定尺寸 不伸縮**
flex-grow + flex-shrink
都是1的話意思就是無論是超出這一行,仍是小於這一行,都按比例佔滿這一行(放大或縮小元素)!!
flex:1 和 flex:auto 的區別
都是按比例放大縮小,而後佔滿一行。
其實能夠歸結於flex-basis:0
和flex-basis:auto
的區別。
flex-basis
是指定初始尺寸,當設置爲0時(絕對彈性元素),此時至關於告訴flex-grow
和flex-shrink
在伸縮的時候不須要考慮個人尺寸;相反當設置爲auto
時(相對彈性元素),此時則須要在伸縮時將元素尺寸歸入考慮。
總結:
flex: 1
的時候,伸縮時不須要考慮width
,由於flex-basis:0
(元素爲內容撐開的寬度),只須要按照元素的內容寬度進行等比例的伸縮。flex: auto
的時候,伸縮時須要考慮width
,按照width
進行等比例伸縮。舉例:flex:1
應用:
<ul id="container"> <li id="item"></li> <li id="item"></li> <li id="item"></li> </ul>
#container{ display: flex; flex-wrap: nowrap; width: 200px; height: 200px; background-color: orange; } #item:nth-child(1){ flex:1;/*這裏*/ width: 100px; height:100px; background-color: blue; } #item:nth-child(2){ flex:1;/*這裏*/ width:50px; height:100px; background-color: green; } #item:nth-child(3){ /* flex:1; *//*這裏沒寫*/ width:30px; height: 100px; background-color: #ccc; }
前兩個元素將剩餘的空間平局分了,由於沒有內容,顯示的寬度都是0,因而兩個元素分得的擴大像素同樣,因此平分了。
而若是是flex:auto
,那麼將會根據width
按比例伸縮,佔滿一行。