http://www.w3cplus.com/css3/understanding-flexbox-everything-you-need-to-know.html參考文檔css
1:要開始使用Flexbox,必須先讓父元素變成一個Flex容器。html
你能夠在父元素中顯式的設置display:flex
或者display:inline-flex
。就這麼的簡單,這樣你就能夠開始使用Flexbox模塊。css3
flex-direction || flex-wrap || flex-flow || justify-content || align-items || align-content
sql
flex-direction: row || column || row-reverse || column-reverse;flex
flex-wrap: wrap || nowrap || wrap-reverse;flexbox
flex-flow:flex-flow
是flex-direction
和flex-wrap
兩個屬性的速記屬性spa
你還記得使用border
的速記寫法?border: 1px solid red
。這裏的概念是相同的,多個值寫在同一行,好比下面的示例:code
ul { flex-flow: row wrap; }
justify-content
屬性能夠接受下面五個值之一:htm
ul {
justify-content: flex-start || flex-end || center || space-between || space-around }
align-items
屬性相似於justify-content
屬性。只有理解了justify-content
屬性,才能更好的理解這個屬性。rem
align-items
屬性能夠接受這些屬性值:flex-start || flex-end || center || stretch || baseline
。
ul { align-items: flex-start || flex-end || center || stretch || baseline }
它主要用來控制Flex項目在Cross-Axis對齊方式。這也是align-items
和justify-content
兩個屬性之間的不一樣之處。
還記得前面討論的wrap
屬性嗎?咱們在Flex容器中添加了更多的Flex項目。讓Flex容器中的Flex項目多行排列。
align-content
屬性用於多行的Flex容器。它也是用來控制Flex項目在Flex容器裏的排列方式,排列效果和align-items
值同樣,但除了baseline
屬性值。
像align-items
屬性同樣,它的默認值是stretch
。你如今應該熟悉這些值。那它又是如何影響Flex容器裏的10個Flex項目多行排列方式。
order || flex-grow || flex-shrink || flex-basis
記得前面我說過,Flex項目是當我沒有的。但咱們也能夠控制。
flex-basis
屬性能夠指定Flex項目的初始大小。也就是flex-grow
和flex-shrink
屬性調整它的大小以適應Flex容器以前。
前面介紹的是很是生要的,因此咱們須要花一點時間來增強對他們的理解。
flex-basis
默認的值是auto
。flex-basis
能夠取任何用於width
屬性的任何值。好比 % || em || rem || px
等。
注意:若是flex-basis
屬性的值是0
時,也須要使用單位。即flex-basis: 0px
不能寫成flex-basis:0
。
默認狀況,Flex項目的初始寬度由flex-basis
的默認值決定,即:flex-basis: auto
。Flex項目寬度的計算是基於內容的多少來自動計算(很明顯,加上了padding
值)。
flex
是flex-grow
、flex-shrink
和flex-basis
三個屬性的速記(簡寫)。
注意它們之間的順序。flex-grow
第一,而後是flex-shrink
,最後是flex-basis
。縮寫成GSB,能夠幫助你更好的記憶。
若是flex
屬性值中少一個值,會發生什麼呢?
若是你只設置了flex-grow
和flex-shrink
值,flex-basis
多是默認值0
。這就是所謂的絕對flex項目。只有當你設置了flex-basis
,你會獲得一個相對flex項目。
li { flex: 0 1 auto; }
這至關於寫了flex
默認屬性值以及全部的Flex項目都是默認行爲。
li { flex: 0 0 auto; }
這個至關於flex: none
。
仍是老規矩:寬度是被自動計算,不過彈性項目不會伸展或者收縮(由於兩者都被設置爲零)。伸展和收縮開關都被關掉了。
它基本上是一個固定寬度的元素,其初始寬度是基於彈性項目中內容大小。
這與 flex: auto
項目相同。
仍是按我前面立的規矩。即,自動計算初始化寬度,可是若是有必要,會伸展或者收縮以適應整個可用寬度。
伸展和收縮開關打開了,寬度自動被計算。
這裏正數能夠表明任何正數(沒有引號)。這與 flex: 「正數」 1 0
相同。
flex: 2 1 0
與寫爲 flex: 2
是同樣的,2
表示任何正數。
li { flex: 2 1 0; / *與 flex: 2相同 */ }
與前面我立的規矩同樣,即,將彈性項目的初始寬度設置爲零(嗯?沒有寬度?),伸展項目以填滿可用空間,而且最後只要有可能就收縮項目。
彈性項目沒有寬度,那麼寬度該如何計算呢?
這個時候 flex-grow
值就起做用了,它決定彈性項目變寬的程度。由它來負責沒有寬度的問題。
當有多個彈性項目,而且其初始寬度 flex-basis
被設置爲基於零的任何值時,好比 0px
,使用這種 flex
簡寫更實用。
實際發生的是,彈性項目的寬度被根據 flex-grow
值的比例來計算。
記住設置 flex-grow : 1
,會讓彈性項目填滿可用空間。伸展開關打開了。
這裏有兩個彈性項目。一個的 flex-grow
屬性值是 1
,另外一個是 2
,那麼會出現啥狀況呢?
兩個項目上的伸展開關都打開了。不過,伸展度是不一樣的,1
和 2
。
兩者都會填滿可用空間,不過是按比例的。
它是這樣工做的:前一個佔 1/3
的可用空間,後一個佔 2/3
的可用空間。
一個相對Flex項目內的間距是根據它的內容大小來計算的。而在絕對Flex項目中,只根據 flex
屬性來計算,而不是內容。
絕對Flex項目的寬度只基於 flex
屬性,而相對Flex項目的寬度基於內容大小。
align-self
屬性更進一步讓咱們更好地控制彈性項目。
你已經看到 align-items
屬性是如何有助於總體對齊彈性容器內的全部彈性項目了。
若是想改變一個彈性項目沿着側軸的位置,而不影響相鄰的彈性項目,該怎麼辦呢?
這是 align-self
屬性大展拳腳的地方了。
該屬性的取值能夠是這些值之一:auto || flex-start || flex-end || center || baseline || stretch
。
當在Flex項目上使用 margin: auto
時,值爲 auto
的方向(左、右或者兩者都是)會佔據全部剩餘空間。
解決嵌套中的flex容器的佔用空間比例問題
必定有辦法讓全部這些放在一行,每一個段落佔據該行相等空間。用Flexbox來搞定!這裏的概念與不少柵格系統中用的同樣。
li { display: flex; /*段落如今顯示在一行上*/ padding: 0 20px; /*留點呼吸空間*/ min-height: 50px; } li p { flex: 0 0 25%; /*這是甜麪醬*/ }
看到段落會發生什麼了嗎?
flex: 0 0 25%;
「不要伸展或者收縮,不過每一個段落應該佔據 25%
的可用空間」 。段落所佔空間是相等的。