CSS面試考點之Flex布局和Grid網(wǎng)格布局

1、flexbox(彈性盒布局模型)

Flexible Box?簡稱?flex,意為”彈性布局”,可以簡便、完整、響應(yīng)式地實現(xiàn)各種頁面布局。采用Flex布局的元素,稱為flex容器container。它的所有子元素自動成為容器成員,稱為flex項目item。

容器中默認存在兩條軸,主軸和交叉軸,呈90度關(guān)系。項目默認沿主軸排列,通過flex-direction來決定主軸的方向。

關(guān)于flex常用的屬性,我們可以劃分為容器屬性和容器成員屬性

容器屬性

1)flex-direction

決定主軸的方向(即項目的排列方向)。

屬性對應(yīng)如下:

a、row(默認值):主軸為水平方向,起點在左端。

b、row-reverse:主軸為水平方向,起點在右端。

c、column:主軸為垂直方向,起點在上沿。

d、column-reverse:主軸為垂直方向,起點在下沿。

2)flex-wrap

彈性元素永遠沿主軸排列,那么如果主軸排不下,通過flex-wrap決定容器內(nèi)項目是否可換行。

屬性對應(yīng)如下:

a、nowrap(默認值):不換行。

b、wrap:換行,第一行在上方。

c、wrap-reverse:換行,第一行在下方。

默認情況是不換行,但這里也不會任由元素直接溢出容器,會涉及到元素的彈性伸縮。會自動縮小盒子寬度使其一行顯示,縮小最小范圍為父元素的寬度。

當設(shè)置為 flex-wrap: wrap; 就是換行。

flex-flow是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為row nowrap。

3)justify-content

定義了項目在主軸上的對齊方式。

屬性對應(yīng)如下:

a、flex-start(默認值):左對齊。

b、flex-end:右對齊。

c、center:居中。

d、space-between:兩端對齊,項目之間的間隔都相等。

e、space-around:兩個項目兩側(cè)間隔相等。

默認
center
spac-between
space-around

4)align-items

定義項目在交叉軸上如何對齊。

屬性對應(yīng)如下:

a、flex-start:交叉軸的起點對齊

b、flex-end:交叉軸的終點對齊

c、center:交叉軸的中點對齊

d、baseline: 項目的第一行文字的基線對齊

e、stretch(默認值):如果項目未設(shè)置高度或設(shè)為auto,將占滿整個容器的高度。

如果flex-items沒有定義高度,在垂直方向上默認會拉伸和父盒子一樣的高度。也就是align-items:stretch、normal。

flex-end

5)align-content

定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。

屬性對應(yīng)如嚇:

a、flex-start:與交叉軸的起點對齊。

b、flex-end:與交叉軸的終點對齊。

c、center:與交叉軸的中點對齊。

d、space-between:與交叉軸兩端對齊,軸線之間的間隔平均分布。

e、space-around:每根軸線兩側(cè)的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。

f、stretch(默認值):軸線占滿整個交叉軸。

容器屬性

1)order

定義項目的排列順序。數(shù)值越小,排列越靠前,默認為0。

2)flex-grow

上面講到當容器設(shè)為flex-wrap: nowrap;不換行的時候,容器寬度有不夠分的情況,彈性元素會根據(jù)flex-grow來決定。定義項目的放大比例(容器寬度>元素總寬度時如何伸展),默認為0,即如果存在剩余空間,也不放大。

如果所有項目的flex-grow屬性都為1,則它們將等分剩余空間(如果有的話)

如果一個項目的flex-grow屬性為2,其他項目都為1,則前者占據(jù)的剩余空間將比其他項多一倍。

3)flex-shrink

定義了項目的縮小比例(容器寬度<元素總寬度時如何收縮),默認為1,即如果空間不足,該項目將縮小。

如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。

如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。

4)flex-basis

設(shè)置的是元素在主軸上的初始尺寸,所謂的初始尺寸就是元素在flex-grow和flex-shrink生效前的尺寸。

瀏覽器根據(jù)這個屬性,計算主軸是否有多余空間,默認值為auto,即項目的本來大小,如設(shè)置了width則元素尺寸由width/height決定(主軸方向),沒有設(shè)置則由內(nèi)容決定。

當設(shè)置為0的是,會根據(jù)內(nèi)容撐開。

它可以設(shè)為跟width或height屬性一樣的值(比如350px),則項目將占據(jù)固定空間。

5)flex

flex是flex-grow、flex-shrink、flex-basis的縮寫。

flex-grow 定義項目的的放大比例,用來“瓜分”父項的“剩余空間”。當父元素的寬度大于所有子元素的寬度的和時(即父元素會有剩余空間),子元素如何索取分配父元素的剩余空間。值越大,索取的越厲害。

a、默認為0,即 即使存在剩余空間,也不會放大;

b、所有項目的flex-grow為1:等分剩余空間(自動放大占位);

c、flex-grow為n的項目,占據(jù)的空間(放大的比例)是flex-grow為1的n倍。

flex-shrink 定義項目的縮小比例,用來“吸收”超出的空間。父元素的寬度小于所有子元素的寬度的和時(即子元素會超出父元素),子元素如何縮小自己的寬度的。值越大,減小的越厲害。

a、默認為1,即 如果空間不足,該項目將縮小;

b、所有項目的flex-shrink為1:當空間不足時,縮小的比例相同;

c、flex-shrink為0:空間不足時,該項目不會縮小;

d、flex-shrink為n的項目,空間不足時縮小的比例是flex-shrink為1的n倍。

flex-basis 用于設(shè)置子項的占用空間,在分配多余空間之前,項目占據(jù)的主軸空間(main size),瀏覽器根據(jù)此屬性計算主軸是否有多余空間。該屬性用來設(shè)置元素的寬度,其實,width也可以設(shè)置寬度。如果元素上同時設(shè)置了width和flex-basis,那么width 的值就會被flex-basis覆蓋掉。

a、默認值為auto,即 項目原本大小;

b、設(shè)置后項目將占據(jù)固定空間。

flex 的不同取值

a、flex屬性的默認值為:0 1 auto (不放大會縮小);

b、flex為none:0 0 auto ?(不放大也不縮小);

c、flex為auto:1 1 auto ?(放大且縮小);

d、flex為一個非負數(shù)字n:該數(shù)字為flex-grow的值。

?flex:n;===? flex-grow:n;flex-shrink:1;flex-basis:0%;

e、flex為兩個非負數(shù)字n1n2: 分別為flex-grow和flex-shrink的值

flex:n1 n2;? ===? flex-grow:n1;flex-shrink:n2;flex-basis:0%;

f、flex為一個長度或百分比L:視為flex-basis的值,

flex: L;? ===? flex-grow:1;flex-shrink:1;flex-basis:L;

g、flex為一個非負數(shù)字n和一個長度或百分比L:分別為flex-grow和flex-basis的值。

?flex:n L;===? flex-grow:n;flex-shrink:1;flex-basis:L;

flex:1即為flex-grow:1,自動放大占滿剩余空間。

6)align-self

許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。

2、網(wǎng)格布局

Grid?布局即網(wǎng)格布局,是一個二維的布局方式,由縱橫相交的兩組網(wǎng)格線形成的框架性布局結(jié)構(gòu),能夠同時處理行與列。擅長將一個頁面劃分為幾個主要區(qū)域,以及定義這些區(qū)域的大小、位置、層次等關(guān)系。

設(shè)置display:grid/inline-grid的元素就是網(wǎng)格布局容器,這樣就能出發(fā)瀏覽器渲染引擎的網(wǎng)格布局算法。

Grid?布局屬性可以分為兩大類:容器屬性,項目屬性。

容器屬性

1)display 屬性

在元素上設(shè)置display:grid?或?display:inline-grid來創(chuàng)建一個網(wǎng)格容器。

a、display:grid 則該容器是一個塊級元素;

b、display:inline-grid 則容器元素為行內(nèi)元素。

2)grid-template-columns 屬性,grid-template-rows 屬性

grid-template-columns:屬性設(shè)置列寬;

grid-template-rows:屬性設(shè)置行高。

以上表示固定列寬為 200px 200px 200px,行高為 50px 50px。

上述代碼可以看到重復(fù)寫單元格寬高,通過使用repeat()函數(shù),可以簡寫重復(fù)的值

a、第一個參數(shù)是重復(fù)的次數(shù);

b、第二個參數(shù)是重復(fù)的值。

grid-template-columns:200px 1fr 2fr?表示第一個列寬設(shè)置為 200px,后面剩余的寬度分為兩部分,寬度分別為剩余寬度的 1/3 和 2/3。fr:片段,為了方便表示比例關(guān)系。

grid-template-columns: 100px auto 100px表示第一第三列為 100px,中間由瀏覽器決定長度。

3)grid-row-gap 屬性, grid-column-gap 屬性, grid-gap 屬性

grid-row-gap?屬性、grid-column-gap?屬性分別設(shè)置行間距和列間距。grid-gap?屬性是兩者的簡寫形式。

grid-row-gap: 10px?表示行間距是 10px

grid-column-gap: 20px?表示列間距是 20px

grid-gap: 10px 20px等同上述兩個屬性。

4)grid-auto-flow 屬性

容器的子元素會按照順序,自動放置在每一個網(wǎng)格。順序就是由grid-auto-flow決定,默認為行,代表"先行后列",即先填滿第一行,再開始放入第二行。

當修改成column后

5)justify-items 屬性, align-items 屬性, place-items 屬性

justify-items?屬性設(shè)置單元格內(nèi)容的水平位置(左中右);

align-items?屬性設(shè)置單元格的垂直位置(上中下)。

place-items屬性是align-items屬性和justify-items屬性的合并簡寫形式。

屬性值

a、start:對齊單元格的起始邊緣

b、end:對齊單元格的結(jié)束邊緣

c、center:單元格內(nèi)部居中

d、stretch:拉伸,占滿單元格的整個寬度(默認值)

6)justify-content 屬性, align-content 屬性, place-content 屬性

justify-content屬性是整個內(nèi)容區(qū)域在容器里面的水平位置(左中右);

align-content屬性是整個內(nèi)容區(qū)域的垂直位置(上中下)。

屬性值有:

a、start - 對齊容器的起始邊框;

b、end - 對齊容器的結(jié)束邊框;

c、center - 容器內(nèi)部居中;

e、space-around - 每個項目兩側(cè)的間隔相等。所以,項目之間的間隔比項目與容器邊框的間隔大一倍;

f、space-between - 項目與項目的間隔相等,項目與容器邊框之間沒有間隔;

g、space-evenly - 項目與項目的間隔相等,項目與容器邊框之間也是同樣長度的間隔;

h、stretch - 項目大小沒有指定時,拉伸占據(jù)整個網(wǎng)格容器。

.

項目屬性

1)grid-column-start 屬性、grid-column-end 屬性、grid-row-start 屬性以及grid-row-end 屬性

指定網(wǎng)格項目所在的四個邊框,分別定位在哪根網(wǎng)格線,從而指定項目的位置

grid-column-start 屬性:左邊框所在的垂直網(wǎng)格線

grid-column-end 屬性:右邊框所在的垂直網(wǎng)格線

grid-row-start 屬性:上邊框所在的水平網(wǎng)格線

grid-row-end 屬性:下邊框所在的水平網(wǎng)格線

通過設(shè)置grid-column屬性,指定1號項目的左邊框是第二根垂直網(wǎng)格線,右邊框是第四根垂直網(wǎng)格線

2)justify-self 屬性、align-self 屬性以及 place-self 屬性

justify-self屬性設(shè)置單元格內(nèi)容的水平位置(左中右),跟justify-items屬性的用法完全一致,但只作用于單個項目。

align-self屬性設(shè)置單元格內(nèi)容的垂直位置(上中下),跟align-items屬性的用法完全一致,也是只作用于單個項目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374