CSS:Grid布局

2018-06-19 18:44 更新
CSS Grid布局,是一個基于網(wǎng)格的二維布局系統(tǒng),目的是用來優(yōu)化用戶界面設(shè)計。

不過,目前任何瀏覽器默認(rèn)是不支持Grid布局的,但幸運的是,我們可以設(shè)置Chrome、Opera或者Firefox的特殊標(biāo)志來啟用它。在Chrome或Opera中,在地址欄中輸入chrome://flags(opera://flags),然后將experimental web platform features 選項設(shè)置為enable;在Firefox中,將layout.css.grid.enabled選項設(shè)置為可用。


注意!注意!重磅消息,在2017年3月左右,大部分瀏覽器都會開始默認(rèn)支持Grid布局,所以,現(xiàn)在完全有必要開始學(xué)習(xí)Grid布局。

網(wǎng)上關(guān)于Grid布局的資料已經(jīng)很多了,本文只是用來記錄一下Grid布局的相關(guān)屬性和用法,防止別人的網(wǎng)站在某一天掛掉。

1、啟用網(wǎng)格容器

我們使用display屬性來定義一個網(wǎng)格容器,它的grid值決定了容器展現(xiàn)為塊級還是內(nèi)聯(lián)形式。一旦啟用網(wǎng)格容器,它的所有子元素都進入grid文檔流,稱為網(wǎng)格子項。

display: grid | inline-grid | subgrid

  • grid:定義一個塊級的網(wǎng)格容器
  • inline-grid:定義一個內(nèi)聯(lián)的網(wǎng)格容器
  • subgrid:定義一個繼承其父級網(wǎng)格容器的行和列的大小的網(wǎng)格容器,它是其父級網(wǎng)格容器的一個子項。

注意:column, float, clear和vertical-align對網(wǎng)格容器沒有效果。

簡單術(shù)語介紹:

每一塊表示一個網(wǎng)格子項(網(wǎng)格單元),4個(任意數(shù)量)網(wǎng)格子項組成了網(wǎng)格區(qū)域。

2、網(wǎng)格容器的屬性

2.1 grid-template-columns/grid-template-rows

詞法:

grid-template-columns: <track-size> ... | <line-name> <track-size> ...;

grid-template-rows: <track-size> ... | <line-name> <track-size> ...;

  • <track-size>:定義網(wǎng)格單元的寬高,其單位可以是一個長度(如px、em、rem、vw、vh)或百分比,也可以是網(wǎng)格中自由空間的份數(shù)(單位為fr)。
  • <line-name>:定義網(wǎng)格線的名稱,它不是必須值??梢砸粋€你選擇的任意名字,當(dāng)沒有顯示設(shè)定時,它的名字以數(shù)字表示。

實例:
當(dāng)你在軌跡值中間留空格,網(wǎng)格線將被自動以數(shù)字命名:

.container{   

  grid-template-columns: 40px 50px auto 50px 40px;

  grid-template-rows: 25% 100px auto;

}


當(dāng)然,我們還可以給網(wǎng)格線指定一個名字:

.container{   

  grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];   

  grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];  

}


注意:網(wǎng)格線命名時必須加上中括號

一根網(wǎng)格線還可以有多個名字,以空格隔開,中括號包裹:

.container{   

  grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];  

}

如果你定義了容器的重復(fù)部分,你可以使用repeat()方法來生成多個相同值:

.container{   

  grid-template-columns: repeat(3, 20px [col-start]) 5%;  

}


/* 等價于 */

.container{   

  grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start] 5%;  

}


特殊單元:fr

fr單元允許你將網(wǎng)格容器中的自由空間設(shè)置為一個份數(shù):

.container{   

  grid-template-columns: 1fr 1fr 1fr;  

}

在上面的代碼中,將網(wǎng)格容器的每個子項設(shè)置為三分之一。

注意:自由空間是在固定子項確定后開始計算的

.container{   

  grid-template-columns: 1fr 50px 1fr 1fr;  

}

