Flex的全稱是Flexible Box,意為彈性佈局,用來為盒模型提供最大的靈活性。
Flex包含的屬性有很多,每個屬性又包含了許多不同意義的屬性值···然而在實際開發中,能被我們臨幸的可能也只是那麼幾個:
{
display: flex;
justify-content: center|flex-start...;
align-items: center|flex-start...;
flex-grow: auto...;
}
複製程式碼
上面是一本正經的分割線!
一、Flex簡介
任何一個容器都可以通過設定 display 為 flex/inline-flex 將其指定為Flex佈局。對於設定了Flex佈局的容器,子元素的 float、clear、vertical-align 屬性將失效;但是,如果對這些子元素設定 position 定位,那麼Flex屬性的作用會失效,一張圖說明他們的作用權重:

![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/2a6cd01479e886abf4007ccc5ed9e21440193a0af94e087371f01b3003632f65.jpg)
Flex佈局元素分為Flex容器和Flex專案,因而有Flex容器屬性和Flex專案屬性的區分。
二、Flex容器屬性
1. Flex的容器屬性包括:
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
1.1 flex-direction
該屬性定義了主軸的方向,即專案的排列方向。value的取值包括:row | row-reverse | column | column-reverse。其中 row 是預設值,表示水平方向排列(起點在左端); column 表示垂直方向(起點在頂端);帶 -reverse 的值則表示反方向。用法及其效果圖如下:
示例程式碼:
<div class="flex-box">
<div class="flex-item">item1</div>
<div class="flex-item">item2</div>
<div class="flex-item">item3</div>
</div>
複製程式碼
.flex-box{
display: flex; /*定義為flex佈局*/
flex-direction:row-reverse; /*主軸為水平方向,起點在右端*/
background:orange;
}
.flex-item{
margin:10px;
height:100px;
width:100px;
background: purple;
color:#fff;
}
複製程式碼
示例效果:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/3019ac248a9324b3f516d3ddfdc257a1c788d38feefd7d019f674c65c6abc6c3.png)
1.2 flex-wrap屬性
該屬性定義專案是否換行以及如何換行。在預設情況下,專案都排在一條軸線上,如果一條軸線排不下,瀏覽器就根據這個屬性的值對專案排列做相應調整。value的取值包括:nowrap | wrap | wrap-reverse,其中,nowrap 是預設值,不換行。用法及其效果圖如下: 示例程式碼:
.flex-box{
flex-wrap: wrap;
}
複製程式碼
示例效果:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/baf35d3f3034aa5c7a3760c47f563062f94b5ba98403bea3c213823c8eb9f5e4.png)
1.3 flex-flow屬性
該屬性是 flex-direction 和 flex-wrap 的簡寫形式,預設值為row nowrap。使用方式如下: 示例程式碼::
.flex-box{
flex-flow:colunm wrap;
}
複製程式碼
1.4 justify-content屬性
該屬性定義了專案在主軸(main axis)上的對齊方式,value的取值包括:
- flex-start:預設值。軸的起始端對齊(main/cross start)
- flex-end:軸的終點端
- center:居中
- space-between:兩端對齊,專案之間的間隔都相等。
- space-around:每個專案兩側的間隔相等。那麼專案之間的間隔就是專案與邊框之間的間隔的兩倍。
用法及效果如下:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/a2cf7ab4f8e270155377ddaead6322c996f2c7085d4ebb03246652a249121fe4.png)
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/19799a86bf6946e2ff45e823c08b8a57abd351cacb693f42d27507932e93676c.png)
1.5 align-items屬性
該屬性定義專案在交叉軸(cross axis)上的對齊方式。value的取值包括:
- flex-start:交叉軸的起點對齊
- flex-end:交叉軸的終點對齊
- center:居中
- baseline:以專案的第一行文字的基線對齊
- stretch:預設值,如果專案未設定高度或設為auto,那麼專案將佔滿整個容器的高度。
效果如下:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/0e99c4c89f5919078da44d1b90c2e2754b3ed5578cdd756b47f268ccf208a222.png)
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/3473ed814f7a85a7ae720830ec3219b74336a0e290c2c443319f2054173d4509.png)
1.6 align-content屬性
該屬性定義了多個軸線的對齊方式。value的取值包括:
- flex-start:與交叉軸的起點對齊
- flex-end:與交叉軸的終點對齊
- center:交叉軸上居中
- space-between:交叉軸上兩端對齊,軸線之間的間隔兩端分佈
- space-around:每個軸線兩側的間隔都相等。那麼,軸線之間的間隔是軸線與邊框之間間隔的兩倍
- stretch:預設值,軸線佔滿整個交叉軸
咦!怎麼都這麼熟悉呢?對比原來發現這個屬性的取值是跟前兩個屬性的取值有很大相似的。但它們其的效果還是有區別的。看圖:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/0e40e2abd91fc7174469a15731ea0627c524f5f2085d793f829e8d33b8765f2a.png)
三、Flex專案屬性
1. Flex的專案屬性包括:
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
1.1 order屬性
該屬性定義專案的排列順序,數值越小,排列越靠前,預設值為0。
示例程式碼:
<div class="flex-box">
<div class="flex-item">item1</div>
<div class="flex-item">item2</div>
<div class="flex-item">item3</div>
</div>
複製程式碼
.flex-box{
background:orange;
display: flex; /*定義為flex佈局*/
}
.flex-item{
margin:10px;
height:100px;
width:100px;
background: purple;
color:#fff;
}
div:first-child{
order:0; /*item1的序號為0*/
}
div:nth-child(2){
order:-1;
}
div:last-child{
order:2;
}
複製程式碼
示例效果:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/58ef6a5b3fbbcbc543e0ad0db96a4705f0ceb5adaa072b8e036adf2fb5ebbc83.png)
1.2 flex-grow屬性
該屬性定義專案的放大比例,預設為0,即不作任何的放大。flex容器下的專案是根據這個值的比例對容器的剩餘空間進行瓜分的。使用效果如下:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/55df32a60032f43f081705acb2bdb3e656bcf6559b6965f9dabdd2967731dc66.png)
1.3 flex-shrink屬性
該屬性定義了專案的縮小比例,預設為1,即專案縮小。使用效果如下:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/c24b36b5a1bc571f0677a5f2f3361a14707dde61871a8d0f9f29688c0c443651.png)
1.4 flex-basis屬性
該屬性定義了在分配多餘空間之前,專案佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸(main asix)是否有多餘空間。它的預設值為auto,即專案的原本大小。它換可以設定為跟width屬性一樣的值(eg: 100px),即專案佔據固定空間(容器寬度不夠自動被壓縮)。使用效果如下:
![[續更]一起來擼一下Flex佈局裡面的那些屬性](https://i.iter01.com/images/cc242c8e1884384dc1de0f6308ac211dc48a85cc0db812407e0383b96c2b97b5.png)
1.5 flex屬性
該屬性是前三個屬性:flex-grow、flex-shrink、flex-basis 的簡寫形式。預設值為0 1 auto,即不放大,自動縮小,後面兩個屬性值是可選項。該屬性有兩個快捷鍵值:auto(0 1 auto),none(0 0 auto)。建議優先使用這個屬性,而不是單獨寫三個分離的屬性。
1.6 align-self屬性
該屬性允許單個專案有與其他專案不一樣的對齊方式。可覆蓋作用在flex容器上的align-items屬性。預設值為auto,表示繼承父元素align-items屬性,如果沒有父元素,則等同stretch。value的取值包括:auto、flex-start、flex-end、end、baseline、stretch。該屬性的取值除了auto之外,其他屬性作用在該專案上的效果跟align-items作用在專案父元素(flex容器)上的效果是一樣的,唯一不同的是:align-self僅對使用了該屬性的專案產生效果,align-items是對所有的專案產生效果。
天下武功,唯快不破。Flex的優秀在於它的快捷,開發過程中使用Flex佈局可以輕鬆地達到你想要的佈局效果,方便快捷。嘗試它並愛上它~