大家好,我是Echa。最近比較忙,今天就來分享一篇之前寫的筆記吧,希望對你有所幫助~
CSS 中的 Flex 布局是一種一維的布局模型,一次隻能處理一個維度上的元素布局,一行或者一列。它給 flexbox 的子元素之間提供了強大的空間分布和對齊能力。下面就來看看如何在 CSS 中使用 Flex 布局!
基本概念Flexbox 布局也叫 Flex 布局,彈性盒子布局。它的目标是提供一個更有效地布局、對齊方式,并且能夠使父元素在子元素的大小未知或動态變化情況下仍然能夠分配好子元素之間的間隙。
主要思想是使父元素能夠調整子元素的寬度、高度、排列方式,從而更好地适應可用的布局空間。設定為flex布局的元素能夠放大子元素使之盡可能填充可用空間,也可以收縮子元素使之不溢出。
Flex布局更适合小規模的布局,可以簡便、完整、響應式的實現各種頁面布局。但是,設為Flex布局以後,其子元素的float、clear和vertical-align屬性将失效。Flex彈性盒模型的優勢在于隻需聲明布局應該具有的⾏為,⽽不需要給出具體的實現⽅式,浏覽器負責完成實際布局,當布局涉及到不定寬度,分布對⻬的場景時,就要優先考慮彈性盒布局。
Flex 布局是一個完整的模塊,它包括了一套完整的屬性。其中采用 Flex 布局的元素,稱為 Flex 容器,簡稱"容器"。它的所有子元素就是容器成員,稱為 Flex 項目,簡稱"項目"。
容器默認存在兩個軸:水平軸(main axis)和垂直軸(cross axis),項目默認沿主軸排列(水平軸):
這裡面涉及到了幾個概念,下面來看一下:
想要使用flex布局,首先需要給父元素指定為flex布局,這樣容器内的元素才能實現flex布局:
<div class="container"></div>
.container {
display: flex | inline-flex;
}
這裡有兩種方式可以設置flex布局,使用display: flex;會生成一個塊狀的flex容器盒子,使用display: inline-flex;會生成一個行内的flex容器盒子。如果我們使用塊狀元素,比如div标簽,就可以使用flex,如果使用行内元素,就可以使用inline-flex。多數情況下,我們會使用 display: flex;。
父元素(容器)可以設置以下六個屬性:
flex-direction:主軸方向,它決定了容器内元素排列方向,它有四個屬性值:
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
(1)flex-direction: row:默認值,沿水平主軸從左到右排列,起點在左沿
(2)flex-direction: row-reverse:沿水平主軸從右到左排列,起點在右沿
(3)flex-direction: column:沿垂直主軸從上到下排列,起點在上沿
(4)flex-direction: column-reverse:沿垂直主軸從下到上排列,起點在下沿
2. flex-wrap
flex-wrap:容器内元素是否可以換行,它有三個屬性值:
.container {
flex-wrap: nowrap | wrap | wrap-reverse;
}
(1)flex-wrap: nowrap:默認值,不換行。當主軸的長度是固定并且空間不足時,項目尺寸會随之進行調整,而不會換行。
(2)flex-wrap: wrap:換行,第一行在上面
(3)flex-wrap: wrap-reverse:換行,第一行在下面
3. flex-flow
flex-flow 是 flex-direction 屬性和flex-wrap屬性的簡寫,默認為:flex-flow:row nowrap,用處不大,最好還是分開來寫。該屬性的書寫格式如下:
.container {
flex-flow: <flex-direction> <flex-wrap>;
}
justify-content:元素在主軸的對齊方式,它有五個屬性值:
.container {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
這裡以水平方向為主軸進行舉例,即flex-direction: row。
(1)justify-content : flex-start:默認值,元素在主軸上左對齊(上對齊)
(2)justify-content : flex-end:元素在主軸上右對齊(下對齊)
(3)justify-content : center :元素在主軸上居中對齊
(4)justify-content : space-between:元素在主軸上兩端對齊,元素之間間隔相等
(5)justify-content : space-around :每個項目兩側的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍。
5. align-items
align-item:元素在交叉軸上的對齊方式,它有五個屬性值:
.container {
align-items: flex-start | flex-end | center | baseline | stretch;
}
這裡以水平方向為主軸進行舉例,即flex-direction: row。
(1)align-item:flex-start:交叉軸的起點對齊(上面或左邊)。設置容器高度為 100px,項目高度分别為 20px、40px、60px、80px、100px,效果如圖所示:
(2)align-item:flex-end:交叉軸的終點對齊(下面或右邊)。設置容器高度為 100px,項目高度分别為 20px、40px、60px、80px、100px,效果如圖所示:
(3)align-item:center:交叉軸的中點對齊。設置容器高度為 100px,項目高度分别為 20px、40px、60px、80px、100px,效果如圖所示:
(4)align-item:stretch:默認值、如果元素未設置高度或設為auto,将占滿整個容器的高度。假設容器高度設置為 100px,而項目沒有設置高度,則項目的高度也為 100px:
(5)align-item:baseline:以元素的第一行文字的基線對齊
6. align-content
align-content:多根軸線對齊方式。如果元素隻有一根軸線,該屬性不起作用。它有六個屬性值:
.container {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
那這個軸線數怎麼确定呢?實際上這主要是由flex-wrap屬性決定的,當flex-wrap 設置為 nowrap 時,容器僅存在一根軸線,因為項目不會換行,就不會産生多條軸線。當 flex-wrap 設置為 wrap 時,容器可能會出現多條軸線,這時就需要去設置多條軸線之間的對齊方式。
這裡以水平方向為主軸時舉例,即:flex-direction: row; flex-wrap: wrap;
(1)align-content: stretch:默認值,軸線占滿整個交叉軸。這裡我們先設置每個項目都是固定寬度,效果如下:
下面就去掉每個項目的高度,它會占滿整個交叉軸,效果如下:
(2)align-content: flex-start:從交叉軸開始位置填充
(3)align-content: flex-end:從交叉軸結尾位置填充
(4)align-content: center:與交叉軸中點對齊
(5)align-content: space-between:與交叉軸兩端對齊,軸線之前的間隔平均分布
(6)align-content: space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍
項目屬性
子元素有以下六個屬性:
order屬性用來定義項目的排列順序。數值越小,排列越靠前,默認為0。使用形式如下:
.item {
order: <integer>;
}
2. flex-basis
flex-basis屬性定義了在分配多餘空間之前,項目占據的主軸空間,浏覽器會根據這個屬性來計算主軸是否有多餘空間。它的默認值為auto,即項目的本來大小。使用形式如下:
.item {
flex-basis: <length> | auto;
}
當主軸設置為水平時,當設置了 flex-basis,設置的項目寬度值會失效,flex-basis 需要跟 flex-grow 和 flex-shrink 配合使用才能生效。有兩種特殊的值:
flex-grow屬性定義項目的放大比例,默認為0,即如果存在剩餘空間時也不放大。
當容器中所有的項目都設置了flex-basis屬性時,如果仍有是剩餘的空間,設置的 flex-grow屬性才能生效。
4. flex-shrink
flex-shrink屬性定義了項目的縮小比例,默認為1,即如果空間不足,該項目将縮小。不能設置負值,使用形式如下:
.item {
flex-shrink: <number>;
}
5. flex
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,後兩個屬性可選。默認值為:flex:0 1 auto。使用形式如下:
.item{
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
對于flex的取值有幾種常用的特殊情況:
(1)默認值:flex:0 1 auto,即在有剩餘空間時,隻放大不縮小
.item {
flex:0 1 auto;
}
.item {
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
}
(2)flex: none,即有剩餘空間時,不放大也不縮小,最終尺寸通常表現為最大内容寬度。
.item {
flex:0 0 auto;
}
.item {
flex-grow: 0;
flex-shrink: 0;
flex-basis: auto;
}
(3)flex: 0,即當有剩餘空間時,項目寬度為其内容的寬度,最終尺寸表現為最小内容寬度。
.item {
flex:0 1 0%;
}
.item {
flex-grow: 0;
flex-shrink: 1;
flex-basis: 0%;
}
(4)flex: auto,即元素尺寸可以彈性增大,也可以彈性變小,具有十足的彈性,但在尺寸不足時會優先最大化内容尺寸。
.item {
flex:1 1 auto;
}
.item {
flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;
}
(5)flex: 1,即元素尺寸可以彈性增大,也可以彈性變小,具有十足的彈性,但是在尺寸不足時會優先最小化内容尺寸,
.item {
flex:1 1 0%;
}
.item {
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
}
align-self屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
這個屬性和align-items屬性的效果是一樣的,隻不過這個屬性隻對單個項目生效,而align-items是對容器中所有的項目生效。
設置容器的align-items屬性為flex-start,容器中第三個項目的align-self屬性為flex-end,效果如下:
如果覺得這篇文章有用,就點贊、轉發、評論、在看吧!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!