淺談:CSS Flexbox布局

cover.jpg

前戲

在正式開始接觸彈性盒子布局之前耸棒,我們先稍微寫一點代碼看看效果。

<div class="container">
    <div class="box"></div>
</div>
.container {
    min-height: 100vh;
    display: flex;
}

.box {
    width: 150px;
    height: 150px;
    background: #ffaaaa;
    margin: auto;
}
flexbox居中顯示.png

在這里报辱,我們創(chuàng)建了一個容器和其內(nèi)部的方塊与殃,并將容器display屬性設(shè)置為flex“郑可以看到幅疼,對容器內(nèi)的方塊,我們只是添加了 margin: auto; 這一行代碼鸵赫,便實現(xiàn)了其相對容器水平與垂直上的完全居中衣屏。也就是說躏升,flexbox首先便解決了css一直以來在垂直居中上的痛點辩棒。

Flexbox簡介

先丟一張MDN上面關(guān)于彈性盒布局的介紹圖

沒看懂的話沒有關(guān)系,這里是MDN的官方文檔,認(rèn)真看一睁。
以上


钻弄。。者吁。
啊不是窘俺,沒看懂的話接著往下看。

Flexbox示例

要使用彈性盒布局复凳,首先便要定義一個彈性容器(flex container)瘤泪。彈性容器可以通過設(shè)置display的值為flex或inline-flex定義,其中flex會被外界視為塊級元素育八,而inline-flex則會被視為行內(nèi)元素对途。處在彈性容器內(nèi)部的元素,就被視為彈性項目(flex item).

flex container

在上面的例子中髓棋,container元素已經(jīng)被添加了 display: flex; 屬性实檀,也就是說,container元素已經(jīng)作為一個彈性容器存在按声,而box元素就是一個彈性項目膳犹。
基于上面的例子,我們做一些修改签则。

  • 將box的margin屬性刪掉须床,這里暫時用不到它了。
  • 將原本的1個box元素復(fù)制為6個.

刷新頁面怀愧,我們會發(fā)現(xiàn)6個box元素擠在了一起侨颈,這并不彈性。

在這里芯义,只需要為彈性容器添加一條屬性

.container {
    padding: 20px;
    display: flex;
    justify-content: space-around;
}

刷新頁面哈垢,6個box便已經(jīng)均勻地分布在這一行上了。

justify-content.png

在介紹justify-content屬性之前扛拨,我們先了解一下主軸的概念:

主軸就是彈性項目在彈性容器的排布方向耘分,默認(rèn)是橫向從左到右的,也就是說绑警,在向彈性容器中塞元素的時候求泰,默認(rèn)是從左到右一個一個放好的。 當(dāng)然计盒,主軸的方向是可變的渴频,可以是從右向左,甚至可以是從上到下的北启。主軸的方向由屬性flex-direction控制卜朗。

flex-direction: row | row-reverse | column | column-reverse

而justify-content屬性控制的便是彈性項目在主軸上的對齊方式拔第,之前6個box擠在了一起,是因為該屬性默認(rèn)是向主軸的起點對齊场钉。而后我們將justify-content設(shè)置為space-around蚊俺,作用就是使主軸上的彈性項目均勻分布。

justify-content: flex-start | flex-end | center | space-between | space-around;

接下來我們向容器內(nèi)再加一些方塊逛万。將原來的6個box再復(fù)制一遍泳猬,現(xiàn)在容器內(nèi)有12個方塊了。刷新頁面宇植,我們發(fā)現(xiàn)這些方塊又連成了一片得封,甚至還超出了容器的邊界,這并不彈性指郁。

于是我們需要為彈性容器再添加一條屬性

.container {
    padding: 20px;
    display: flex;
    justify-content: space-around;
    flex-wrap: wrap;
}

.box {
    width: 150px;
    height: 150px;
    background: #ffaaaa;
    margin: 10px 0;
}

為了便于觀察呛每,我們?yōu)閎ox添加一點外邊距。再次刷新坡氯,可以看到多出來的方塊排列到了下一行晨横,而且當(dāng)我們調(diào)整瀏覽器窗口大小時,方塊們會自動排列整齊箫柳。

flex-wrap.png

在這里我們需要了解關(guān)于側(cè)軸的概念:

側(cè)軸是定義彈性容器內(nèi)是否以多行顯示手形,以及多行的排布方向。側(cè)軸的方向與主軸是垂直的悯恍,如果主軸是橫向的库糠,那么側(cè)軸就是縱向的,反之亦然涮毫。側(cè)軸由屬性flex-wrap控制瞬欧,默認(rèn)為單行顯示,也就是不換行罢防。(主軸與側(cè)軸的屬性可以簡寫為flex-flow艘虎。例如 flex-flow: row wrap;)。

flex-wrap: nowrap | wrap | wrap-reverse

側(cè)軸與主軸一樣可以定義行在側(cè)軸線的對齊方式咒吐,由屬性align-content控制野建。

align-content: flex-start | flex-end | center | space-between | space-around | stretch;

接著我們修改幾個方塊的高度,讓它們看起來不那么一樣恬叹。

.box:nth-child(1) {
    height: 200px;
}

.box:nth-child(2) {
    height: 350px;
}

.box:nth-child(1) {
    height: 250px;
}

.box:nth-child(4) {
    height: 300px;
}

可以看到一行的高度是由這一行內(nèi)最高的元素決定的候生,那么怎樣讓元素相對這一行的高度垂直居中呢。

