隨著前端技術的不斷發展和更新,flex布局成為前端布局的主流。但是仍然有很多前端新手搞不懂flex到底怎么用!!!今天我們就來好好講講flex布局
老規矩先上定義
什么是flex布局
布局的傳統解決方案,基于盒狀模型,依賴 display 屬性 + position 屬性 + float 屬性。它對于那些特殊布局非常不方便,比如,垂直居中就不容易實現。
Flex
是Flexible Box
的縮寫,意為"彈性布局",Flex是CSS3新增的一種布局方式,它可以讓容器的子元素在任何設備上都能夠以相同的方式排列、對齊和分配空間,從而實現響應式布局。用來為盒狀模型提供最大的靈活性。指定容器 display: flex 即可。 簡單的分為容器屬性和元素屬性。
flex布局的優點
- 靈活性強:Flex布局可以根據不同的場景進行靈活的排列和對齊,如垂直居中、水平分布、兩端對齊、固定寬度等。
- 布局自適應:Flex布局可以根據容器大小和子元素數量自適應布局,無需手動調整樣式,減少代碼復雜度。
- 兼容性好:Flex布局可以實現響應式布局,使得頁面在不同設備上都可以以一致的方式進行排列和布局。
- 可讀性好:Flex布局的代碼結構清晰,易于閱讀和維護,使得開發效率得到提高。
- 與傳統布局兼容:Flex布局可以與傳統的布局方式相結合,形成更加靈活的布局方案。
- 簡單易學:Flex布局的概念和屬性相對簡單,易于掌握和理解,即使是初學者也可以快速上手。
flex前置概念
容器(Flex Container)
容器是一個包含Flex子元素的父元素,通過設置display屬性為flex或inline-flex,可以將其定義為一個Flex容器。容器內的子元素將按照Flex布局的規則進行排列和布局。
軸(Axis)
Flex布局主要涉及兩個軸,即主軸和交叉軸。主軸是Flex容器的主要方向,子元素會沿著這個方向排列;交叉軸則與主軸垂直。
子元素(Flex Item)
子元素是Flex容器中的直接子元素,它們根據容器的排列方式進行排列和布局。
主軸對齊方式(Main Axis Alignment)
主軸對齊方式指的是子元素沿著主軸方向的對齊方式,常見的主軸對齊方式有:flex-start(起點對齊)、flex-end(終點對齊)、center(居中對齊)、space-between(兩端對齊,子元素之間平均分配空間)、space-around(子元素兩側都留有空白,子元素之間也平均分配空間)等。
交叉軸對齊方式(Cross Axis Alignment)
交叉軸對齊方式指的是子元素沿著交叉軸方向的對齊方式,常見的交叉軸對齊方式有:stretch(拉伸對齊,子元素在交叉軸方向上拉伸到與容器相同的高度或寬度)、flex-start(起點對齊)、flex-end(終點對齊)、center(居中對齊)等。
flex屬性
flex屬性是Flex布局中的一個關鍵屬性,用于設置子元素的伸縮性和空間占用比例。它包含了三個子屬性:flex-grow(指定子元素在剩余空間中的占比)、flex-shrink(指定子元素在空間不足時的縮放比例)、flex-basis(指定子元素的基準大小)。flex屬性可以同時設置這三個子屬性的值,也可以只設置其中的一個或兩個。
在 flex 容器中默認存在兩條軸,水平主軸(main axis) 和垂直的交叉軸(cross axis),這是默認的設置,當然你也可以通過修改使垂直方向變為主軸,水平方向變為交叉軸,主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end。交叉軸的開始位置叫做cross start,結束位置叫做cross end。
在容器中的每個單元塊被稱之為 flex item,項目默認沿主軸排列,每個項目占據的主軸空間為 (main size), 占據的交叉軸的空間為 (cross size)。
注意:
這里需要強調,不能先入為主認為寬度就是 main size,高度就是 cross size,這個還要取決于你主軸的方向,如果你垂直方向是主軸,那么項目的高度就是 main size。
首先,實現 flex 布局需要先指定一個容器,任何一個容器都可以被指定為 flex 布局,這樣容器內部的元素就可以使用 flex 來進行布局。
.div {display: flex | inline-flex; //可以有兩種寫法
}
如果你使用塊元素如 div,你就可以使用 flex,而如果你使用行內元素,你可以使用 inline-flex。
需要注意的是:當時設置 flex 布局之后,子元素的 float、clear、vertical-align 的屬性將會失效
flex的屬性
flex-direction:
決定主軸的方向(即我們設置了disp:flex后div的子 item 元素的排列方法)
.div {flex-direction: row(默認) | row-reverse | column | column-reverse;
}
- row(默認值):主軸為水平方向,起點在左端。
- row-reverse:主軸為水平方向,起點在右端。
- column:主軸為垂直方向,起點在上沿。
- column-reverse:主軸為垂直方向,起點在下沿。
flex-wrap
默認情況下,項目都排在一條線(又稱”軸線”)上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。
.div {flex-wrap: nowrap | wrap | wrap-reverse;
}
nowrap(默認):不換行
wrap:換行,第一行在上方。
wrap-reverse:換行,第一行在下方
flex-flow
flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為row nowrap。
.div {flex-flow: <flex-direction> <flex-wrap>;
}
justify-content
水平主軸對齊方式
.div {justify-content: flex-start | flex-end | center | space-between | space-around;
}
- flex-start(默認值):左對齊
- flex-end:右對齊
- center: 居中
- space-between:兩端對齊,項目之間的間隔都相等。
- space-around:每個項目兩側的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍。
align-items
定義豎直軸線方向的對齊方式
.div {align-items: flex-start | flex-end | center | baseline | stretch;
}
- flex-start 從上到下。
- flex-end:從下到上。
- center:垂直居中。
- baseline: 項目的第一行文字的基線對齊。
- stretch(默認值):如果項目未設置高度或設為auto,將占滿整個容器的高度。
align-content
屬性定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。
.div {align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
- flex-start:從上到下。
- flex-end:從下到上。
- center:垂直居中。
- space-between:兩端對齊,軸線之間的間隔平均分布。
- space-around:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。
- stretch(默認值):軸線占滿整個交叉軸。
order
屬性定義項目的排列順序,根據order的值來排序,順序越小,排列越靠前,默認為 0
.item {order: <integer(整數)>;
}
flex-grow
屬性定義項目的放大比例,默認為0 ,即使存在空間,也不會放大
.item {flex-grow: <number>; /* default 0 */
}
如果所有項目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)。如果一個項目的flex-grow屬性為2,其他項目都為1,則前者占據的剩余空間將比其他項多一倍。
flex-shrink
屬性定義了項目的縮小比例,當空間不足的情況下會等比例的縮小,如果 定義個 item 的 flow-shrink 為 0,則為不縮小
.item {flex-shrink: <number>; /* default 1 */
}
如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小
注意: 負值對該屬性無效。
flex-basis
flex-basis屬性定義了在分配多余空間之前,項目占據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認值為auto,即項目的本來大小
它可以設為跟width或height屬性一樣的值(比如350px),則項目將占據固定空間
.item {flex-basis: <length> | auto; /* default auto */
}
flex
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值為0 1 auto。后兩個屬性可選
該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。
寫法一:
.item {flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
寫法二:
/* 當我們只填寫一個值時,無單位數字,會默認為flex-grow屬性值 */
flex: 2;/* 當我們只填寫一個值, 帶單位數字,會默認為flex-basis屬性值 */
flex: 10em;
flex: 30px;
flex: min-content;/* 當我們填寫兩個值時第一個不帶單位數字第二個帶單位數字:會默認為flex-grow | flex-basis屬性值 */
flex: 1 30px;/* 當我們填寫兩個值時第一個帶單位數字第二個不帶單位數字:會默認為flex-grow | flex-shrink屬性值 */
flex: 2 2;/* 當我們填寫三個值時:會默認為flex-grow | flex-shrink | flex-basis 屬性值*/
flex: 2 2 10%;/*全局屬性值 */
flex: inherit;
flex: initial;
flex: unset;
align-self
align-self屬性允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。
.item {align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
align-items
默認屬 性為 auto,表示繼承父元素的 align-items 比如說,用 flex 實現圣杯布局