10分鐘理解CSS3 FlexBox彈性布局
基本介紹
特點(diǎn)
- flexbox是一種css display類(lèi)型,提供一種更簡(jiǎn)單高效的布局方式;
- flexbox可以對(duì)元素相對(duì)于父元素、兄弟元素進(jìn)行定位、控制尺寸、控制間距;
- flexbox對(duì)響應(yīng)式有很好的支持;
工作原理
設(shè)置父元素的display屬性為flex,則子元素都變成flex item,由此可以控制子元素的排列方式、尺寸、間距等;
兼容性

Flex Container
先來(lái)看一個(gè)最簡(jiǎn)單的flex示例,外層div設(shè)置display: flex成為一個(gè)flex container,內(nèi)部的3個(gè)div則自動(dòng)變?yōu)閒lex item:
html:
<div class="flex-container"> <div class="box one"></div> <div class="box two"></div> <div class="box three"></div> </div>
css:
.flex-container{ max-width: 960px; margin: 0 auto; display:flex; }
.box{ height: 100px; min-width: 100px; }
.one{ background: pink; }
.two{ background: lightgreen; }
.three{ background: skyblue; }
效果:

效果與浮動(dòng)布局類(lèi)似,但是如果用浮動(dòng)實(shí)現(xiàn)的話(huà)需要寫(xiě)更多的代碼,而flex一行就搞定了。
1. Justify Content
如果我們想讓flex item居中排列呢,我們可以給flex container增加一個(gè)css屬性:justify-content,它控制flex item在主軸方向(main axis,由flex-drection決定,默認(rèn)為水平方向)上的對(duì)齊方式:
.flex-container{
...
justify-content: center;
}
效果如圖:

除此之外justify-content還可以設(shè)置為flex-start, flex-end, space-around, space-between, space-even等值,具體效果請(qǐng)自行實(shí)驗(yàn)。
2. Align Items
實(shí)現(xiàn)了flex方向的居中后,垂直于主軸方向(cross axis)的居中可以用align-items實(shí)現(xiàn)。
css:
.flex-container{
max-width: 960px;
margin: 0 auto;
display:flex;
justify-content: center;
height: 200px;
background-color: white;
align-items: center;
}
效果:

使用flex解決了以往css垂直居中實(shí)現(xiàn)復(fù)雜的問(wèn)題!相應(yīng)的,align-items還有flex-start, flex-end等其他值。
3. Flex Direction
flex-direction決定了主軸方向即flex item排列方向,除了默認(rèn)的row方向之外,還可以縱向、反向(row-reverse/column-reverse)排列flex item:
css:
.flex-container{
...
flex-direction: column;
align-items: center;
}
效果:

4. Flex Wrap
如果我們不想在窗口變窄的情況下壓縮flex item,而是讓超出邊界的flex item換行顯示那我們可以設(shè)置flex container的flex-wrap:
.flex-container{
max-width: 960px;
margin: 0 auto;
display:flex;
flex-wrap: wrap;
}
.box{
height: 100px;
min-width: 300px;
flex-grow: 1;
}
當(dāng)我們壓縮窗口的時(shí)候,效果如下:

flex wrap還有一個(gè)值:wrap-reverse,設(shè)置該值后,被wrap的元素會(huì)排到其他元素上面:

由此可見(jiàn),flex wrap一定程度上可以取代media query了。
5. Flex Row
最后,flex-direction和flex-wrap可以合并為一個(gè)屬性flex-flow,比如:flex-flow: row-reverse wrap。
Flex Item
1. Flex Grow
在上面所有的例子中,三個(gè)flex item只占據(jù)了flex container小部分空間,如果想讓flex item占滿(mǎn)flex container我們需要給flex item設(shè)置flex-grow屬性。顧名思義,grow意味著增長(zhǎng),用于控制flex item的尺寸的伸展。
將css修改為:
.box {
height: 100px;
min-width: 100px;
flex-grow:1;
}
效果:

可以看到三個(gè)子元素平分了父元素的空間,因?yàn)榇藭r(shí)它們的flex-grow都是1。如果只有一個(gè)子元素設(shè)置了flex-grow呢?
css:
.box{ height: 100px; min-width: 100px; }
.one{ background: pink; flex-grow: 1; }
效果:

此時(shí)two和three的大小不變,而one占據(jù)了父元素剩余空間。
如果將one的flex-grow改為2,而two和three改為1,我們看看會(huì)發(fā)生什么:
css:
.box{ height: 100px; min-width: 100px; flex-grow:1; }
.one{ background: pink; flex-grow: 2; }
效果:

