Grid 佈局是網站設計的基礎,CSS Grid 是建立網格佈局最強大和最簡單的工具。css
輕鬆使用 Grid 佈局提升開發效率,對複雜的網頁結構佈局更加靈活。html
Grid 將網頁劃分紅一個個網格,能夠任意組合不一樣的網格,作出各類各樣的佈局。網格是一組相交的水平線和垂直線,它定義了網格的列和行。咱們能夠將網格元素放置在與這些行和列相關的位置上。算法
咱們比較熟悉的好比說座標軸,座標點;若是你看到上面這樣一個網格首先想到是這不就是被淘汰的表格嗎,表格之因此被淘汰最主要在性能方面,然而咱們不得不認可表格對於整個網頁的佈局來講有必定的便利性。那麼如今的網格佈局就能夠把表格裏面的一些較好的方便的東西抽出來,而後把性能方面較差的地方去掉,因此說網格佈局會成爲未來互聯網企業的一個熱潮是有緣由的。瀏覽器
固定的位置和彈性的軌道的大小
你可使用固定的軌道尺寸建立網格,好比使用像素單位。你也可使用好比百分比或者專門爲此目的建立的新單位 fr來建立有彈性尺寸的網格。ide
元素位置
你可使用行號、行名或者標定一個網格區域來精肯定位元素。網格同時還使用一種算法來控制未給出明確網格位置的元素。函數
建立額外的軌道來包含元素
可使用網格佈局定義一個顯式網格,可是根據規範它會處理你加在網格外面的內容,當必要時它會自動增長行和列,它會盡量多的容納全部的列。工具
對齊控制
網格包含對齊特色,以便咱們能夠控制一旦放置到網格區域中的物體對齊,以及整個網格如何對齊。佈局
控制重疊內容
多個元素能夠放置在網格單元格中,或者區域能夠部分地彼此重疊。而後能夠CSS中的z-index屬性來控制重疊區域顯示的優先級。性能
Grid 佈局與 Flex佈局有必定的類似性,均可以指定容器內部多個項目的位置。可是,它們也存在重大區別。Flex佈局是軸線佈局,只能指定"項目"針對軸線的位置,能夠看做是一維佈局。Grid佈局則是將容器劃分紅"行"和"列",產生單元格,而後指定"項目所在"的單元格,能夠看做是二維佈局。Grid佈局遠比Flex佈局強大。不是說Grid佈局取代Flex佈局,實際上他倆能夠很好的配合使用。flex
元素應用display:grid;,它是其全部網格項的父元素。
<div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> </div>
把 container 元素變成一個 grid(網格),只要把其 display 設置爲 grid。
CSS代碼:
.container { display:grid; }
網格容器的子元素,下面的item元素是網格項。
<div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> </div>
組成網格項的分界線。
記住:網格線僅僅是咱們在定義網格容器的時候就產生的,跟咱們的網格項沒有直接的關聯。網格線是咱們在定義網格容器的時候伴隨出來的虛擬的概念,也就是說在實際的HTML中是找不到這些線的。
兩個相鄰的網格線之間爲網格軌道。
網格軌道的特色是必定會頂到容器的邊緣。
網格軌道必然跟網格項沒有關聯。
兩個相鄰的列網格線和兩個相鄰的行網格線組成的是網格單元。
4個網格線包圍的總空間。
將元素定義爲grid container,併爲其內容創建新的網格格式化上下文(grid formatting context)。
<div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> </div>
.container { display:grid | inline-grid | subgrid; }
當元素設置了網格佈局,column、float、clear、vertical-align屬性無效。
display:subgrid;目前全部瀏覽器都不兼容。
使用以空格分隔的多個值來定義網格的列和行。
.container { grid-template-columns: <track-size> ... | <line-name> <track-size> ...; grid-template-rows: <track-size> ... | <line-name> <track-size> ...; }
經過引用 grid-area 屬性指定的 網格區域(Grid Area) 名稱來定義網格模板。
.container { grid-template-areas: none| "grid-area-name|. grid-area-name|. grid-area-name|. ..." "grid-area-name|. grid-area-name|. grid-area-name|. ..." "......"; }
例如:
.container { grid-template-areas: "head head head head" "main main . sidebar" "foot foot foot foot"; }
以上例子強調如下幾點:
第一:每一行都必定要用雙引號括起來;
第二:每個值對應一個網格單元,千萬不要上面寫了4個,下面只寫三個,這樣的話就會出問題;
第三:每一個網格單元裏的區域名稱都以空格隔開;
第四:每一個引號後面是沒有任何逗號或封號,僅僅是回車換行。
在單個聲明中定義 grid-template-rows、grid-template-columns、grid-template-areas的簡寫。就我的而言,仍是不要簡寫,由於簡寫以後可讀性會變差一些。
.container { grid-template: none | subgrid | <grid-template-rows> / <grid-template-columns>; }
.container { grid-template: [row1-start] "head head head" 25px [row1-end] [row2-start] "foot foot foot" 25px [row2-end] / auto 50px auto; }
等同於
.container { grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end]; grid-template-columns: auto 50px auto; grid-template-areas: "head head head" "foot foot foot"; }
不建議簡寫,避免混淆。
指定網格線的大小,能夠想象爲設置列/行之間間距的寬度。也能夠說是網格軌道之間的間距
.container { grid-column-gap: <line-size>; grid-row-gap: <line-size>; }
grid-row-gap 和 grid-column-gap 的縮寫。
.container { grid-gap: <grid-row-gap> <grid-column-gap>; }
起初是用 grid-gap 屬性來定義的,目前逐漸被 gap 替代。
若是沒有指定 grid-row-gap,則會被設置爲與 grid-column-gap 相同的值。
沿着行軸對齊網格內的內容。
.container { justify-items: start | end | center | stretch; }
沿着列軸對齊網格內的內容。
.container { align-items: start | end | center | stretch; }
設置 justify-items 和 align-items 的簡寫形式。
注意:書寫順序爲先列軸屬性值後行軸屬性值。
.container { place-items: center; }
以上表示水平和垂直居中。
設置網格容器內的網格沿着行軸對齊網格的對齊方式。
.container { justify-content: start | end | center | stretch | space-around | space-between | space-evenly; }
設置網格容器內的網格沿着列軸對齊網格的對齊方式。
.container { align-content: start | end | center | stretch | space-around | space-between | space-evenly; }
設置 align-content 和 justify-content 的簡寫形式。
注意:書寫順序爲先列軸對齊屬性值後行軸對齊屬性值。
指定自動生成的網格軌道(又名隱式網格軌道)的大小。
隱式網格軌道在顯示的定位超出指定網格範圍的行或列時被建立。也就是說網格項超出,一種是太多了,還有一種分兩種狀況:若是說僅僅由於太多的話,咱們只須要控制行就能夠了,列這一塊的話確定是跟着上面是同樣的。可是有時列也會超出,超出狀況會在講到網格項的地方提到過,當網格項肯定在網格單元或網格區域的時候是能夠控制的,控制的時候除了網格區域的名字以外,它也能夠經過地址條網格線來控制,可是這個線的名字若是是超過的時候就會出來,那麼在這種狀況下就會自動生成隱式網格軌道。
隱式網格軌道我的是不建議你們使用的,由於咱們的這個隱式網格咱們在容器當中通常來講咱們在容器中統攬大局而後摳出局部,結果局部不禁大局控制反而影響大局,這就有點反客爲主,喧賓奪主的意思了,那在控制起來勢必會有混亂,因此隱式網格軌道不是特別提倡你們使用。
.container { grid-auto-columns: <track-size> ...; grid-auto-rows: <track-size> ...; }
控制自動佈局算法的工做方式。
.container { grid-auto-flow: row | column | row dense | column dense }
在單個屬性中設置全部如下屬性的簡寫: grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 和 grid-auto-flow 。
固然像左對齊、右對齊這些對齊方式等就不能簡寫在上面。就是說咱們能夠把多少行多少列以及它的區域還有隱式軌道以及他的佈局方式均可以簡寫到 grid 裏面而且同時將 sets grid-column-gap 和 grid-row-gap設置爲他們的初始值,即便它們不能被此屬性顯示設置。
.container { grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [/ <grid-auto-columns>]]; }
.container { grid: [row1-start] "head head head" 1fr [row1-end] [row2-start] "foot foot foot" 25px [row2-end] / auto 50px auto; }
等價於:
.container { grid-template-areas: "head head head" "foot foot foot"; grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end]; grid-template-columns: auto 50px auto; }
簡寫形式就簡單的作一個介紹,實際開發當中不建議簡寫形式。
跟蹤列表的重複片斷,容許大量顯示重複模式的列或行以更緊湊的形式編寫。
.container { grid-template-columns: repeat(repeat, values); grid-template-rows: repeat(repeat, values); }
根據公式min(最大大小、最大值(最小大小、參數))將給定大小夾緊爲可用大小。
.container { grid-template-columns: fit-content([ <length> | <percentage> ]); grid-template-rows: fit-content([ <length> | <percentage> ]); }
定義了一個長寬範圍的閉區間。
minmax([ <length> | <percentage> | <flex> | min-content | max-content | auto ], [ <length> | <percentage> | <flex> | min-content | max-content | auto ]);
例如:
.container { grid-template-columns: minmax(300px, 50px); }
minmax()這個函數前面‘300px’是最小值,後面‘50px’是最大值,也就是說範圍是從小到大的。當最小值大於最大值時,最大值將被忽略,整列會成爲最小值。
使用特定網格線來肯定 網格項(grid item)在網格內的位置。
.item { 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 }
grid-column-start + grid-column-end 和 grid-row-start + grid-row-end 的簡寫形式。
.item { grid-column: <start-line> / <end-line> | <start-line> / span <value>; grid-row: <start-line> / <end-line> | <start-line> / span <value>; }
我的建議:斜槓先後的空格千萬不要省略,有時能夠識別,有時不可識別,對於瀏覽器來講小版本的話就會有差異。建議斜槓先後都要有空格。
start-line / end-line:每一個值的用法都和屬性分開寫時的用法同樣
CSS代碼以下:
.container > .item:nth-child(1) { grid-column-start: 2; grid-column-end: 4; grid-row-start: 2; grid-row-end: 4; }
等同於
.container > .item:nth-child(1) { grid-column: 2 / 4; grid-row: 2 / 4; }
等同於
.container > .item:nth-child(1) { grid-column: 2 / span 2; grid-row: 2 / span 2; }
給 gird item 進行命名以便於使用 grid-template-areas 屬性建立模板時來進行引用。
.item { grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>; }
CSS代碼以下:
.container > .item-a { grid-area: row1-start / 2 / 3 / five; }
等同於
.container > .item-a { grid-column-start: 2; grid-column-end: five; grid-row-start: row1-start; grid-row-end: 3; }
CSS代碼以下:
.container > .item-a { grid-column: 2 / span 2; grid-row: 2 / span 2; }
等同於
.container > .item-a { grid-area: 2 / 2 / 4 / 4; }
沿着行軸對齊 grid-item 裏的內容。
.item { justify-self: start | end | center | stretch; }
沿着列軸對齊 grid-item 裏的內容。
.item { align-self: start | end | center | stretch; }
本篇文章到此結束,歡迎提建議哈!
參考文獻: