詳解CSS3伸縮布局盒模型Flex布局

一、Flex 布局是什么?
CSS3引入了一種新的布局模式——Flexbox布局,即伸縮盒模型布局(Flexible Box)模型。用來提供一個(gè)更加有效的方式制定、調(diào)整和分布一個(gè)容器里的項(xiàng)目布局,即使它們的大小是未知或者動(dòng)態(tài)的,這里簡(jiǎn)稱Flex。
CSS3引入的布局模式Flex布局,主要思想是讓容器有能力讓其子項(xiàng)目能夠改變其 寬度
、 高度
、 順序
,以最佳的方式填充可用空間。Flex容器會(huì)使子項(xiàng)目(伸縮項(xiàng)目)擴(kuò)展來填滿可用空間,或縮小它們以防止溢出容器。
任何一個(gè)容器都可以指定為 Flex 布局。
.box{ display: flex; }
行內(nèi)元素也可以使用 Flex 布局。
.box{ display: inline-flex; }
采用 Flex 布局的元素,稱為 Flex 容器(flex container),簡(jiǎn)稱"容器"。它的所有子元素自動(dòng)成為容器成員,稱為 Flex 項(xiàng)目(flex item),簡(jiǎn)稱"項(xiàng)目"。
設(shè)為 Flex 布局以后,CSS的 columns
在伸縮容器上沒有效果。子元素(伸縮項(xiàng)目)的 float
、 clear
和 vertical-align
屬性將失效
Flex布局在定義伸縮項(xiàng)目大小時(shí)伸縮容器會(huì)預(yù)留一些可用空間,可以調(diào)節(jié)伸縮項(xiàng)目的相對(duì)大小和位置。例如,可以 確保伸縮容器中的多余空間平均分配多個(gè)伸縮項(xiàng)目。如果伸縮容器沒有足夠大的空間放置伸縮項(xiàng)目時(shí),瀏覽器會(huì)根據(jù)一定的比例減少伸縮項(xiàng)目的大小,使其不溢出伸縮容器。
二、Flex基本概念和模型中的術(shù)語
和CSS3其他屬性不一樣,F(xiàn)lexbox并不是一個(gè)屬性,而是一個(gè)模塊,包括多個(gè)CSS3屬性,涉及東西較多,包括整個(gè)組屬性,要了解新的術(shù)語和概念才能學(xué)好Flex布局。
在Flexbox模型中與布局計(jì)算偏向使用書寫模式方向的塊布局和行內(nèi)布局不同,伸縮布局偏向使用伸縮流的方向。為了讓描述伸縮布局變得更容易,本章定義一系列相對(duì)于伸縮流的術(shù)語。如下圖:
圖片介紹
主軸、主軸方向:沿著一個(gè)伸縮容器的主軸配置伸縮項(xiàng)目,主軸是主軸方向的延伸。伸縮容器額主軸,伸縮項(xiàng)目主要沿著這條軸進(jìn)行布局。重要,它不一定是水平的,這主要取決于 flex-direction
屬性。如果其取值為 column
,主軸的方向?yàn)榭v向的。
主軸起點(diǎn)、主軸終點(diǎn):伸縮項(xiàng)目的配置從容器的主軸起點(diǎn)邊開始,往主軸終點(diǎn)邊結(jié)束。也就是說,伸縮項(xiàng)目放置在伸縮容器內(nèi)從主軸起點(diǎn)( main-start
)向主軸終點(diǎn)( main-end
)方向。
主軸長(zhǎng)度、主軸長(zhǎng)度屬性:伸縮項(xiàng)目在主軸的方向的寬度或高度就是項(xiàng)目的主軸長(zhǎng)度,伸縮項(xiàng)目的主軸長(zhǎng)度屬性是 width
或 height
屬性,由哪一個(gè)對(duì)著主軸的方向決定。
側(cè)軸、側(cè)軸方向:與主軸垂直的軸稱做側(cè)軸,側(cè)軸是側(cè)軸方向的延伸。主要取決于主軸的方向。
側(cè)軸起點(diǎn)、側(cè)軸終點(diǎn):伸縮項(xiàng)目的配置從容器的側(cè)軸起點(diǎn)邊開始,往側(cè)軸終點(diǎn)邊結(jié)束。也就是說,伸縮項(xiàng)目放置在伸縮容器內(nèi)從側(cè)軸起點(diǎn)( cross-start
)向側(cè)軸終點(diǎn)( cross-end
)方向。
側(cè)軸長(zhǎng)度、側(cè)軸長(zhǎng)度屬性:伸縮項(xiàng)目在側(cè)軸的方向的寬度或高度就是項(xiàng)目的側(cè)軸長(zhǎng)度,伸縮項(xiàng)目的側(cè)軸長(zhǎng)度屬性是 width
或 height
屬性,由哪一個(gè)對(duì)著側(cè)軸的方向決定。
通過設(shè)置 display
屬性顯式地給一個(gè)元素設(shè)置為 flex
或者 inline-flex
,這個(gè)容器就是一個(gè)伸縮容器。其中設(shè)置為 flex
的容器被渲染成為一個(gè)塊級(jí)元素,而設(shè)置為 inline-flex
的容器則渲染為一個(gè)行內(nèi)元素。若元素的 display
的指定值是 inline-flex
且元素是一個(gè)浮動(dòng)或絕對(duì)定位元素,則display的計(jì)算值是flex。
一個(gè)伸縮容器的內(nèi)容具有零個(gè)以上的伸縮項(xiàng)目——伸縮容器的每個(gè)子元素(除了需要盒修復(fù)的元素之外)都會(huì)成為一個(gè)伸縮項(xiàng)目。且瀏覽器會(huì)將任何直接在伸縮容器里的連續(xù)文字塊包起來成為匿名伸縮項(xiàng)目。
總結(jié):容器默認(rèn)存在兩根軸:水平的主軸( main axis
)和垂直的交叉軸( cross axis
)。主軸的開始位置(與邊框的交叉點(diǎn))叫做 main start
,結(jié)束位置叫做 main end
;交叉軸的開始位置叫做 cross start
,結(jié)束位置叫做 cross end
。
項(xiàng)目默認(rèn)沿主軸排列。單個(gè)項(xiàng)目占據(jù)的主軸空間叫做 main size
,占據(jù)的交叉軸空間叫做 cross size
。
三、Flexbox模型規(guī)范狀態(tài)
Flexbox布局的語法規(guī)范版本眾多,瀏覽器支持不一致。Flex布局語法規(guī)范主要分成三種:
- 舊版本(Old),2009年版本。
- 混合版本(Hybird),2011年版本。
- 最新版本(Modern),使用
display:flex
或者display:inline-flex
。
Flex布局舊版本和混合版本本章不做介紹,只對(duì)符合W3C規(guī)范的最新版本Flex屬性做記錄。如果有興趣的同學(xué)可以參考大漠老師圖解CSS3 這本書第8章CSS3伸縮布局盒模型。
四、伸縮容器的屬性
以下6個(gè)屬性設(shè)置在容器上
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
4.1 flex-direction屬性介紹
伸縮流方向。 flex-direction
屬性是指伸縮容器的主軸方向,其決定了伸縮項(xiàng)目放置在伸縮容器的方向。其默認(rèn)值為 row
。如果 flex-direction
設(shè)置為row,F(xiàn)lex項(xiàng)目從左到右排列。如果 flex-direction
設(shè)置為 column
,F(xiàn)lex項(xiàng)目從上到下排列。
flex-direction
屬性它有4個(gè)值。
.box { flex-direction: row | row-reverse | column | column-reverse; }
從左到右依次是row | row-reverse | column | column-reverse
row
:排版方式從左到右排列。row-reverse
:與row
排列方向相反。從右向左排列。column
:類似于row
,不過是從上到下排列。column-reverse
:類似于row-reverse
,不過是從下到上排列。
4.2 flex-wrap屬性介紹
伸縮流換行。伸縮項(xiàng)目在伸縮容器中有時(shí)候也會(huì)溢出伸縮容器。與傳統(tǒng)的CSS盒模型一樣,CSS允許使用 overflow:hidden
屬性來處理溢出內(nèi)容的顯示方式。在伸縮容器中有一個(gè)伸縮換行屬性,主要用來設(shè)置伸縮容器的伸縮項(xiàng)目是單行顯示還是多行顯示,以及決定側(cè)軸的方向。使用此屬性來啟用溢出的伸縮容器的伸縮項(xiàng)目自動(dòng)換行到下一行以及控制流動(dòng)方向。在伸縮容器屬性中,主要通過 flex-wrap
屬性來設(shè)置伸縮項(xiàng)目是否換行,默認(rèn)值為 nowrap
。
flex-direction
屬性它有3個(gè)值。
.box { flex-wrap: nowrap | wrap | wrap-reverse; }
從上到下依次是nowrap | wrap | wrap-reverse;
- nowrap:伸縮容器單行顯示。
- wrap:換行,第一行在上方。
- wrap-reverse:換行,第一行在下方。
4.3 flex-flow屬性介紹
伸縮方向與換行。 flex-flow
屬性是 flex-direction
屬性和 flex-wrap
屬性的簡(jiǎn)寫形式,默認(rèn)值為 row nowrap
。
.box { flex-flow: <flex-direction> || <flex-wrap>; }
flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡(jiǎn)寫形式,默認(rèn)值為 row
nowrap
。
4.4 justify-content屬性
主軸對(duì)齊。 justify-content
屬性定義了伸縮項(xiàng)目在主軸上的對(duì)齊方式。指定如何在伸縮項(xiàng)目之前分布伸縮容器額外空間。當(dāng)一行上的所伸縮項(xiàng)目不能伸縮或可伸縮但已經(jīng)達(dá)到最大長(zhǎng)度時(shí),這一屬性才會(huì)對(duì)伸縮容器額外空間進(jìn)行分配。當(dāng)伸縮項(xiàng)目溢出某一行時(shí),這一屬性也會(huì)在項(xiàng)目的對(duì)齊上施加一些控制。
justify-content
屬性它有5個(gè)值。
.box { justify-content: flex-start | flex-end | center | space-between | space-around; }
從上到下依次是flex-start | flex-end | center | space-between | space-around;
- flex-start:伸縮項(xiàng)目向一行的起始位置靠齊。
- flex-end:伸縮項(xiàng)目向一行的結(jié)束位置靠齊。
- center:伸縮項(xiàng)目向一行的中間位置靠齊。
- space-between:伸縮項(xiàng)目會(huì)平均地分布在行里。第一個(gè)伸縮項(xiàng)目一行中的最開始位置,最后一個(gè)項(xiàng)目在一行中最終點(diǎn)位置。
- space-around:伸縮項(xiàng)目會(huì)平均地分布在行里,兩端保留一半的空間。(每個(gè)項(xiàng)目?jī)蓚?cè)的間隔相等。所以,項(xiàng)目之間的間隔比項(xiàng)目與邊框的間隔大一倍。)
4.5 align-items屬性
側(cè)軸對(duì)齊。 align-items
屬性定義項(xiàng)目在伸縮容器的當(dāng)前行的側(cè)軸(垂直于主軸)上的對(duì)齊方式。可以把它想象成側(cè)軸的 justify-content
。
.box { align-items: flex-start | flex-end | center | baseline | stretch; }
從上到下依次是flex-start | flex-end | center | baseline | stretch;
- flex-start:伸縮項(xiàng)目在側(cè)軸起點(diǎn)邊的外邊距緊靠住該行在側(cè)軸起始邊。(側(cè)軸的起點(diǎn)對(duì)齊。)
- flex-end:伸縮項(xiàng)目在側(cè)軸終點(diǎn)邊的外邊距緊靠住該行在側(cè)軸終點(diǎn)邊。(側(cè)軸的終點(diǎn)對(duì)齊。)
- center:伸縮項(xiàng)目的外邊距盒在該行的側(cè)軸上居中放置。(側(cè)軸的中點(diǎn)對(duì)齊。)
- baseline:伸縮項(xiàng)目根據(jù)伸縮項(xiàng)目的基線對(duì)齊。(項(xiàng)目的第一行文字的基線對(duì)齊。)
- stretch:默認(rèn)值,伸縮項(xiàng)目拉伸填充整個(gè)容器。(如果項(xiàng)目未設(shè)置高度或設(shè)為auto,將占滿整個(gè)容器的高度。)
4.6 align-content屬性
堆棧伸縮行。用來定義伸縮容器中 伸縮項(xiàng)目行
在側(cè)軸的對(duì)齊方式,類似于側(cè)軸對(duì)齊,只不過這是用來控制伸縮項(xiàng)目行在布局軸的堆放方式。 align-content
屬性會(huì)更改 flex-wrap
的行為。它和 align-items
相似,但不是對(duì)齊伸縮項(xiàng)目,它對(duì)齊的是伸縮行。簡(jiǎn)單來說, align-content
屬性主要用來調(diào)準(zhǔn)伸縮行在伸縮容器里的對(duì)齊方式。它接受的值也很類似。
.box { align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
從左到右依次是:flex-start | flex-end | center | space-between | space-around | stretch
flex-start
:各行向伸縮容器的起點(diǎn)位置堆疊。flex-end
:各行向伸縮容器的結(jié)束位置堆疊。center
:各行向伸縮容器的中間位置堆疊。space-between
:各行在伸縮容器中平均分布。space-around
:各行在伸縮容器中平均分布,在兩邊各有一半的空間。stretch
:align-content
的默認(rèn)值,各行將會(huì)伸展以占用額外的空間。
這個(gè)屬性只有伸縮項(xiàng)目有多行時(shí)才生效,這種情況只有display的flex-wrap為wrap時(shí),并且沒有足夠的空間把伸縮項(xiàng)目行放在同一行中。也就是這個(gè)屬性將對(duì)每一行起作用而不是每個(gè)伸縮項(xiàng)目。
五、伸縮項(xiàng)目的屬性
以下6個(gè)屬性設(shè)置在伸縮項(xiàng)目上
- order
- flex-grow
- flex-shrink
- flex-basis
- flex
- align-self
5.1 flex-grow屬性
.box-item { flex-grow: <number> (默認(rèn)值為0) }
中間的元素設(shè)置為flex-grow的值為2
flex-grow屬性定義項(xiàng)目的放大比例,默認(rèn)為0,即如果存在剩余空間,也不放大。如果所有伸縮項(xiàng)目的 flex-grow
設(shè)置為1,每個(gè)伸縮項(xiàng)目將設(shè)置為一個(gè)大小相等的額外空間。如果給其中一個(gè)伸縮項(xiàng)目設(shè)置 flex-grow
值為2,這個(gè)伸縮項(xiàng)目所占的額外空間是其他伸縮項(xiàng)目所占額外空間的2倍。
5.2 flex-shrink屬性
.box-item { flex-shrink: <number> (默認(rèn)值為1) }
flex-shrink屬性的值從左到右依次是:0,1,1
flex-shrink屬性使用于伸縮項(xiàng)目,此屬性根據(jù)需要來定義伸縮項(xiàng)目收縮的能力。如果所有項(xiàng)目的flex-shrink屬性都為1,當(dāng)空間不足時(shí),都將等比例縮小。如果一個(gè)項(xiàng)目的flex-shrink屬性為0,其他項(xiàng)目都為1,則空間不足時(shí),前者不縮小。
5.3 flex-basis屬性
.box-item { flex-basis: <length> | auto; (默認(rèn)值為auto) }
flex-basis屬性使用于伸縮項(xiàng)目。這個(gè)屬性用來設(shè)置伸縮項(xiàng)目的伸縮基準(zhǔn)值,伸縮容器的額外空間按比列進(jìn)行伸縮。在分配多余空間之前,項(xiàng)目占據(jù)的主軸空間(main size)。瀏覽器根據(jù)這個(gè)屬性,計(jì)算主軸是否有多余空間。它的默認(rèn)值為auto,即項(xiàng)目的本來大小。
它可以設(shè)為跟width或height屬性一樣的值(比如350px),則項(xiàng)目將占據(jù)固定空間。
5.4 flex屬性
flex屬性是flex-grow, flex-shrink 和 flex-basis的簡(jiǎn)寫,默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。
.box-item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
5.5 align-self屬性
.box-item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
伸縮項(xiàng)目第一個(gè)1元素設(shè)置align-self:flex-end;
align-self屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對(duì)齊方式,可覆蓋align-items屬性。默認(rèn)值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。
5.6 order屬性
.box-item { order: <integer>; }
第一個(gè)元素設(shè)置order: 3,第二個(gè)元素設(shè)置order: 1,第三個(gè)元素設(shè)置order: 2
order屬性定義項(xiàng)目的排列順序。數(shù)值越小,排列越靠前,默認(rèn)為0。
六、使用Flex布局實(shí)現(xiàn)圣杯布局
圣杯布局
html
<body> <header>我是頁眉</header> <section> <article>我是主內(nèi)容</article> <nav>我是側(cè)邊欄</nav> <aside>我是右邊欄</aside> </section> <footer>我是頁腳</footer> </body>
CSS
* { padding: 0; margin: 0; } html,body{ width:100%; height:100%; overflow: hidden; } body{ display: flex; flex-flow: column wrap; } header { background: red; /* 頭、腳尺寸固定,不放大、不縮小 */ flex:0 0 50px; } section { display: flex; flex-flow: row wrap; flex: 1; background: green; } article { flex: 1; order: 2; background: blue; } aside{ order: 3; align-items: stretch; background:yellow; } footer { /* 頭、腳尺寸固定,不放大、不縮小 */ flex:0 0 50px; background: darkgoldenrod; }
七、參考鏈接
http://www.dbjr.com.cn/books/425391.html
http://www.dbjr.com.cn/css/571476.html
https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes
http://www.dbjr.com.cn/css/632500.html
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
- flex布局又稱為彈性布局,任何一個(gè)容器都可以指定為flex布局,這篇文章主要介紹了CSS中的flex布局,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參2020-03-19
- 本文給大家整理了CSS中display flex(布局利器) 的相關(guān)知識(shí),本文通過實(shí)例截圖的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-02-05
- 這篇文章主要介紹了CSS3 Flex 彈性布局實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-11-01
- 這篇文章主要介紹了css flex幾種多列布局的相關(guān)資料,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-19
- 這篇文章主要介紹了css flex 彈性布局詳解的相關(guān)資料,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-02
- flex布局(flex是flexible box的縮寫), 也稱為彈性盒模型 ,這篇文章主要介紹了CSS3新增布局之: flex的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或2020-06-18