可以看到one的寬度變成了two和three的兩倍,因此flex item的尺寸和flex-grow的值成正比。
2. Flex Shrink
與flex-grow相對(duì)的是flex-shrink, flex-shrink用于控制子元素尺寸超過(guò)flex container后,對(duì)子元素的壓縮。請(qǐng)看示例:
修改box的寬度為flex container的1/3,one、two、three的flex-shrink分別為1,2,3:
.box{ height: 100px; width: 320px; }
.one{ background: pink; flex-shrink: 1; }
.two{ background: lightgreen; flex-shrink: 2; }
.three{ background: skyblue; flex-shrink: 3; }
當(dāng)窗口正常尺寸時(shí),效果如下:

當(dāng)我們壓縮窗口使其變得更窄后,效果如下:

當(dāng)flex container寬度變?yōu)?40px后,子元素都被不同程度的壓縮了。壓縮后的one、two、three的寬度分別為250px、180px、110px,所以相比于初始寬度320px被壓縮掉的寬度分別為70px、140px、210px,70 : 140 : 210 = 1 : 2 : 3,與flex shrink的值成反比。實(shí)際上壓縮率和flex item的初始尺寸也有關(guān)系,只不過(guò)當(dāng)初始尺寸一樣時(shí)它帶來(lái)的影響被忽略了。
假設(shè)flex shrink為fs,flex item的初始尺寸為is,flex item被壓縮的尺寸為ss,則正確的表達(dá)式為:
fs ∝ is/ss
3. Flex Basis
flex-basis用于設(shè)置flex item的初始寬/高。為什么有width和height還需要重新加一個(gè)flex-basis呢?flex-basis和width/height有如下的區(qū)別:
- flex-basis只能用于flex-item,而width/height可以應(yīng)用于其他類(lèi)型的元素;
- flex-basis和flex-direction有關(guān),當(dāng)flex-direction為row的時(shí),flex-basis設(shè)置的是寬度,當(dāng)flex-direction為column時(shí),flex-basis設(shè)置的是高度;
- 當(dāng)flex item被絕對(duì)定位后(absolute position),flex-basis不起作用,而width/height可以;
- flex-basis可以用于flex的簡(jiǎn)寫(xiě)形式,如:flex: 1 0 200px;
我們來(lái)看一下flex-basis的作用,將css修改如下:
.box{
height: 100px;
flex-grow: 1;
}
.one{
background: pink;
flex-basis: 100px;
}
.two{
background: lightgreen;
flex-basis: 200px;
}
.three{
background: skyblue;
flex-basis: 300px;
}
3個(gè)flex item都在原來(lái)的初始寬度基礎(chǔ)上增加了相同的寬度:

當(dāng)然,這個(gè)例子如果換成使用width也是一樣的效果,但是雖然效果一樣但意義不一樣,所以使用flex布局時(shí)還是應(yīng)該盡量遵守規(guī)范,選合適的人去干正確的事。
4. Order
通過(guò)order屬性我們可以改變flex item的排列順序,例如:
html:
<section id="blocks"> <div class="one">1</div> <div class="two">2</div> <div class="three">3</div> <div class="four">4</div> </section>
css:
#blocks{
display: flex;
margin: 10px;
justify-content: space-between;
}
#blocks div{
flex: 0 0 100px;
padding: 40px 0;
text-align: center;
background: #ccc;
}
默認(rèn)排列順序是按照f(shuō)lex item在html中的出現(xiàn)順序:

當(dāng)我們修改flex item的order值后,flex item會(huì)按照order值升序排列:
css:
.one{ order: 4; }
.two{ order: 3; }
.three{ order: 2; }
.four{ order: 1; }
效果:

結(jié)語(yǔ)
flex就先簡(jiǎn)單介紹到這里,flex很強(qiáng)大也很簡(jiǎn)單,希望大家用的開(kāi)心。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
CSS3中的彈性布局em運(yùn)用入門(mén)詳解 1em等于多少像素
這篇教程將引導(dǎo)大家如何使用em來(lái)創(chuàng)建一個(gè)基本的彈性布局,從而學(xué)習(xí)其如何計(jì)算?又是如何使用em對(duì)層進(jìn)行彈性擴(kuò)展?又是如何擴(kuò)展文本和圖像等內(nèi)容?下在我們就一起帶著這些問(wèn)2021-02-08
css3彈性盒子flex實(shí)現(xiàn)三欄布局的實(shí)現(xiàn)
這篇文章主要介紹了css3彈性盒子flex實(shí)現(xiàn)三欄布局的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起2020-11-12
這篇文章主要介紹了CSS3 Flex 彈性布局實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-11-01
這篇文章主要介紹了css flex 彈性布局詳解的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-02
CSS彈性布局FLEX,媒體查詢(xún)及移動(dòng)端點(diǎn)擊事件的實(shí)現(xiàn)
這篇文章主要介紹了CSS彈性布局FLEX,媒體查詢(xún)及移動(dòng)端點(diǎn)擊事件的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-24




