使用flex布局的容器(flex container),它內部的元素自動成為flex項目(flex item)。容器擁有兩根隱形的軸,水平的主軸(main axis),和豎直的交叉軸。主軸開始的位置,即主軸與右邊框的交點,稱為main start;主軸結束的位置稱為main end;交叉軸開始的位置稱為cross start;交叉軸結束的位置稱為cross end。item按主軸或交叉軸排列,item在主軸方向上占據的寬度稱為main size,在交叉軸方向上占據的寬度稱為cross size。
此外,需注意使用flex容器內元素,即flex item的float,clear、vertical-align屬性將失效。
1.flex-direction
決定主軸的方向,即項目排列的方向,有四個可能的值:row(默認)|row-reverse|column|column-reverse
row:主軸為水平方向,項目沿主軸從左至右排列
column:主軸為豎直方向,項目沿主軸從上至下排列
row-reverse:主軸水平,項目從右至左排列,與row反向
column-reverse:主軸豎直,項目從下至上排列,與column反向
如下代碼
<style> #container { display: flex; // height:200px; width: 240px; flex-wrap: wrap;
默認情況下,item排列在一條線上,即主軸上,flex-wrap決定當排列不下時是否換行以及換行的方式,可能的值nowrap(默認)|wrap|wrap-reverse
nowrap:自動縮小項目,不換行
wrap:換行,且第一行在上方
wrap-reverse:換行,第一行在下面
align-content: flex-start;
該屬性對單行彈性盒子模型無效。該屬性定義了當有多根主軸時,即item不止一行時,多跟主軸線作為一個整體在交叉軸(即非主軸)軸上的對齊方式。即:定義項目多個軸線在
交叉軸上的對齊方式;
align-content可能值含義如下(假設主軸為水平方向): flex-start:左對齊 flex-end:右對齊 center:居中對齊 space- between:兩端對齊 space-around:沿軸線均勻分布 stretch: 默認值。各行將根據其flex-grow值伸展以充分占據剩余空間。會拉伸容器內每行占用的空間,填充方式為給每行下方增加空白
該屬性對單行彈性盒子模型無效。拉伸所有行來填滿剩余空間。剩余空間平均的再分配給每一行。
align-items: center;
指定了當前Flex容器的每一行中的items項目在此行上在交叉軸上的對齊方式。指定的是項目在交叉軸上如何對齊;
指定了每一行內items相對彼此自身的在交叉軸上的對齊方式。可能的值有flex-start|flex-end|center|baseline|stretch,當主軸水平時,其具體含義為
flex-start:當items設置了高度時的默認值。頂端對齊 。(針對設置了高度的items)
flex-end:底部對齊。(針對items設置了高度)
center:豎直方向上居中對齊 (同上)
baseline:item第一行文字的底部對齊 (同上)
stretch:默認值。(針對沒有設置高度的items)當item都未設置高度,而且是單行時,item將和容器等高對齊。當item都設置了高度時,設置strentch與flex-start的效果
一樣。當items有的設置了高度
有的沒有設置高度,並且是單行。如下圖:
因為單行設置align-content無效,所以如果items有設置高度,並且align-items設置為align-items:center的效果如下圖

