CSS 終極之戰(zhàn):Grid VS Flexbox

簡評:近些年 CSS Flexbox 在前端開發(fā)者中變得非常流行。其實并不奇怪茅姜,它能讓我們更容易創(chuàng)建出動態(tài)布局予弧,以及在容器中對其內容。然而城里新來了個小伙叫 CSS Grid移必,它有許多彈性盒的能力,有時候比彈性盒好用毡鉴,有時候卻不好用崔泵。作者點評了彈性盒秒赤、網(wǎng)格兩者之間的差異,以及什么時候用哪種比較好憎瘸。

先來看下這節(jié)課的截屏預告:

一維 VS 二維

如果你想從這篇文章中學到精髓入篮,下面的就是:

Flexbox 是為一維布局設計的,而 Grid 是為二維布局設計幌甘。

這意味著如果你想要在一個方向上放置項目(比如在標題欄中有三個按鈕)潮售,那么你應該用Flexbox:

它會比 CSS Grid 更加靈活,同時只需要更少的代碼含潘,更容易維護饲做。

然而,當你需要在兩個維度 —— 行和列上創(chuàng)建整個布局時遏弱,那么你應該使用 CSS Grid:

這種情況下, CSS Grid 會更加靈活塞弊,讓你的標記更加簡單漱逸。代碼也更容易維護。

當然你可以結合兩者使用游沿。上面的例子中將會完美地使用 Grid 做頁面布局饰抒,用 Flexbox 來對齊標題欄中的內容。在文末诀黍,我會確切地展示如何做到這點袋坑。

內容優(yōu)先 VS 布局優(yōu)先

另一個核心區(qū)別在于:Flexbox 以內容為基礎,而 Grid 以布局為基礎眯勾。這看起來有點抽象枣宫,所以讓我們來看看確切地例子,這會更容易理解吃环。

我們會使用之前的 header也颤, HTML 代碼如下:

<header>
    <div>Home</div>
    <div>Search</div>
    <div>Logout</div>
</header>

在我們進入 Flexbox 布局之前,這些 div 是相互疊在一起的:

Flexbox header

然而郁轻,當我們給一個 display: flex 樣式時翅娶,這些元素就會排成一行。

header {
    display: flex;
}

為了將登出按鈕移動到最右邊好唯,我們只需要找到那個元素竭沫,然后給一個外邊距:

header > div:nth-child(3) {
    margin-left: auto;
}

結果如下:

這里我希望你們注意一下:我們讓這些元素自己決定它們該如何放置。除了最初的 display: flex; 我們不需要預定義任何東西骑篙。

這是 Flexbox 和 Grid 的核心差異蜕提,當我們用 Grid 重新創(chuàng)建 header 時,這點會更明顯替蛉。

即便 CSS Grid 不是用來創(chuàng)建一維的 header贯溅,它在這篇文章中仍然是一個很好的練習拄氯,讓我們明白 Flexbox 和 Grid 的核心差異。

Grid header

使用 CSS Grid它浅,我們可以有好幾種方式來創(chuàng)建 header译柏。我將使用相當直接的一種,我們的網(wǎng)格有 10 列姐霍,每列寬度為 1 個單元:

header {
    display: grid;
    grid-template-columns: repeat(10, 1fr);
}

和 Flexbox 的方案看起來完全一樣鄙麦。

但是,我們可以看看底下有哪些不同镊折。我們將使用 Chrome 檢查器來檢查列:

關鍵不同在于這種方式先定義了列 —— 即布局胯府。我們先定義了列的寬度,然后把內容放到可用的網(wǎng)格里恨胚。

這種方式迫使我們將 header 分割成多少列骂因。

除非我們改變網(wǎng)格,我們被 10 列網(wǎng)格限制了赃泡。而使用 Flexbox 則不會面臨這種限制寒波。

為了將登出按鈕放到最右邊,我們需要把它放在第 10 列:

header > div:nth-child(3) {
    grid-column: 10;
}

檢查網(wǎng)格時看起來是這樣:

我們不能簡單地給一個 margin-left: auto; 因為登出按鈕已經(jīng)被放在布局中的確切的格子中升熊,在第三列俄烁。為了移動它,我們要找到另一個格子级野。

結合兩者

現(xiàn)在看下如何將兩者結合起來页屠,將我們的 header 合并到我們的網(wǎng)站布局。我們從構建網(wǎng)站布局開始:

