你真的理解 flex 佈局嗎?

網頁佈局(layout)是CSS的一個重點應用。

佈局的傳統解決方案,基於盒狀模型,依賴 display屬性 + position屬性 + float屬性。它對於那些特殊佈局很是不方便,好比,垂直居中就不容易實現。
css

2009年,W3C提出了一種新的方案—-Flex佈局,能夠簡便、完整、響應式地實現各類頁面佈局。目前,它已經獲得了全部瀏覽器的支持,這意味着,如今就能很安全地使用這項功能。
web

Flex佈局將成爲將來佈局的首選方案。本文介紹Flex佈局的語法。瀏覽器

1、Flex佈局簡介

Flex英文爲 flexiable box,翻譯爲彈性盒子,Flex佈局即彈性佈局。
安全

Flex佈局爲盒子模型提供了很大的靈活性,任何一個容器均可以指定爲Flex佈局,設置方法爲:bash

.box{
  display: flex;
}複製代碼

行內元素也可使用Flex佈局。ide

.box{
  display: inline-flex;
}複製代碼

Webkit內核的瀏覽器,必須加上-webkit前綴。佈局

.box{
  display: -webkit-flex; /* Safari */
  display: flex;
}複製代碼

注意,設爲Flex佈局之後,子元素的float、clear和vertical-align屬性將失效,(並且能夠嵌套使用。)flex

2、基本概念

採用Flex佈局的元素,稱爲Flex容器(flex container),簡稱」容器」。它的全部子元素自動成爲容器成員,稱爲Flex項目(flex item),簡稱」項目」。ui

容器默認存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫作main start,結束位置叫作main end;交叉軸的開始位置叫作cross start,結束位置叫作cross end。spa

項目默認沿主軸排列。單個項目佔據的主軸空間叫作main size,佔據的交叉軸空間叫作cross size。

3、容器的屬性

flex-direction;
flex-wrap;
flex-flow;
justify-content;
align-items;
align-content;複製代碼

3.1 flex-direction屬性

flex-direction屬性決定主軸的方向(即項目的排列方向)。它可能有四個值:

.box {
  flex-direction: row | row-reverse | column | column-reverse;
}複製代碼
flex-direction : row(默認值),主軸爲水平方向,起點在左端。效果:

flex-direction : row-reverse,主軸爲水平方向,起點在右端。效果:

flex-direction : column,主軸爲垂直方向,起點在上沿。效果:


flex-direction : column-reverse,主軸爲垂直方向,起點在下沿。效果:


完整代碼 :

HTML 部 分:
<div class="box">    
    <span>love1</span>    
    <span>love2</span>    
    <span>love3</span>    
    <span>love4</span></div>
CSS 部分:
<style>    
    .box{        
        display: flex;        
        display: -webkit-flex;        
        /*水平方向,左端對齊*/        
        flex-direction: row;        
        /*水平方向,右端對齊*/        
        /* flex-direction: row-reverse; */        
        /*垂直方向,頂部對齊*/        
        /* flex-direction: column; */        
        /*垂直方向,底部對齊*/        
        /* flex-direction: column-reverse; */        
        background: #999; 
        width: 100%;    
    }        
    .box span{            
        margin: 10px 10px;            
        padding: 10px;            
        background: #ff0; 
        width: 50px;        
    }    
</style>
複製代碼

3.2 flex-wrap屬性

默認狀況下,項目都排在一條線(又稱」軸線」)上。flex-wrap屬性定義,若是一條軸線排不下,如何換行。它可能取三個值。

.box{
  flex-wrap: nowrap | wrap | wrap-reverse;
}複製代碼

(1)當設置爲 flex-wrap : nowrap(默認),效果(不換行,默認會縮放):


(2)flex-wrap : wrap,換行,第一行在上方。


(3)flex-wrap : wrap-reverse,換行,第一行在下方。


完整代碼:

<style>        
    .box{            
        display: flex;            
        display: -webkit-flex;            
        /*不換行,默認*/            
        /* flex-wrap: nowrap; */            
        /*換行*/            
        /* flex-wrap: wrap; */            
        /*換行,第一行在下方*/            
        /* flex-wrap: wrap-reverse; */            
        background: #999; 
        width: 100%;        
    }        
    .box span{           
        margin: 10px 10px;            
        padding: 10px;            
        background: #ff0; 
        width: 50px;        
    }    
</style>

HTML 代碼:    
<div class="box">        
    <span>love1</span>        
    <span>love2</span>        
    <span>love3</span>        
    <span>love4</span>        
    <span>love5</span>        
    <span>love6</span>        
    <span>love7</span>        
    <span>love8</span>   
</div> 
複製代碼

3.3 flex-flow 屬性

flex-flow 屬性是 flex-direction 屬性和 flex-wrap 屬性的簡寫形式,默認值爲 row nowrap。

.box {
  flex-flow: <flex-direction> <flex-wrap>;
}複製代碼

3.4 justify-content屬性

justify-content屬性定義了項目在主軸上的對齊方式。

.box {
  justify-content: flex-start | flex-end | center | space-between | space-around;
}複製代碼

它可能取5個值,具體對齊方式與軸的方向有關。下面假設主軸爲從左到右。

justify-content : flex-start(默認值),左對齊


justify-content : flex-end,右對齊


justify-content : center,居中


justify-content : space-between,兩端對齊,項目之間的間隔都相等。


justify-content : space-around,每一個項目兩側的間隔相等。因此,項目之間的間隔比項目與邊框的間隔大一倍。


完整代碼:

CSS代碼:
<style>        
    .box{            
        display: flex;            
        display: -webkit-flex;            
        /*默認,項目左對齊*/            
        /* justify-content: flex-start; */            
        /*項目右對齊*/            
        /* justify-content: flex-end; */            
        /*項目居中對齊*/            
        /* justify-content: center; */            
        /*項目兩端對齊*/            
        /* justify-content: space-between; */            
        /*每一個項目兩側的間隔相等*/            
        justify-content: space-around;            
        background: #999; 
        width: 100%;        }        
    .box span{            
        margin: 10px 10px;            
        padding: 10px;            
        background: #ff0; 
        width: 50px;        
    }    
</style>
HTML代碼:
<div class="box">        
    <span>love1</span>        
    <span>love2</span>        
    <span>love3</span>        
    <span>love4</span>        
    <span>love5</span>        
    <span>love6</span>        
    <span>love7</span>        
    <span>love8</span>    
</div>
複製代碼


3.5 align-items屬性

align-items屬性定義項目在交叉軸上如何對齊。

.box {
  align-items: flex-start | flex-end | center | baseline | stretch;
}複製代碼

它可能取5個值。具體的對齊方式與交叉軸的方向有關,下面假設交叉軸從上到下。

align-items : flex-start,交叉軸的起點對齊。


align-items : flex-end,交叉軸的終點對齊。


align-items : center,交叉軸的中點對齊。


align-items : baseline,項目的第一行文字的基線對齊。


align-items : stretch(默認值),若是項目未設置高度或設爲auto,將佔滿整個容器的高度。


完整代碼:

<style type="text/css">
.box{
    display: flex;
    display: -webkit-flex;
    /*縱軸的頂部對齊*/
    /*align-items: flex-start;*/
    /*縱軸的底部對齊*/
    /*align-items: flex-end;*/
    /*縱軸的中點對齊*/
    /*align-items: center;*/
    /*項目的第一行文字的基線對齊*/
    /*align-items: baseline;*/
    /*默認對齊方式,若是項目未設置高度或設爲auto,將佔滿整個容器的高度*/
    align-items: stretch;
    background: #999;
    width: 100%;
}
.box span{
    margin: 10px 10px;
    padding: 10px;
    background: #ff0;
    width: 50px;
}
.box span:nth-of-type(2n){
    height: 80px;
    padding-top: 20px;
}
</style>
<div class="box">
    <span>love1</span>
    <span>love2</span>
    <span>love3</span>
    <span>love4</span>
    <span>love5</span>
    <span>love6</span>
    <span>love7</span>
    <span>love8</span>
</div>複製代碼

3.6 align-content屬性

align-content 屬性定義了多根軸線的對齊方式。若是項目只有一根軸線,該屬性不起做用 (即須要設置容器的 flex-wrap 屬性值爲 wrap )(爲了讓效更加明顯,我設置了容器的高度)

.box {
  align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}複製代碼

該屬性可能取6個值。

align-content : flex-start,與交叉軸的起點對齊。


align-content : flex-end,與交叉軸的終點對齊。


align-content : center,與交叉軸的中點對齊。


align-content : space-between,與交叉軸兩端對齊,軸線之間的間隔平均分佈。


align-content : space-around,每根軸線兩側的間隔都相等。因此,軸線之間的間隔比軸線與邊框的間隔大一倍。


align-content : stretch(默認值),軸線佔滿整個交叉軸。


完整代碼:

CSS 代碼:
<style>        
    .box{            
        display: flex;            
        display: -webkit-flex;
        //若是項目只有一根軸線,該屬性不起做用 (即須要設置容器的 flex-wrap 屬性值爲 wrap )
        flex-wrap: wrap;
        /*與縱軸的頂部對齊*/            
        /*align-content: flex-start;*/ 
           
        /*與縱軸的底部對齊*/           
        /*align-content: flex-end;*/   
         
        /*與縱軸的中點對齊*/            
        /*align-content: center;*/   
         
        /*與縱軸兩端對齊*/            
        /*align-content: space-between;*/ 
           
        /*每根軸線兩側的間隔都相等*/            
        align-content: space-around;     
       
        /*默認值,軸線佔滿整個交叉軸默認值,*/            
        /* align-content: stretch; */   
         
        background: #999; 
        width: 600px;            
        height: 300px;        
    }        
    .box span{            
        margin: 10px 10px;            
        padding: 10px;            
        background: #ff0; 
        width: 50px;        
    }    
</style>

HTML 代碼:
<div class="box">       
    <span>love1</span>        
    <span>love2</span>        
    <span>love3</span>        
    <span>love4</span>        
    <span>love5</span>        
    <span>love6</span>        
    <span>love7</span>        
    <span>love8</span>    
</div>複製代碼


4、項目的屬性

如下6個屬性設置在項目上。

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

4.1 order屬性

order屬性定義項目的排列順序。數值越小,排列越靠前,默認爲0。

.item {
  order: <integer>;
}複製代碼

以下爲第1個設置order屬性爲10,第2個設置order屬性爲-1,第5個設置order屬性爲-10,效果以下

代碼:

CSS:
<style>        
    .box{            
        display: flex;           
        display: -webkit-flex;            
        background: #999; 
    }        
    .box span{            
        margin: 10px 10px;            
        padding: 10px;            
        background: #ff0; 
    }        
    .box span:nth-of-type(1){            
        order: 10;        
    }        
    .box span:nth-of-type(2){            
        order: -1;        
    }        
    .box span:nth-of-type(5){            
        order: -10;        
    }   
</style>

HTML 代碼:
<div class="box">        
    <span>love1</span>        
    <span>love2</span>        
    <span>love3</span>        
    <span>love4</span>        
    <span>love5</span>    
</div>
複製代碼


4.2 flex-grow屬性

flex-grow屬性定義項目的放大比例,主要在父元素的寬度大於子元素的寬度之和時候起做用,它定義子元素如何分配父元素的剩餘寬度,默認爲0,這個時候不索取父元素的寬度。

.item {
  flex-grow: <number>; /* default 0 */
}複製代碼

以下,給第1個子元素設置 flex-grow 屬性值爲1,第2個子元素設置 flex-grow 屬性值爲2,則父元素的剩餘寬度會被分紅三等分,分別添加給第1個第2個子元素,效果以下:


代碼:

CSS 代碼:
<style>        
    .box{            
        display: flex;           
        display: -webkit-flex;            
        background: #999; 
    }        
    .box span{            
        margin: 10px 10px;            
        padding: 10px;            
        background: #ff0; 
        width: 50px;        
    }        
    .box span:nth-of-type(1){            
        flex-grow: 1;        
    }        
    .box span:nth-of-type(2){            
        flex-grow: 2;        
    }    
</style>

HTML 代碼:
<div class="box">        
    <span>love1</span>        
    <span>love2</span>        
    <span>love3</span>        
    <span>love4</span>        
    <span>love5</span>    
</div>
複製代碼

例如:以上面的爲例子,假設父元素的寬度爲 1000px ,每一個子元素的寬度爲100px,則還剩餘500px 的寬度,第1個子元素 flex-grow 值爲 1,第2個子元素 flex-grow 值爲 2,則會把500px分紅三等分,第1個子元素增長500乘以1/3px的寬度,第2個子元素增長500乘以2/3px的寬度


4.3 flex-shrink屬性

flex-shrink 屬性定義了項目的縮小比例,默認爲1,即若是空間不足,該項目將縮小。

.item {
  flex-shrink: <number>; /* default 1 */
}複製代碼

若是全部項目的flex-shrink屬性都爲1,當空間不足時,都將等比例縮小。若是一個項目的flex-shrink屬性爲0,其餘項目都爲1,則空間不足時,前者不縮小。

負值對該屬性無效。

4.4 flex-basis 屬性

flex-basis屬性定義了在分配多餘空間以前,項目佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的默認值爲auto,即項目的原本大小。

.item {
  flex-basis: <length> | auto; /* default auto */
}複製代碼

它能夠設爲跟width或height屬性同樣的值(好比350px),則項目將佔據固定空間。

4.5 flex屬性

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)。

建議優先使用這個屬性,而不是單獨寫三個分離的屬性,由於瀏覽器會推算相關值。

4.6 align-self屬性

align-self屬性容許單個項目有與其餘項目不同的對齊方式,可覆蓋align-items屬性。默認值爲auto,表示繼承父元素的align-items屬性,若是沒有父元素,則等同於stretch。

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}複製代碼

該屬性可能取6個值,除了auto,其餘都與align-items屬性徹底一致。


代碼:

CSS 代碼:
<style>        
    .box{            
        display: flex;            
        display: -webkit-flex;            
        background: #999; 
        height: 300px;            
        align-items: flex-start;        
    }        
    .box span{            
        margin: 10px 10px;           
        padding: 10px;            
        background: #ff0; 
    }        
    .box span:nth-of-type(3){            
        align-self: flex-end;        
    }    
</style>

HTML 代碼:
<div class="box">        
    <span>love1</span>        
    <span>love2</span>        
    <span>love3</span>        
    <span>love4</span>        
    <span>love5</span>    
</div>複製代碼
相關文章
相關標籤/搜索