在上面的代碼中,自由空間是fr單位的總和但不包括50px。

2.2 grid-template-areas

grid-template-areas可以配合grid-area定義一個顯式的網(wǎng)格區(qū)域。grid-template-areas定義網(wǎng)格區(qū)域,然后使用grid-area調(diào)用聲明好的網(wǎng)格區(qū)域名稱來放置對應(yīng)的網(wǎng)格項目。

詞法:

grid-template-areas: "<grid-area-name> | . | none | ..." "..." 

  • <grid-area-name>:在grid-area中指定的網(wǎng)格區(qū)域名字
  • .:一個句點表示一個空的網(wǎng)格單元
  • none:沒有網(wǎng)格區(qū)域被定義

實例:

<div class="container">   

  <div class="item-a"></div>   

  <div class="item-b"></div>   

  <div class="item-c"></div>   

  <div class="item-d"></div>   

</div>

設(shè)置CSS樣式:

.item-a{   

  grid-area: header;  

}  

.item-b{   

  grid-area: main; 

}  

.item-c{   

  grid-area: sidebar; 

}  

.item-d{   

  grid-area: footer; 

}  

.container{    

  width: 300px;

  height:200px;   

  display:grid;   

  grid-template-columns: 1fr 1fr 1fr 1fr;   

  grid-template-rows: auto;   

  grid-template-areas: "header header header header"   

                       "main main . sidebar"   

                       "header footer header footer";  

}

在上面的代碼中,我們將創(chuàng)建一個4乘以3的網(wǎng)格容器,第一行由header區(qū)域組成,中間一行由 2 個main區(qū)域和1個空單元和1個sidebar區(qū)域組成,最后一行由footer區(qū)域組成。


2.3 grid-column-gap/grid-row-gap/grid-gap

指定網(wǎng)格線的大小,也可以說是網(wǎng)格子項之間的間距。

詞法:

grid-column-gap: <line-size>

grid-row-gap: <line-size>

  • <line-size>:長度值

grid-gap是grid-column-gapgrid-row-gap的簡稱:

grid-gap: <grid-column-gap> <grid-row-gap>

如果只有一個值,grid-row-gap的值將和grid-column-gap一樣。

實例:

.container{   

  display:grid;   

  grid-template-columns: 100px 50px 100px;   

  grid-template-rows: 80px auto 80px;    

  grid-column-gap: 10px;   

  grid-row-gap: 15px;  

}

注意:間隔僅僅作用在網(wǎng)格子項之間,不作用在容器邊緣。



2.4 justify-items/align-items

justify-items

讓網(wǎng)格子項的內(nèi)容和列軸對齊(align-items則相反,是和行軸對齊),這個值對容器里面的所有網(wǎng)格子項都有用。

justify-items: start | end | center | stretch

  • start:內(nèi)容和網(wǎng)格區(qū)域的左邊對齊
  • end:內(nèi)容和網(wǎng)格區(qū)域的右邊對齊
  • center:內(nèi)容和網(wǎng)格區(qū)域的中間對齊
  • stretch:填充整個網(wǎng)格區(qū)域的寬度(默認(rèn)值)

align-items

讓網(wǎng)格子項的內(nèi)容和行軸對齊,這個值對容器里面的所有網(wǎng)格子項都有用。

align-items: start | end | center | stretch;

  • start:內(nèi)容和網(wǎng)格區(qū)域的頂部對齊
  • end:內(nèi)容和網(wǎng)格區(qū)域的底部對齊
  • center:內(nèi)容和網(wǎng)格區(qū)域的中間對齊
  • stretch:填充整個網(wǎng)格區(qū)域的高度(默認(rèn)值)


2.5 justify-content/align-content

justify-content

如果用像px非彈性單位定義的話,總網(wǎng)格區(qū)域大小有可能小于網(wǎng)格容器,這時候你可以設(shè)置網(wǎng)格的對齊方式(垂直于列網(wǎng)格線對齊)。

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

  • start:左對齊
  • end:右對齊
  • center:居中對齊
  • stretch:填充網(wǎng)格容器
  • space-around:在每個網(wǎng)格子項中間放置均等的空間,在始末兩端只有一半大小
  • space-between:兩邊對齊,在每個網(wǎng)格子項中間放置均等的空間,在始末兩端沒有空間
  • space-evenly:網(wǎng)格間隔相等,包括始末兩端