background-color: #8c8c8c; justify-content: center
決定多行item(把所有行作為一個整體)在主軸上的對齊方式,可能的值有flex-start(默認),flex-end,center,space-between,space-around。
當主軸沿水平方向時,具體含義為
flex-start:左對齊
flex-end:右對齊
center:居中對齊
space- between:兩端對齊
space-around:沿軸線均勻分布
} div > div { border: 2px solid #8c8c8c; width: 50px; } #item1 { background-color: #8cffa0; height: 30px; width: 20px } #item2 { background-color: #a0c8ff; height: 50px; width: 30px;} #item3 { background-color: #ffa08c; height: 40px; } #item4 { background-color: #ffff8c; height: 60px; } #item5 { background-color: #ff8cff; height: 70px; } #item6 { background-color: #8cffff; height: 50px; } </style> <div id="container"> <div id="item1"></div> <div id="item2"></div> <div id="item3"></div> <div id="item4"></div> <div id="item5"></div> <div id="item6"></div> <div id="item4"></div> <div id="item5"></div> <div id="item6"></div> <div id="item3"></div> </div>
設置父容器:
#container {
display: flex;
height:200px;
width: 240px;
flex-wrap: wrap;
align-content: flex-start;
align-items: center;
background-color: #8c8c8c;
justify-content: center
}
效果如下:
設置父容器
#container {
display: flex;
height:200px;
width: 240px;
flex-wrap: wrap;
align-content:center;
align-items: flex-start;
background-color: #8c8c8c;
justify-content: flex-end
}
設置父容器
#container {
display: flex;
height:200px;
width: 240px;
flex-wrap: wrap;
align-content:center;
align-items: center;
background-color: #8c8c8c;
justify-content: center
}
效果如下
item的屬性在item的style中設置。item共有如下六種屬性
item的屬性在item的style中設置。item共有如下六種屬性
1、order
order的值是整數,默認為0,整數越小,item排列越靠前,如下圖所示代碼如下
<div class="wrap"> <div class="div" style="order:4"><h2>item 1</h2></div> <div class="div" style="order:2"><h2>item 2</h2></div> <div class="div" style="order:3"><h2>item 3</h2></div> <div class="div" style="order:1"><h2>item 4</h2></div> </div>
效果圖為
.item { order: <integer>; }
2、flex-grow
定義了當flex容器有多余空間時,item是否放大。默認值為0,即當有多余空間時也不放大;可能的值為整數,表示不同item的放大比例,如
<div class="wrap"> <div class="div" style="flex-grow:1"><h2>item 1</h2></div> <div class="div" style="flex-grow:2"><h2>item 2</h2></div> <div class="div" style="flex-grow:3"><h2>item 3</h2></div> </div>
即當有多余空間時item1、item2、和item3以1:2:3的比例放大。
.item { flex-grow: <number>; /* default 0 */ }
如果所有項目的flex-grow
屬性都為1,則它們將等分剩余空間(如果有的話)。如果一個項目的flex-grow
屬性為2,其他項目都為1,則前者占據的剩余空間將比其他項多一倍。
3、flex-shrink
定義了當容器空間不足時,item是否縮小。默認值為1,表示當空間不足時,item自動縮小,其可能的值為整數,表示不同item的縮小比例。
.item { flex-shrink: <number>; /* default 1 */ }
如果所有項目的flex-shrink
屬性都為1,當空間不足時,都將等比例縮小。如果一個項目的flex-shrink
屬性為0,其他項目都為1,則空間不足時,前者不縮小。
負值對該屬性無效。
4、flex-basis
表示項目在主軸上占據的空間,默認值為auto。如下代碼
<div class="wrap"> <div class="div" style="flex-basis:80px"><h2>item 1</h2></div> <div class="div" style="flex-basis:160px"><h2>item 2</h2></div> <div class="div" style="flex-basis:240px"><h2>item 3</h2></div> </div>
其效果圖為
flex-basis
屬性定義了在分配多余空間之前,項目占據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認值為auto
,即項目的本來大小。
.item { flex-basis: <length> | auto; /* default auto */ }
它可以設為跟width
或height
屬性一樣的值(比如350px),則項目將占據固定空間。
5、flex
flex屬性是flex-grow、flex-shrink和flex-basis三屬性的簡寫總和。
flex
屬性是flex-grow
, flex-shrink
和 flex-basis
的簡寫,默認值為0 1 auto
。后兩個屬性可選。
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
該屬性有兩個快捷值:auto
(1 1 auto
) 和 none (0 0 auto
)。
建議優先使用這個屬性,而不是單獨寫三個分離的屬性,因為瀏覽器會推算相關值。
6、align-self
align-self屬性允許item有自己獨特的在交叉軸上的對齊方式,它有六個可能的值。默認值為auto
auto:和父元素align-self的值一致
flex-start:頂端對齊
flex-end:底部對齊
center:豎直方向上居中對齊
baseline:item第一行文字的底部對齊
stretch:當item未設置高度時,item將和容器等高對齊
align-self
屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items
屬性。默認值為auto
,表示繼承父元素的align-items
屬性,如果沒有父元素,則等同於stretch
。
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
該屬性可能取6個值,除了auto,其他都與align-items屬性完全一致。