HTML 標記:

<div class="container">
  <header>HEADER</header>
  <aside>MENU</aside>
  <main>CONTENT</main>
  <footer>FOOTER</footer>
</div>

CSS :

.container {
    display: grid;    
    grid-template-columns: repeat(12, 1fr);
    grid-template-rows: 50px 350px 50px;
}

項目樣式:

header {
    grid-column: span 12;
}
aside {
    grid-column: span 2;
}
main {
    grid-column: span 10;
}
footer {
    grid-column: span 12;
}

現(xiàn)在添加 header蓖柔。我們把 header —— CSS Grid 中的一個項目轉換為 Flexbox 容器辰企。

header {
    display: flex;
}

現(xiàn)在可以把登出按鈕設置到右邊了:

header > div:nth-child(3) {
    margin-left: auto;
}

現(xiàn)在兩個容器看起來是這樣的:

現(xiàn)在你應該深刻地理解了 Flexbox 和 Grid 的不同之處,并且知道如何使用它們了渊抽。

瀏覽器支持

最后蟆豫,我想提一下瀏覽器支持。在寫這篇文章時懒闷,全球網(wǎng)站流量的 77% 支持 CSS Grid十减,并且還在增加。我相信 2018 將會是 CSS Grid 時代愤估,它會有一個突破帮辟,并成為前端開發(fā)者的必備技能。就像前幾年的 CSS Flexbox 那樣玩焰。源代碼鏈接

英文原文The ultimate CSS battle: Grid vs Flexbox
舊文推薦: 如何用 CSS 網(wǎng)格快速做出網(wǎng)站原型

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末由驹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔓榄,老刑警劉巖并炮,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甥郑,居然都是意外死亡逃魄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門澜搅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伍俘,“玉大人,你說我怎么就攤上這事勉躺“” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵饵溅,是天一觀的道長妨退。 經(jīng)常有香客問我,道長概说,這世上最難降的妖魔是什么碧注? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮糖赔,結果婚禮上,老公的妹妹穿的比我還像新娘轩端。我一直安慰自己放典,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布基茵。 她就那樣靜靜地躺著奋构,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拱层。 梳的紋絲不亂的頭發(fā)上弥臼,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音根灯,去河邊找鬼径缅。 笑死,一個胖子當著我的面吹牛烙肺,可吹牛的內容都是我干的纳猪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桃笙,長吁一口氣:“原來是場噩夢啊……” “哼氏堤!你這毒婦竟也來了?” 一聲冷哼從身側響起搏明,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鼠锈,失蹤者是張志新(化名)和其女友劉穎闪檬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體购笆,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡粗悯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了由桌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片为黎。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖行您,靈堂內的尸體忽然破棺而出铭乾,到底是詐尸還是另有隱情,我是刑警寧澤娃循,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布炕檩,位于F島的核電站,受9級特大地震影響捌斧,放射性物質發(fā)生泄漏笛质。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一捞蚂、第九天 我趴在偏房一處隱蔽的房頂上張望妇押。 院中可真熱鬧,春花似錦姓迅、人聲如沸敲霍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肩杈。三九已至,卻和暖如春解寝,著一層夾襖步出監(jiān)牢的瞬間扩然,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工聋伦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留夫偶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓嘉抓,卻偏偏與公主長得像索守,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抑片,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案卵佛? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,754評論 1 92
  • 簡介 CSS Grid布局 (又名"網(wǎng)格"),是一個基于二維網(wǎng)格布局的系統(tǒng),旨在改變我們基于網(wǎng)格設計的用戶界面方式...
    咕咚咚bells閱讀 2,505評論 0 4
  • 簡介CSS網(wǎng)格布局(又稱“網(wǎng)格”)截汪,是一種二維網(wǎng)格布局系統(tǒng)疾牲。CSS在處理網(wǎng)頁布局方面一直做的不是很好。一開始我們用...
    _leonlee閱讀 65,034評論 25 173
  • DEMO 地址:【傳送門】 示例下載地址: 【傳送門】 不久以前衙解,所有 HTML 頁面的布局還都是通過 table...
    IT程序獅閱讀 10,326評論 3 47
  • “我希望你不要變得像我一樣蚓峦,我希望你的人生要比爸爸精彩舌剂,也就變得越來越期待了吧。 我希望你的個子比爸爸高暑椰。就算我座...
    z昭和閱讀 456評論 0 1