align-content

如果用像px非彈性單位定義的話,總網(wǎng)格區(qū)域大小有可能小于網(wǎng)格容器,這時候你可以設(shè)置網(wǎng)格的對齊方式(垂直于行網(wǎng)格線對齊)。

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

  • start:頂部對齊
  • end:底部對齊
  • center:居中對齊
  • stretch:填充網(wǎng)格容器
  • space-around:在每個網(wǎng)格子項中間放置均等的空間,在始末兩端只有一半大小
  • space-between:上下對齊,在每個網(wǎng)格子項中間放置均等的空間,在始末兩端沒有空間
  • space-evenly:在每個網(wǎng)格子項中間放置均等的空間,包括始末兩端



2.6 grid-auto-columns/grid-auto-rows

自動生成隱式網(wǎng)格軌道(列和行),當(dāng)你定位網(wǎng)格項超出網(wǎng)格容器范圍時,將自動創(chuàng)建隱式網(wǎng)格軌道。

grid-auto-columns: <track-size>

grid-auto-rows: <track-size>

  • <track-size>:可以是一個長度,百分比或者是一個網(wǎng)格中自由空間的份數(shù)(通過使用fr單位)

為了說明隱式網(wǎng)格軌跡如何被創(chuàng)建,思考一下這個:

.container{   

  grid-template-columns: 60px 60px;   

  grid-template-rows: 90px 90px  

}

在上面的代碼中,我們創(chuàng)建了 2 x 2 的網(wǎng)格。

但現(xiàn)在想象你使用grid-column和grid-row來定位你的網(wǎng)格子項,就像這樣:

.item-a{   

  grid-column: 1 / 2;   

  grid-row: 2 / 3;  

}  

.item-b{   

  grid-column: 5 / 6;   

  grid-row: 2 / 3;  

}



我們告訴.item-b在第 5 列網(wǎng)格線開始第 6 列網(wǎng)格線結(jié)束,但我們還沒有定義第 5 或者第 6 列。因為我們引用的線不存在,0 寬度的隱式網(wǎng)格軌跡將被創(chuàng)建來填充這些空缺。我們可以使用grid-auto-columnsgrid-auto-rows來指定這些隱式網(wǎng)格軌跡的寬度:

.container{   

  grid-auto-columns: 60px;  

}



2.7 grid-auto-flow

在沒有設(shè)置網(wǎng)格項的位置時,這個屬性控制網(wǎng)格項怎樣排列。

grid-auto-flow: row | column | row dense | column dense

  • row:按照行依次從左到右排列
  • column:按照列依次從上到下排列
  • dense:按先后順序排列

來看看下面的例子:

<section class="container">   

  <div class="item-a">item-a</div>   

  <div class="item-b">item-b</div>   

  <div class="item-c">item-c</div>   

  <div class="item-d">item-d</div>   

  <div class="item-e">item-e</div>  

</section>

下面定義5列2行網(wǎng)格,同時定義grid-auto-flow:row

.container{   

  display: grid;   

  grid-template-columns: 60px 60px 60px 60px 60px;   

  grid-template-rows: 30px 30px;   

  grid-auto-flow: row;  

}

再設(shè)置網(wǎng)格子項布局:

.item-a{   

  grid-column: 1;   

  grid-row: 1 / 3;  

}  

.item-e{   

  grid-column: 5;   

  grid-row: 1 / 3;

由于我們設(shè)置了grid-auto-flow:row,item-b、item-c和item-d在行上是從左到右排列,如下:


如果我們設(shè)置 grid-auto-flow: column,結(jié)果如下:


2.8 grid

grid是一種簡寫形式:

grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [ / <grid-auto-columns>] ];


3、網(wǎng)格子項的屬性

3.1 grid-column-start/grid-column-end/grid-row-start/grid-row-end/grid-column/grid-row


通過網(wǎng)格線來定義網(wǎng)格項的位置。grid-column-startgrid-row-start定義網(wǎng)格項的開始位置,grid-column-end、grid-row-end定義網(wǎng)格項的結(jié)束位置。

grid-column-start: <number> | <name> | span <number> | span <name> | auto ; 

grid-column-end: <number> | <name> | span <number> | span <name> | auto ;

grid-row-start: <number> | <name> | span <number> | span <name> | auto ; 

grid-row-end: <number> | <name> | span <number> | span <name> | auto ;

  • <number> | <name>:可以是一個數(shù)字以適用被標(biāo)記了數(shù)字號的網(wǎng)格線,或者是一個名字以適用命名了的網(wǎng)格線
  • span <number>:子項將跨越指定數(shù)字的網(wǎng)格軌跡
  • span <name>:子項將跨越指定名字之前的網(wǎng)格線
  • auto:自動布局,自動跨越或者默認(rèn)跨越一個。


實例:

.item-a{   

  grid-column-start: 2;   

  grid-column-end: five;   

  grid-row-start: row1-start   

  grid-row-end: 3  

}



.item-b{   

  grid-column-start: 1;   

  grid-column-end: span col4-start;   

  grid-row-start: 2   

  grid-row-end: span 2  

}



grid-column是grid-column-startgrid-column-end的簡稱;grid-rowgrid-row-startgrid-row-end的簡稱。

grid-column: <start-line> / <end-line> | <start-line> / span <value>;   

grid-row: <start-line> / <end-line> | <start-line> / span <value>;

實例:

.item-c{   

  grid-column: 3 / span 2;   

  grid-row: third-line / 4;  

}



3.2 grid-area


給網(wǎng)格子項取一個名字以讓它被由grid-template-areas屬性創(chuàng)建的模板引用。同時,這個屬性還可以用來更簡短地表示grid-row-start+ grid-column-start + grid-row-end+ grid-column-end。

grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;

  • <name>:選擇的名字
  • <row-start> / <column-start> / <row-end> / <column-end> – 可以是網(wǎng)格線的數(shù)字或名字


實例:

作為分配一個名字給網(wǎng)格子項的一種方式:

.item{  

.item-d{   

  grid-area: header  

}

作為grid-row-start+ grid-column-start + grid-row-end+ grid-column-end的一種簡寫:

.item-d{   

  grid-area: 1 / col4-start / last-line / 6  

}



3.3 justify-self/align-self


(1)justify-self


讓網(wǎng)格子項的內(nèi)容以列軸對齊(與之相反align-self是跟行軸對齊),這個值可以應(yīng)用在單個網(wǎng)格子項的內(nèi)容中。

justify-self: start | end | center | stretch

  • start – 讓內(nèi)容在網(wǎng)格區(qū)域左對齊
  • end – 讓內(nèi)容在網(wǎng)格區(qū)域右對齊
  • center – 讓內(nèi)容在網(wǎng)格區(qū)域中間對齊
  • stretch – 填充著呢個網(wǎng)絡(luò)區(qū)域的寬度(默認(rèn)值)




(2)align-self


讓網(wǎng)格子項的內(nèi)容以行軸對齊(與之相反justify-self是跟列軸對齊),這個值可以應(yīng)用在單個網(wǎng)格子項的內(nèi)容中。

align-self: start | end | center | stretch

  • start – 讓內(nèi)容在網(wǎng)格區(qū)域上對齊
  • end – 讓內(nèi)容在網(wǎng)格區(qū)域下對齊
  • center – 讓內(nèi)容在網(wǎng)格區(qū)域中間對齊
  • stretch – 填充著呢個網(wǎng)絡(luò)區(qū)域的高度(默認(rèn)值)




參數(shù)文章:

Grid 的完整介紹

A Complete Guide to Grid

Grid入門


如有錯誤,歡迎指正!


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號