在介紹flex之前淹遵,先說一個面試時關(guān)于CSS布局常提到的問題咽安,也就是三欄布局耕捞,左右兩邊固定衔掸,中間一欄自適應(yīng)屏幕大小,如下效果:
以前常見的做法就是將左右兩邊絕對定位俺抽,定位到相應(yīng)的位置敞映,中間設(shè)置width:100%;然后在設(shè)置對應(yīng)的padding-left和padding-right值×赘現(xiàn)在css3中提供了flex屬性振愿,也就是彈性盒子布局,這樣就很好地處理上面的問題弛饭,具體代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>利用flex固縮固布局</title>
<style>
*{
margin: 0;
padding-right: 0;
}
header{
width: 100%;
height: 200px;
margin-top: 10px;
display: flex;
display: -webkit-flex;
}
header div{
height: 200px;
border: 1px solid red;
margin: 0px 10px;
}
header div:nth-child(1){
width: 100px;
}
header div:nth-child(2){
flex:1;
-webkit-flex:1;
}
header div:nth-child(3){
width: 100px;
}
</style>
</head>
<body>
<header>
<div>width:100px;</div>
<div>寬度自適應(yīng)</div>
<div>width:100px;</div>
</header>
</body>
</html>
上面代碼中沒有涉及到一點定位的內(nèi)容冕末,僅僅在父容器中設(shè)置了display:flex;屬性,并在子元素中設(shè)置flex:1即可侣颂。非常的方便档桃。既然flex這么強(qiáng)大,那么接下來就介紹一下flex的具體使用方法憔晒。
一藻肄、flex容器
通過上面的代碼蔑舞,我們能發(fā)現(xiàn):要使用flex布局,需要設(shè)計到兩層嘹屯,外面一層叫做Flex容器(flex container),簡稱”容器”州弟。它的所有子元素自動成為容器成員钧栖,稱為Flex項目(flex item),簡稱”項目”婆翔。下面是一個flex布局的基本概念介紹:
容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)拯杠。主軸的開始位置(與邊框的交叉點)叫做main start,結(jié)束位置叫做main end浙滤;交叉軸的開始位置叫做cross start,結(jié)束位置叫做cross end气堕。項目默認(rèn)沿主軸排列纺腊。
大致了解了之后,主要還是怎么用茎芭。flex容器有以下六個屬性:
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
下面逐個介紹一下這六個屬性的作用:
1. flex-direction
flex-direction屬性決定主軸的方向(即項目的排列方向)揖膜。
flex-direction: row | row-reverse | column | column-reverse;
四個值分別代表:
- row(默認(rèn)值):主軸為水平方向,起點在左端梅桩。
- row-reverse:主軸為水平方向壹粟,起點在右端。
- column:主軸為垂直方向宿百,起點在上沿趁仙。
-
column-reverse:主軸為垂直方向,起點在下沿垦页。
效果分別對應(yīng)如下:
2. flex-wrap
flex-wrap屬性定義雀费,如果一條軸線排不下,如何換行痊焊。有三個屬性值盏袄,默認(rèn)情況下是wrap。
flex-wrap: nowrap | wrap | wrap-reverse;
分別表示不換行薄啥、換行以及反轉(zhuǎn)換行辕羽,效果分別如下:
3. flex-flow
flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,默認(rèn)值為row nowrap垄惧。這里就不再具體測試刁愿。
4. justify-content
justify-content屬性定義了項目在主軸上(即相當(dāng)于X軸)的對齊方式。一共有五個屬性值:
justify-content: flex-start | flex-end | center | space-between | space-around;
分別表示:左對齊到逊、右對齊酌毡、居中克握、兩端對齊、每個項目兩側(cè)的間隔相等枷踏。以下是對應(yīng)的效果:
5. align-items
align-items屬性定義項目在交叉軸上(即Y軸上)如何對齊菩暗。也有五個屬性值:
align-items: flex-start | flex-end | center | baseline | stretch;
分表表示:上對齊、下對齊旭蠕、居中對齊停团、項目的第一行文字的基線對齊、如果項目未設(shè)置高度或設(shè)為auto掏熬,將占滿整個容器的高度(默認(rèn)值)佑稠,下面是對應(yīng)的效果圖:
6. align-content
align-content屬性定義了多根軸線的對齊方式。如果項目只有一根軸線旗芬,該屬性不起作用舌胶。該屬性定義多跟軸線在Y軸上的對齊方式,與align-items有點類似疮丛。其有以下六個屬性值:
- flex-start:與交叉軸的起點對齊幔嫂。
- flex-end:與交叉軸的終點對齊。
- center:與交叉軸的中點對齊誊薄。
- space-between:與交叉軸兩端對齊履恩,軸線之間的間隔平均分布。
- space-around:每根軸線兩側(cè)的間隔都相等呢蔫。所以切心,軸線之間的間隔比軸線與邊框的間隔大一倍。
- stretch(默認(rèn)值):軸線占滿整個交叉軸片吊。
二绽昏、flex item
介紹完了flex容器,介紹就要介紹容器里的成員了俏脊,F(xiàn)lex項目(flex item)而涉,簡稱”項目”。這里需要注意的是:設(shè)為Flex布局以后联予,子元素的float啼县、clear和vertical-align屬性將失效。
flex項目有以下六個屬性:
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
以下對每一個分別進(jìn)行介紹:
1. order
order屬性定義項目的排列順序沸久。數(shù)值越小季眷,排列越靠前,默認(rèn)為0卷胯。有了這個屬性子刮,可以調(diào)整在HTML中出現(xiàn)的順序。
order: <integer>;
2. flex-grow
flex-grow屬性定義項目的放大比例,默認(rèn)為0挺峡,即如果存在剩余空間葵孤,也不放大。
flex-grow: <number>; /* default 0 */
如果一個項目的flex-grow屬性為2橱赠,另一個項目都為1尤仍,則前者占據(jù)的剩余空間將比后一項多一倍。如下所示:
3. flex-shrink
flex-shrink屬性定義了項目的縮小比例狭姨,默認(rèn)為1宰啦,即如果空間不足,該項目將縮小饼拍。
flex-shrink: <number>; /* default 1 */
如果所有項目的flex-shrink屬性都為1赡模,當(dāng)空間不足時,都將等比例縮小师抄。如果一個項目的flex-shrink屬性為0漓柑,其他項目都為1,則空間不足時叨吮,前者不縮小辆布。
4. flex-basis
flex-basis屬性定義了在分配多余空間之前,項目占據(jù)的主軸空間(main size)挤安。類似于設(shè)置了width屬性谚殊。
5. flex
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫丧鸯,默認(rèn)值為0 1 auto蛤铜。后兩個屬性可選。
6. align-self
align-self屬性允許單個項目有與其他項目不一樣的對齊方式丛肢,可覆蓋align-items屬性围肥。默認(rèn)值為auto,表示繼承父元素的align-items屬性蜂怎,如果沒有父元素穆刻,則等同于stretch。
align-self: auto | flex-start | flex-end | center | baseline | stretch;
上面六個取值中杠步,除了auto氢伟,其他值與align-items屬性完全一致。這里就不一一介紹了幽歼。
三朵锣、flex的應(yīng)用
利用flex,我們可以完成很多布局甸私,而且不需要太多的代碼诚些。開頭的圣杯布局就是一種典型的示例,下面我們利用flex來實現(xiàn)流式布局皇型,并且加上簡單的媒體查詢诬烹,使其在移動端和PC顯示結(jié)構(gòu)不一樣砸烦,程序如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>flex實現(xiàn)流式布局</title>
<style type="text/css">
*{ margin: 0; padding:0;}
.container{
margin: 20px 20px;
padding: 10px 10px;
display: flex;
flex-wrap:wrap;
border: 1px solid #ADAAAA;
}
.item{
flex:0 0 40%;
height: 100px;
margin:20px 5%;
box-sizing: border-box;
border: 1px solid red;
}
@media (min-width:960px){
.item{
flex:0 0 20%;
height: 100px;
margin:20px 2.5%;
box-sizing: border-box;
border: 1px solid red;
}
}
</style>
</head>
<body>
<div class="container">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</body>
</html>
在PC端顯示結(jié)果如下:
在移動端顯示效果如下: