In the flex layout model, the children of a flex container can be laid out in any direction, and can 「flex」 their sizes, either growing to fill unused space or shrinking to avoid overflowing the parent. Both horizontal and vertical alignment of the children can be easily manipulated. Nesting of these boxes (horizontal inside vertical, or vertical inside horizontal) can be used to build layouts in two dimensions.(W3C)css
以上爲W3C對flexbox的部分解釋,大概就是說flexbox的出現是爲了解決複雜的web佈局,由於這種佈局方式很靈活。容器的子元素能夠任意方向進行排列。此屬性目前處於非正式標準,如下是各瀏覽器對flexbox的支持程度,在較新的瀏覽器中基本可使用該屬性。
html
flex佈局模型不一樣於塊和內聯模型佈局,塊和內聯模型的佈局計算依賴於塊和內聯的流方向,而flex佈局依賴於flex directions.簡單的說:Flexbox是佈局模塊,而不是一個簡單的屬性,它包含父元素(flex container)和子元素(flex items)的屬性。css3
下面這個例子是咱們用的不少的徹底居中(上下左右居中),咱們能夠用不少種方法實現,但目前只有用Flexbox實現是最爲簡單的。web
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>center</title> <link rel="stylesheet" href="./center.css"> </head> <body> <div class="parent"><div class="child"></div></div> </body> </html>
body{ padding: 0; margin: 0; } .parent { display: flex; height: 300px; /* Or whatever */ background-color: black; } .child { width: 100px; /* Or whatever */ height: 100px; /* Or whatever */ margin: auto; /* Magic! */ background-color: white; }
在Flex容器中,當項目邊距設置爲「auto」時,設置自動的垂直邊距將使該項目徹底集中兩個軸。瀏覽器
再看一個例子,將子元素的數量增長到六個。六個子元素隨着瀏覽器大小改變佈局而不須要用媒體查詢。ide
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>six</title> <link rel="stylesheet" href="./six.css"> </head> <body> <ul class="flex-container"> <li class="flex-item">1</li> <li class="flex-item">2</li> <li class="flex-item">3</li> <li class="flex-item">4</li> <li class="flex-item">5</li> <li class="flex-item">6</li> </ul> </body> </html>
body{ margin: 0; padding: 0; } ul { margin: 0; padding: 0; } li{ list-style: none; } .flex-container { /* We first create a flex layout context */ display: flex; /* Then we define the flow direction and if we allow the items to wrap * Remember this is the same as: * flex-direction: row; * flex-wrap: wrap; */ flex-flow: row wrap; /* Then we define how is distributed the remaining space */ justify-content: space-around; } .flex-item { background: tomato; padding: 5px; width: 200px; height: 150px; margin-top: 10px; line-height: 150px; color: white; font-weight: bold; font-size: 3em; text-align: center; }
效果以下:
佈局
實現圖中效果,須要設置三個屬性:flex-direction: row; flex-wrap: wrap; justify-content: space-around;下節將介紹各屬性。flex
1.display(flex container)ui
display: other values | flex | inline-flex;
2.flex-direction(flex container)this
這個主要用來建立主軸,從而定義了伸縮項目放置在伸縮容器的方向。
flex-direction: row | row-reverse | column | column-reverse
3.order(flex items)
默認狀況下,伸縮項目是按照文檔流出現前後順序排列。然而,「order」屬性能夠控制伸縮項目在他們的伸縮容器出現的順序。
order: <integer>
4.flex-wrap(flex container)
這個主要用來定義伸縮容器裏是單行仍是多行顯示,側軸的方向決定了新行堆放的方向。
flex-wrap: nowrap | wrap | wrap-reverse
5.flex-flow(flex container)
這個是「flex-direction」和「flex-wrap」屬性的縮寫版本。同時定義了伸縮容器的主軸和側軸。其默認值爲「row nowrap」。
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
div { flex-flow: row; }/* Initial value. Main-axis is inline, no wrap. */
div { flex-flow: row-reverse wrap-reverse; }/* Main-axis is the opposite of inline direction(right to left). New lines wrap upwards. */
6.justify-content(flex container)
這個是用來定義伸縮項目沿着主軸線的對齊方式。當一行上的全部伸縮項目都不能伸縮或可伸縮可是已經達到其最大長度時,這一屬性纔會對多餘的空間進行分配。當項目溢出某一行時,這一屬性也會在項目的對齊上施加一些控制。
justify-content: flex-start | flex-end | center | space-between | space-around;
7.align-content(flex container)
這個屬性主要用來調準伸縮行在伸縮容器裏的對齊方式。相似於伸縮項目在主軸上使用「justify-content」同樣。
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
8.align-items(flex container)
align-items: flex-start | flex-end | center | baseline | stretch
9.align-self(flex items)
用來在單獨的伸縮項目上覆寫默認的對齊方式。
align-self: auto | flex-start | flex-end | center | baseline | stretch;
10.flex-grow(flex items)
根據須要用來定義伸縮項目的擴展能力。它接受一個不帶單位的值作爲一個比例。主要用來決定伸縮容器剩餘空間按比例應擴展多少空間。
flex-grow: <number>; /* default 0 */
若是全部伸縮項目的「flex-grow」設置了「1」,那麼每一個伸縮項目將設置爲一個大小相等的剩餘空間。若是你給其中一個伸縮項目設置了「flex-grow」值爲「2」,那麼這個伸縮項目所佔的剩餘空間是其餘伸縮項目所佔剩餘空間的兩倍。以下圖:
11.flex-shrink(flex items)
根據須要用來定義伸縮項目收縮的能力。[注意:負值一樣生效。]
flex-shrink: <number>; /* default 1 */
12.flex-basis(flex items)
這個用來設置伸縮基準值,剩餘的空間按比率進行伸縮。
flex-basis: <length> | auto; /* default auto */
若是設置爲「0」,不考慮剩餘空白空間。若是設置爲自動,則按照flex-grow值分配剩餘空白空間。如圖所示:
13.flex(flex items)
這是「flex-grow」、「flex-shrink」和「flex-basis」三個屬性的縮寫。其中第二個和第三個參數(flex-shrink、flex-basis)是可選參數。默認值爲「0 1 auto」。
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]