前端筆記(9)css grid網格布局

Grid 布局的屬性分成兩類。一類定義在容器上面,稱為容器屬性;另一類定義在項目上面,稱為項目屬性。

容器屬性

1. display屬性

指定一個容器采用網格布局

div {
  display: grid;
}
div {
  display: inline-grid; //設置為行內元素
}

注意,設為網格布局以后,容器子元素(項目)的float、display: inline-block、display: table-cell、vertical-align和column-*等設置都將失效。

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

grid-template-columns屬性定義每一列的列寬,grid-template-rows屬性定義每一行的行高。

.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
}
.container {
  display: grid;
  grid-template-columns: 33.33% 33.33% 33.33%;
  grid-template-rows: 33.33% 33.33% 33.33%;
}
.container {
  display: grid;
  grid-template-columns: repeat(3, 100px);
  grid-template-rows: repeat(3, 100px);
}
//grid-template-columns: repeat(2, 100px 20px 80px);

repeat()接受兩個參數,第一個參數是重復的次數(上例是3),第二個參數是所要重復的值。
repeat()重復某種模式也是可以的。


auto-fill auto-fit關鍵字
.container {
  display: grid;
  grid-template-columns(auto-fill,100px);
  grid-template-columns(auto-fit,100px);
}

有時,單元格的大小是固定的,但是容器的大小不確定。如果希望每一行(或每一列)容納盡可能多的單元格,這時可以使用auto-fill關鍵字表示自動填充。
假設容器可以容納n個單元格,但是只有m個項目時(n>m),atuo-fill會生成n個單元格,auto-fit只會生成m個單元格。項目數多于容器單行可容納單元格的情況下兩個屬性作用相同。


fr關鍵字

為了方便表示比例關系,網格布局提供了fr關鍵字(fraction 的縮寫,意為"片段")。如果兩列的寬度分別為1fr和2fr,就表示后者是前者的兩倍。fr可以與絕對長度單位一起使用。

  grid-template-columns: 1fr 2fr 3fr;
  grid-template-columns: 150px 1fr 2fr; //第一列的寬度為150像素,第二列的寬度是第三列的一半。
  grid-template-columns: 1fr 1fr minmax(100px, 1fr); //表示列寬不小于100px,不大于1fr
網格線的名稱

grid-template-columns屬性和grid-template-rows屬性里面,還可以使用方括號,指定每一根網格線的名字,方便以后的引用。
上面代碼指定網格布局為3行 x 3列,因此有4根垂直網格線和4根水平網格線。方括號里面依次是這八根線的名字。
網格布局允許同一根線有多個名字,比如[fifth-line row-5]。
.container {
display: grid;
grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
}

3.row-gap 屬性,column-gap 屬性,gap 屬性

row-gap屬性設置行與行的間隔(行間距),column-gap屬性設置列與列的間隔(列間距)。
gap屬性是column-gap和row-gap的合并簡寫形式。

grid-gap: <grid-row-gap> <grid-column-gap>;
grid-gap:20px 20px;

4.grid-template-areas 屬性

網格布局允許指定"區域"(area),一個區域由單個或多個單元格組成。grid-template-areas屬性用于定義區域。

.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
  grid-template-areas: 'a b c'
                       'd e f'
                       'g h i';
}
//上面代碼將9個單元格分成a、b、c三個區域。
grid-template-areas: 'a a a'
                     'b b b'
                     'c c c';
//如果某些區域不需要利用,則使用"點"(.)表示。
grid-template-areas: 'a . c'
                     'd . f'
                     'g . i';

注意,區域的命名會影響到網格線。每個區域的起始網格線,會自動命名為區域名-start,終止網格線自動命名為區域名-end。
比如,區域名為header,則起始位置的水平網格線和垂直網格線叫做header-start,終止位置的水平網格線和垂直網格線叫做header-end。

5.grid-auto-flow

默認值是row,即"先行后列"。也可以將它設成column,變成"先列后行"。

grid-auto-flow: column;

grid-auto-flow屬性除了設置成row和column,還可以設成row dense和column dense。這兩個值主要用于,某些項目指定位置以后,剩下的項目怎么自動放置。

grid-auto-flow: row;
grid-auto-flow: row dense;

6.justify-items 屬性,align-items 屬性,place-items 屬性

justify-items屬性設置單元格內容的水平位置(左中右),align-items屬性設置單元格內容的垂直位置(上中下)。

.container {
  justify-items: start | end | center | stretch;
  align-items: start | end | center | stretch;
}
  • start:對齊單元格的起始邊緣。
  • end:對齊單元格的結束邊緣。
  • center:單元格內部居中。
  • stretch:拉伸,占滿單元格的整個寬度(默認值)。

place-items屬性是align-items屬性和justify-items屬性的合并簡寫形式。如果省略第二個值,則瀏覽器認為與第一個值相等。

place-items: <align-items> <justify-items>;

7.justify-content 屬性,align-content 屬性,place-content 屬性

justify-content屬性是整個內容區域在容器里面的水平位置(左中右),align-content屬性是整個內容區域的垂直位置(上中下)。

.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;  
}

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

place-content: <align-content> <justify-content>

8.grid-auto-columns 屬性,grid-auto-rows 屬性

有時候,一些項目的指定位置,在現有網格的外部。比如網格只有3列,但是某一個項目指定在第5行。這時,瀏覽器會自動生成多余的網格,以便放置項目。

grid-auto-columns屬性和grid-auto-rows屬性用來設置,瀏覽器自動創建的多余網格的列寬和行高。它們的寫法與grid-template-columns和grid-template-rows完全相同。如果不指定這兩個屬性,瀏覽器完全根據單元格內容的大小,決定新增網格的列寬和行高。

grid-auto-rows: 200px;

9. grid-template和grid

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這六個屬性的合并簡寫形式。

容器屬性

1.grid-column-start 屬性,grid-column-end 屬性,grid-row-start 屬性,grid-row-end 屬性

用于指定項目位置

  • grid-column-start屬性:左邊框所在的垂直網格線
  • grid-column-end屬性:右邊框所在的垂直網格線
  • grid-row-start屬性:上邊框所在的水平網格線
  • grid-row-end屬性:下邊框所在的水平網格線
.item-1 {
  grid-column-start: 2;
  grid-column-end: 4;
}
.item-1 {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 2;
  grid-row-end: 4;
}

這四個屬性的值,除了指定為第幾個網格線,還可以指定為網格線的名字。

.item-1 {
  grid-column-start: header-start;
  grid-column-end: header-end;
}

這四個屬性的值還可以使用span關鍵字,表示"跨越",即左右邊框(上下邊框)之間跨越多少個網格。

.item-1 {
  grid-column-start: span 2;
  // 效果等同于上面(start、end同時存在時優先使用start)
  // grid-column-end: span 2; 
}

使用這四個屬性,如果產生了項目的重疊,則使用z-index屬性指定項目的重疊順序。

2. grid-column 屬性,grid-row 屬性

grid-column屬性是grid-column-start和grid-column-end的合并簡寫形式,grid-row屬性是grid-row-start屬性和grid-row-end的合并簡寫形式。

.item-1 {
  grid-column: 1 / 3;
  grid-row: 1 / 2;
}
/* 等同于 */
.item-1 {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 2;
}

3. grid-area 屬性

grid-area屬性指定項目放在哪一個區域。

.container{
  grid-template-areas: 'a b c'
                       'd e f'
                       'g h i';
}
.item-1{
  grid-area: e;
}

grid-area與grid-column、grid-row同時存在時后指定的生效。

.container{
  grid-template-areas: 'a b c'
                       'd e f'
                       'g h i';
}
.item-1{
  grid-column: 1/2;
  grid-area: e;
  grid-row: 1/2;
}

grid-area屬性還可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并簡寫形式,直接指定項目的位置。

.item {
  grid-area: <row-start> / <column-start> / <row-end> / <column-end>;
}

4. justify-self 屬性,align-self 屬性,place-self 屬性

參考 justify-items 屬性,align-items 屬性,place-items 屬性,針對當前項目使用。

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

推薦閱讀更多精彩內容

  • 網格線(Grid Line) 構成網格結構的分界線。它們既可以是垂直的(“列網格線(column grid lin...
    晚溪呀閱讀 1,212評論 0 0
  • 上一篇,介紹了grid的瀏覽器兼容和重要的幾個概念,接下來繼續介紹grid的容器屬性。 Grid(網格) 屬性目錄...
    codeTao閱讀 2,088評論 0 1
  • CSS Grid(網格) 布局(又稱為 “Grid(網格)” ),是一個二維的基于網格的布局系統它的目標是完全改變...
    諾CIUM閱讀 1,315評論 0 3
  • 簡介 CSS Grid布局 (又名"網格"),是一個基于二維網格布局的系統,旨在改變我們基于網格設計的用戶界面方式...
    咕咚咚bells閱讀 2,538評論 0 4
  • 苦海 翻起愛恨 這世間 難逃命運 一生所愛啊 我終究難得你心 你是我一生所愛 無論過去現在還是未來 我漂泊在蒼山白...
    倉央易安閱讀 158評論 0 0