.container {
    padding: 20px;
    display: flex;
    justify-content: space-around;
    flex-wrap: wrap;
    align-items: center;
}
align-items.png

這樣绽昼,就控制了每一行的元素都以該行的中間位置對齊唯鸭。而align-items屬性控制的便是行內(nèi)項目的對齊方式。

align-items: flex-start | flex-end | center | baseline | stretch

flex items

以上介紹的都是為彈性容器定義的屬性硅确,而我們同樣可以為每個彈性容器分別定義不同的屬性目溉。

order:控制彈性項目在彈性容器中布局的順序唠粥。例如我們將原本的最后一個方塊的order值設(shè)置為-1,因為其他方塊的order均為默認(rèn)值0停做,則最后一個方塊將會排在第一位。

order: <integer>

align-self:為單獨的伸縮項目定義在行內(nèi)的對齊方式(對應(yīng)align-items)

align-self: auto | flex-start | flex-end | center | baseline | stretch;

最后的三個屬性都與彈性項目本身的縮放有關(guān)大莫,放在一起來說蛉腌。

我們將上面的示例再稍微改動一下。首先將方塊們都刪掉只厘,留下四個就可以烙丛。然后為了便于觀察,為這四個方塊設(shè)置不同的背景顏色羔味。最后分別為他們添加flex-grow屬性河咽,并設(shè)置不同的值,例如:

.box:nth-child(1) {
    background: #ffaaaa;
    flex-grow: 2;
}

.box:nth-child(2) {
    background: #f2ffaa;
    flex-grow: 1;
}

.box:nth-child(3) {
    background: #aaffc4;
    flex-grow: 4;
}

.box:nth-child(4) {
    background: #c8aaff;
    flex-grow: 3;
}

刷新頁面赋元,我們發(fā)現(xiàn)四個方塊之間沒有了間距忘蟹,并且似乎都寬了不少。

flex-grow.png

不難看出搁凸,flex-grow屬性定義的便是彈性項目的擴展能力媚值。但需要注意的是,flex-grow與其他方塊的值是成比例的护糖。例如上述示例中褥芒,四個方塊的屬性值分別為2您旁、1张峰、4踏兜、3还最,總和為10挣棕,則方塊1擴展能力就是2/10讶踪,它能占用的剩余空間就是1/5的大小零如。而如果只有一個方塊定義了flex-grow屬性溜在,因為其他方塊值均為默認(rèn)值0(不擴展)很澄,那么無論這個方塊的flex-grow屬性為多少漓帅,它都將得到全部的剩余空間。

flex-grow: <number>; /* default 0 */

與之相對應(yīng)的痴怨,就是flex-shrink屬性忙干。該屬性定義彈性項目的收縮能力。在容器縮小時隨著容器等比例縮小浪藻。

flex-shrink: <number>; /* default 1 */

flex-basis:這個屬性定義彈性項目在主軸上所占的長度捐迫。很容易理解,與寬度類似爱葵,但與寬度不同的是施戴,flex-basis是在主軸方向上的長度反浓,也就是說,如果主軸是縱向的赞哗,那么它定義的就是高度(可以這樣理解)雷则。

flex-grow, flex-shrink, flex-basis可以簡寫為flex屬性,例如 flex: 2 2 20%;

結(jié)語

關(guān)于flexbox布局各屬性的詳細(xì)信息如果仍有疑問請手動查閱MDN文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肪笋,一起剝皮案震驚了整個濱河市月劈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌藤乙,老刑警劉巖猜揪,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坛梁,居然都是意外死亡而姐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門划咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拴念,“玉大人,你說我怎么就攤上這事褐缠≌奢海” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵送丰,是天一觀的道長缔俄。 經(jīng)常有香客問我,道長器躏,這世上最難降的妖魔是什么俐载? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮登失,結(jié)果婚禮上遏佣,老公的妹妹穿的比我還像新娘。我一直安慰自己揽浙,他們只是感情好状婶,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馅巷,像睡著了一般膛虫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钓猬,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天稍刀,我揣著相機與錄音,去河邊找鬼。 笑死账月,一個胖子當(dāng)著我的面吹牛综膀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播局齿,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼剧劝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抓歼?” 一聲冷哼從身側(cè)響起讥此,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锭部,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體面褐,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡拌禾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了展哭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片湃窍。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖匪傍,靈堂內(nèi)的尸體忽然破棺而出您市,到底是詐尸還是另有隱情,我是刑警寧澤役衡,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布茵休,位于F島的核電站,受9級特大地震影響手蝎,放射性物質(zhì)發(fā)生泄漏榕莺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一棵介、第九天 我趴在偏房一處隱蔽的房頂上張望钉鸯。 院中可真熱鬧,春花似錦邮辽、人聲如沸唠雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岩睁。三九已至,卻和暖如春揣云,著一層夾襖步出監(jiān)牢的瞬間笙僚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工灵再, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肋层,地道東北人亿笤。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像栋猖,于是被迫代替她去往敵國和親净薛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • H5移動端知識點總結(jié) 閱讀目錄 移動開發(fā)基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,395評論 0 26
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,453評論 0 6
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案蒲拉? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,728評論 1 92
  • 閱讀目錄移動開發(fā)基本知識點 calc基本用法box-sizing的理解及使用理解display:box的布局理解f...
    張憲宇閱讀 1,512評論 0 1
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color肃拜,font,text-align雌团,li...
    wzhiq896閱讀 1,731評論 0 2