CSS:Grid布局

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

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


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

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

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

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

display: grid | inline-grid | subgrid

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

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

簡(jiǎn)單術(shù)語(yǔ)介紹:

每一塊表示一個(gè)網(wǎng)格子項(xiàng)(網(wǎng)格單元),4個(gè)(任意數(shù)量)網(wǎng)格子項(xià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)格單元的寬高,其單位可以是一個(gè)長(zhǎng)度(如px、em、rem、vw、vh)或百分比,也可以是網(wǎng)格中自由空間的份數(shù)(單位為fr)。
  • <line-name>:定義網(wǎng)格線(xiàn)的名稱(chēng),它不是必須值??梢砸粋€(gè)你選擇的任意名字,當(dāng)沒(méi)有顯示設(shè)定時(shí),它的名字以數(shù)字表示。

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

.container{   

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

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

}


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

.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)格線(xiàn)命名時(shí)必須加上中括號(hào)

一根網(wǎng)格線(xiàn)還可以有多個(gè)名字,以空格隔開(kāi),中括號(hào)包裹:

.container{   

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

}

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

.container{   

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

}


/* 等價(jià)于 */

.container{   

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

}


特殊單元:fr

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

.container{   

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

}

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

注意:自由空間是在固定子項(xiàng)確定后開(kāi)始計(jì)算的

.container{   

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

}

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

2.2 grid-template-areas

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

詞法:

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

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

實(shí)例:

<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)建一個(gè)4乘以3的網(wǎng)格容器,第一行由header區(qū)域組成,中間一行由 2 個(gè)main區(qū)域和1個(gè)空單元和1個(gè)sidebar區(qū)域組成,最后一行由footer區(qū)域組成。


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

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

詞法:

grid-column-gap: <line-size>

grid-row-gap: <line-size>

  • <line-size>:長(zhǎng)度值

grid-gap是grid-column-gapgrid-row-gap的簡(jiǎn)稱(chēng):

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

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

實(shí)例:

.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)格子項(xiàng)之間,不作用在容器邊緣。



2.4 justify-items/align-items

justify-items

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

justify-items: start | end | center | stretch

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

align-items

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

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

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


2.5 justify-content/align-content

justify-content

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

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

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


align-content

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

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

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



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

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

grid-auto-columns: <track-size>

grid-auto-rows: <track-size>

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

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

.container{   

  grid-template-columns: 60px 60px;   

  grid-template-rows: 90px 90px  

}

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

但現(xiàn)在想象你使用grid-column和grid-row來(lái)定位你的網(wǎng)格子項(xià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)格線(xiàn)開(kāi)始第 6 列網(wǎng)格線(xiàn)結(jié)束,但我們還沒(méi)有定義第 5 或者第 6 列。因?yàn)槲覀円玫木€(xiàn)不存在,0 寬度的隱式網(wǎng)格軌跡將被創(chuàng)建來(lái)填充這些空缺。我們可以使用grid-auto-columnsgrid-auto-rows來(lái)指定這些隱式網(wǎng)格軌跡的寬度:

.container{   

  grid-auto-columns: 60px;  

}



2.7 grid-auto-flow

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

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

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

來(lái)看看下面的例子:

<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)格,同時(shí)定義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)格子項(xiàng)布局:

.item-a{   

  grid-column: 1;   

  grid-row: 1 / 3;  

}  

.item-e{   

  grid-column: 5;   

  grid-row: 1 / 3;

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


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


2.8 grid

grid是一種簡(jiǎn)寫(xiě)形式:

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


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

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


通過(guò)網(wǎng)格線(xiàn)來(lái)定義網(wǎng)格項(xiàng)的位置。grid-column-start、grid-row-start定義網(wǎng)格項(xiàng)的開(kāi)始位置,grid-column-end、grid-row-end定義網(wǎng)格項(xià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>:可以是一個(gè)數(shù)字以適用被標(biāo)記了數(shù)字號(hào)的網(wǎng)格線(xiàn),或者是一個(gè)名字以適用命名了的網(wǎng)格線(xiàn)
  • span <number>:子項(xiàng)將跨越指定數(shù)字的網(wǎng)格軌跡
  • span <name>:子項(xiàng)將跨越指定名字之前的網(wǎng)格線(xiàn)
  • auto:自動(dòng)布局,自動(dòng)跨越或者默認(rèn)跨越一個(gè)。


實(shí)例:

.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的簡(jiǎn)稱(chēng);grid-rowgrid-row-startgrid-row-end的簡(jiǎn)稱(chēng)。

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

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

實(shí)例:

.item-c{   

  grid-column: 3 / span 2;   

  grid-row: third-line / 4;  

}



3.2 grid-area


給網(wǎng)格子項(xiàng)取一個(gè)名字以讓它被由grid-template-areas屬性創(chuàng)建的模板引用。同時(shí),這個(gè)屬性還可以用來(lái)更簡(jiǎn)短地表示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)格線(xiàn)的數(shù)字或名字


實(shí)例:

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

.item{  

.item-d{   

  grid-area: header  

}

作為grid-row-start+ grid-column-start + grid-row-end+ grid-column-end的一種簡(jiǎn)寫(xiě):

.item-d{   

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

}



3.3 justify-self/align-self


(1)justify-self


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

justify-self: start | end | center | stretch

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




(2)align-self


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

align-self: start | end | center | stretch

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




參數(shù)文章:

Grid 的完整介紹

A Complete Guide to Grid

Grid入門(mén)


如有錯(cuò)誤,歡迎指正!


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)