CSS3 Flex 彈性盒子布局

前言

前幾天寫了一篇關於 CSS3 Grid 格線布局,覺的應該也要也來搞明白 CSS3 Flex 彈性盒子布局。前情提要,其實對於 flex 和 grid 布局,共同之處就是它們都有外部容器以及內元素的概念。

正文

既然都知道 flex 布局有分外部容器跟內元素,那不妨先來看看都有哪些屬性!

flex 屬性一總攬

外部容器

屬性 描述
display 指明布局系統
flex-direction 內元素排列方向
flex-wrap 內元素超過範圍是否換行
justify-content 水平對齊方式(主軸軸對齊方式)
align-items 單行垂直對齊方式(交錯軸對齊方式)
align-content 多行垂直對齊方式(交錯軸對齊方式)

內元素

屬性 描述
order 單個元素的排列順序
align-self 該元素的垂直對齊方式
flex-grow 該元素佔用容器剩餘的比例
flex-shrink 該元素壓縮比例
flex-basis 該元素的基準值

有了初步概念,接下來一一來看每個屬性的效果以及 flex 布局的整體概念吧!

外部容器

display

這個屬性相信不用多說了,用意就只是指定布局系統而已。

.box {
    
    
    display: flex
}

axis (主軸)

在 flex 布局的世界裡,首先要知道,有兩個軸,分別是主軸 (main-axis) 和交錯軸 (cross-axis)。看看下面的圖就可以清楚理解了:

flex-direction

flex-direction 就是用來改變上面軸線的方向。有四種取值。

.box {
    
    
    display: flex;
    flex-direction: row | row-reverse | column | column-reverse 
}

flex-direction: row

flex-direction: row-reverse

flex-direction: column

flex-direction: column-reverse

flex-wrap

flex-wrap 用於如果葉面寬度不夠的時候,是否換行。分為換行,不換行,換行後反轉。

.box {
    
    
    display: flex;
    flex-wrap: wrap | nowrap | wrap-reverse
}

flex-flow

flex-flow 就只是把 flex-direction 跟 flex-wrap 寫在一起而已。

.box {
    
    
    display: flex;
    flex-flow: <flex-direction> || <flex-wrap>
}

justify-content

這個屬性可以理解為內元素對於主軸的對齊設定。這個屬性有六個取值。

.box {
    
    
    display: flex;
    justify-content: flex-start | flex-end | center | space-around | space-between | space-evenly
}

接著來看看各自的效果吧!

flex-start : 靠左對齊

flex-end : 靠右對齊

center : 置中對齊

下面三個都是分散對齊,只不過有些差別。

space-around : 左右邊有留間距,最旁邊的間距為內間距的一半

space-between : 左右邊不留間距

space-evenly : 所有間距一致

align-items

這個屬性可以理解為內元素對於交錯軸的對齊設定。這個屬性有五個取值。

.box {
    
    
    display: flex;
    align-items: flex-start | flex-end | center | baseline | stretch
}

接著來看看各自的效果吧!

flex-start : 靠上對齊

flex-end : 靠下對齊

center : 置中對齊

stretch : 元素裡的內容撐滿對齊

baseline : 元素裡的文字內容對齊 flex 基準線 (都在同個高度)

align-content

這個屬性其實就是 align-items 的多行版本。如果元素只有單行是不會起效果的。這個屬性有六個取值。

.box {
    
    
    display: flex;
    align-content: flex-start | flex-end | center | space-between | space-around | stretch
}

flex-start : 緊密靠上對齊

flex-end : 緊密靠下對齊

center : 緊密置中對齊

space-between : 分散對齊(上下不留間距)

space-around : 分散對齊(上下有留間距)

stretch : 所有元素撐滿上下邊

內元素

order

這個屬性可以重新定義內元素的排列順序,順序會依據數值的大小排列。默認值為 0。本人一開始覺得有點抽象,來看例子。

沒有設定 order 前:

設定 order:

.box-3 {
    
    
    order: -1;
}

.box-4 {
    
    
    order: 1;
}

設定 order 之後:

所以可以清楚的看到,order 會根據大小,由小到大按照 flex-direction 的方向排列。而且,order 也可以為負。

align-self

這個屬性可以允許你針對任意內元素,更改它相對於交錯軸的對齊方式(相對於主軸則沒辦法更改)。所以這個屬性跟 align-items 一樣,有同樣的屬性。

.box {
    
    
    align-self: flex-start | flex-end | center | baseline | stretch
}

flex-start : 靠上對齊

flex-end : 靠下對齊

center : 置中對齊

stretch : 撐滿上下邊

baseline : 基準線對齊

.box-1 {
    
    
    align-self: flex-start;
}

.box-2 {
    
    
    align-self: flex-end;
}

.box-3 {
    
    
    align-self: center;
}

flex-grow

這個屬性是一個數值,代表任意元素的伸展性。是在如果還有剩餘空間的話,才有伸展的可能性。數值越大的元素會伸展的更多一些,也就是說,會佔據整個區塊的更大比例。默認值為 0。看看下面的效果也許更清楚些。

沒有設定 flex-grow 前:

設定 flex-grow:

.box-2 {
    
    
    flex-grow: 1
}

.box-3 {
    
    
    flex-grow: 2
}

設定 flex-grow 後:

flex-shrink

這個屬性是一個數值,代表任意元素的收縮性。如果外部容器空間不夠容納所有內元素,又不能「超出去」,那 flex 布局就要適當收縮某些元素啦!所以 flex-shrink 的默認值為 1,也就是說,如果你沒設定,其實 flex 布局也會幫你適當收縮各個內元素。而 flex-shrink 目的就在於,你想要針對特定元素做不一樣的收縮比例。值越大,收縮比例就越多。

這邊設定的外部容器寬度只有 600px。但 box1, box2, box3 寬度分別設定為 100px, 300px, 500px。顯然,外部容器無法正常容納所有內元素。

沒有設定 flex-shrink 前:

設定 flex-shrink:

.box-1 {
    
    
    width: 100px;
}

.box-2 {
    
    
    width: 300px;
    flex-shrink: 2;
}

.box-3 {
    
    
    width: 500px;
    flex-shrink: 3;
}

設定 flex-shrink 後:

flex-basis

元素的基準值,可使用不同的單位值。

flex

flex 就是把 flex-grow, flex-shrink, flex-basis 寫在一起而已。

.box {
    
    
    flex: <flex-grow> || <flex-shrink> || <flex-basis>
}

結語

CSS3 Flex 其實已經是非常主流的布局方式,且現在許多 CSS 框架也都是使用 Flex 來作網格排版。希望對於也還尚不了解 Flex 布局的人們多少有些幫助!如果還想了解 CSS3 Grid 布局的話,也歡迎看看這篇 CSS3-grid-格线布局

猜你喜欢

转载自blog.csdn.net/weixin_46803507/article/details/106651908