上篇文章在寫前端經(jīng)典布局方案時升酣,提到了Flex
和Grid
技術(shù)移稳,接下來就帶著大家一塊去探討一下Flex
和Grid
到底有什么不同韵丑。
先大體介紹一下兩者的作用:
Flex布局:
Flexible Box
的縮寫侯谁,也成為彈性布局
。它是2009年由W3C
提出的新的布局方案堡称,可以響應(yīng)式地實現(xiàn)各種頁面布局瞎抛,目前Flex
技術(shù)已經(jīng)得到了所有瀏覽器的支持
Grid布局:
Grid 布局
又稱為網(wǎng)格布局
,是微軟于 2010 年提出的一種新的布局方式却紧,于2016 年提交了該布局的草案桐臊。經(jīng)過近幾年發(fā)展钞艇,兼容性越來越好
一. Flex布局
想必很多小伙伴對于Flex
布局已經(jīng)很熟悉了,接下來從基本概念豪硅、語法屬性兩方面去介紹Flex
的使用
1.基本概念
容器
:任何一個容器(盒子)都可以指定為Flex容器
,也就是說挺物,想要使用Flex
懒浮,前提條件是把這個盒子聲明為Flex容器
容器成員(項目)
:Flex容器
中的所有子元素我們稱之為容器成員
,也叫作項目(item)
.box {
/* 這樣就把.box這個盒子聲明為一個Flex容器了 */
display: flex;
}
注意识藤,設(shè)為 Flex 布局以后砚著,子元素的
float
、clear
和vertical-align
等屬性都將失效痴昧。
Flex容器
默認(rèn)存在兩條軸:
- 水平的主軸
- 垂直的交叉軸
Flex
布局中的項目稽穆,默認(rèn)沿主軸排列
讓人感覺難的,并不是對Flex布局
的理解赶撰,而是里面諸多的語法屬性
2. 語法屬性
2.1 應(yīng)用在容器
上的屬性
-
flex-direction
- 作用:設(shè)置主軸的方向
- 取值:
-
row(默認(rèn)值)
:主軸為水平方向舌镶,起點在左端 -
row-reverse
:主軸為水平方向,起點在右端 -
column
:主軸為垂直方向豪娜,起點在上沿 -
column-reverse
:主軸為垂直方向餐胀,起點在下沿
-
-
flex-wrap
- 作用:控制
項目
在主軸上如何換行 - 取值:
-
nowrap
:不換行 -
wrap
:換行,第一行在上面 -
wrap-reverse
:換行瘤载,第一行在下面
-
- 作用:控制
-
justify-content
- 作用:控制
項目
在主軸上的對齊方式 - 取值:
-
flex-start
(默認(rèn)值):左對齊 -
flex-end
:右對齊 -
center
: 居中 -
space-between
:兩端對齊否灾,項目之間的間隔相等 -
space-around
:兩側(cè)對齊,每個項目兩側(cè)的間隔相等鸣奔,項目之間的間隔比項目與邊框的間隔大一倍
-
- 作用:控制
-
align-items
- 作用:設(shè)置
項目
在交叉軸上的對齊方式 - 取值:
-
flex-start
:交叉軸的起點對齊 -
flex-end
:交叉軸的終點對齊 -
center
:交叉軸的中點對齊 -
baseline
: 項目的第一行文字的基線對齊 -
stretch
(默認(rèn)值):如果項目未設(shè)置高度或設(shè)為auto墨技,將占滿整個容器的高度
-
- 作用:設(shè)置
當(dāng)然,Flex容器
上還有兩個不太常用的屬性挎狸,分別是:
-
flex-flow
- 作用:是
flex-direction
和flex-wrap
的簡寫扣汪,默認(rèn)值為row nowrap
- 作用:是
-
align-content
- 作用:控制多根軸線的對齊方式。如果項目只有一根軸線伟叛,該屬性是無效的
2.2 應(yīng)用在項目
上的屬性
-
order
- 作用:設(shè)置
項目
的排列順序私痹,數(shù)值越小,排列的順序越靠前
- 作用:設(shè)置
-
flex-grow
- 作用:控制
項目
的放大比例统刮,默認(rèn)為0
- 作用:控制
-
flex-shrink
- 作用:控制
項目
的縮小比例紊遵,默認(rèn)為1
- 作用:控制
-
flex-basis
- 作用:控制
項目
占據(jù)的主軸空間,可設(shè)置固定的width
和height
侥蒙,默認(rèn)為auto
- 作用:控制
-
flex
- 作用:
flex-grow
暗膜、flex-shrink
和flex-basis
的簡寫,默認(rèn)為0 1 auto
鞭衩。后兩個屬性可選 - 注意:該屬性有兩個快捷值:
auto
和none
学搜,分別對應(yīng)1 1 auto
和0 0 auto
娃善,建議優(yōu)先使用快捷值寫法
- 作用:
-
align-self
- 作用:設(shè)置項目的對齊方式
- 取值:除了
auto
,其它取值均與align-items
屬性取值完全一致-
auto
(默認(rèn)值):表示繼承父元素的align-items
屬性瑞佩,如果沒有父元素聚磺,則等同于stretch
flex-start
flex-end
center
baseline
stretch
-
3. Flex
的特點
從以上的語法不難看出,Flex
布局擁有主軸
和交叉軸
所有的項目
都是依托于兩個軸進(jìn)行位置排列的炬丸,所以可以把Flex
布局看成是一種"軸線布局
"
從
維度
的角度上看瘫寝,Flex
布局也是一維布局
二. Grid布局
1. 基本概念
Grid
布局跟Flex
布局一樣,也存在容器
和項目
的概念稠炬。
除此之外焕阿,
Grid
布局中還有行
、列
首启、單元格
暮屡、網(wǎng)格線
的概念
1.1 行和列
容器
里面的水平區(qū)域稱為"行
"(row
),垂直區(qū)域稱為"列
"(column
)
1.2 單元格
容器
中行
和列
的交匯點叫做單元格(cell)
1.3 網(wǎng)格線
水平網(wǎng)格線劃分出
行
毅桃,垂直網(wǎng)格線劃分出列
x
行有x + 1
條水平網(wǎng)格線褒纲;y
列有y + 1
條垂直網(wǎng)格線
如圖:2行有3條水平網(wǎng)格線,3列有4條垂直網(wǎng)格線
2. 語法屬性
??
Grid
布局中關(guān)于容器
和項目
的屬性很多很多T糠伞M獬А!膽小勿入4小V! ??
2.1 應(yīng)用在容器
上的屬性
中國人不騙中國人论悴,相信我掖棉,你一定會崩潰的 ??
display: grid;
-
grid-template-columns
、grid-template-rows
-
grid-row-gap
膀估、grid-column-gap
幔亥、grid-gap
grid-template-areas
grid-auto-flow
-
justify-items
、align-items
察纯、place-items
-
justify-content
帕棉、align-content
、place-content
-
grid-auto-columns
饼记、grid-auto-rows
-
grid-template
香伴、grid
言簡意賅,給大家以最舒服具则、最簡潔的方式總結(jié)一下(輕點噴...)
display: grid;
用來聲明盒子為網(wǎng)格布局grid-template-columns
定義每一列的列寬即纲,grid-template-rows
定義每一行的行高grid-row-gap
和grid-column-gap
分別設(shè)置行間距和列間距,grid-gap
是它倆的合并簡寫形式grid-template-areas
用來劃定區(qū)域grid-auto-flow
用來指定項目
的排列順序博肋,可以通過該屬性實現(xiàn)各種各樣的排列效果低斋,很實用蜂厅!justify-items
和align-items
分別控制單元格內(nèi)容的水平和垂直對齊,place-items
是它倆的合并簡寫形式justify-content
和align-content
控制整個內(nèi)容區(qū)域在容器中的水平和垂直位置膊畴,place-content
是它倆的合并簡寫形式grid-auto-columns
和grid-auto-rows
用來設(shè)置瀏覽器自動創(chuàng)建的多余網(wǎng)格的列寬和行高grid-template
是grid-template-columns
掘猿、grid-template-rows
和grid-template-areas
這三個屬性的合并簡寫形式grid
屬性是grid-template-rows
、grid-template-columns
唇跨、grid-template-areas
术奖、grid-auto-rows
、grid-auto-columns
轻绞、grid-auto-flow
這六個屬性的合并簡寫形式
第9和第10項,因為合并的屬性比較多佣耐,從易讀政勃、易寫的角度上看,不建議使用合并屬性
2.2 應(yīng)用在項目
上的屬性
-
grid-column-start
兼砖、grid-column-end
奸远、grid-row-start
、grid-row-end
-
grid-column
讽挟、grid-row
grid-area
-
justify-self
懒叛、align-self
、place-self
grid-column-start
耽梅、grid-column-end
薛窥、grid-row-start
、grid-row-end
用來指定項目
的四個邊框在哪根網(wǎng)格線眼姐,從而設(shè)置項目
的位置诅迷。此設(shè)置可以實現(xiàn)各種排列組合,很實用众旗!grid-column
屬是grid-column-start
和grid-column-end
的合并簡寫形式罢杉,grid-row
屬性是grid-row-start
屬性和grid-row-end
的合并簡寫形式grid-area
指定項目
放在哪一個區(qū)域。grid-area
還可用作grid-row-start
贡歧、grid-column-start
滩租、grid-row-end
、grid-column-end
的合并簡寫形式利朵,直接指定項目的位置-
justify-self
設(shè)置單元格內(nèi)容的水平位置律想,跟justify-items
屬性的用法完全一致,但只作用于單個項目align-self
設(shè)置單元格內(nèi)容的垂直位置绍弟,跟align-items
屬性的用法完全一致蜘欲,也是只作用于單個項目place-self
是align-self
和justify-self
的合并簡寫形式。
3. Grid
的特點
其實從Grid
布局的基本概念可以看出晌柬,Grid
布局將容器劃分成"行
"和"列
"姥份,并產(chǎn)生單元格
郭脂,然后指定"項目所在
"的單元格
,可以看作是二維布局
由于可以主動的去指定項目
所處的區(qū)域(位置)澈歉,所以我們在進(jìn)行復(fù)雜結(jié)構(gòu)布局時展鸡,Grid
布局很顯然要比Flex
布局的操作性強,更容易也更方便的實現(xiàn)各種復(fù)雜且好看的布局
雖然從布局的操作性和復(fù)雜度上來看埃难,
Grid
布局要比Flex
布局強大莹弊!但是你不能避免
Grid
布局這個"老六"所帶來的一些瀏覽器兼容性、響應(yīng)式設(shè)計涡尘、性能優(yōu)化等一系列的問題
三. 兩者的對比總結(jié)
區(qū)別
-
Flex
布局是一維布局
忍弛,Grid
布局是二維布局
- 從布局的操作性和復(fù)雜度上看,
Grid
布局要強于Flex
布局 -
Grid
布局具有兼容性問題考抄,不友好 - 從學(xué)習(xí)時間成本上看细疚,因
Grid
布局的屬性要遠(yuǎn)多于Flex
布局,所以Grid
布局的學(xué)習(xí)時間成本要大一些
相同
- 兩者均是目前布局方案中的主流川梅,因其各自的特點疯兼,應(yīng)用的場景也不盡相同