原文地址: https://css-tricks.com/snippets/css/complete-guide-grid/css
CSS網格佈局是一個二維的基於網格的佈局系統, 其目的在於徹底改變咱們設計基於網絡的用戶界面的方式。CSS一直用來佈局咱們的網頁, 可是他歷來沒有作過很好的工做, 最開始咱們使用表格,而後float
, position
和inline-block
。可是這些本質上是css的hack, 而且遺漏了不少重要的功能(例如垂直居中),後來flexbox出現了, 可是他的目的只是爲了更簡單的一維佈局, 而不是複雜的二維佈局。網格是第一個專門爲解決佈局問題而建立的CSS模塊 在瀏覽器兼容性方面,能夠看一下caniuse的數據算法
在元素中應用display: grid
。這是全部網格佈局的直接父元素, 在這個例子中container
是網格容器瀏覽器
<div class="container">
<div class="item item-1"></div>
<div class="item item-2"></div>
<div class="item item-3"></div>
</div>
複製代碼
網格容器的小孩(例如直接子元素),這裏的item
元素是網格項目,但sub-item
不是bash
<div class="container">
<div class="item"></div>
<div class="item">
<div class="sub-item"></div>
</div>
<div class="item"></div>
</div>
複製代碼
構成網格結構的分界線, 他們既能夠是垂直的(列)也能夠是水平的(行)。這裏的黃線是一個列網格線的例子網絡
兩個相鄰網格線之間的空間。你能夠把它們想象成網格的列或行。這是第二行和第三行網格線之間的網格軌道ide
兩個相鄰的行和兩個相鄰的列網格線之間的空間,也就是網格中的一個單元,這是行網格線1和2之間的網格單元, 以及列網格線2和3佈局
四個網格線包圍的總空間,網格空間能夠由任意數量的網格單元組成。這裏是行網格線1和3之間的網格空間, 以及列網格線1和3flex
將元素定義爲網格容器, 並未其內容創建新的網格格式上下文 值:ui
.container{
display: grid | inline-grid | subgrid
}
複製代碼
使用空格分隔的值列表來定義網格的列和行。這些值表示軌道大小,他們之間的空間表示網格線 值:flexbox
.container{
display: grid;
grid-template-columns: 40px 50px auto 50px;
grid-template-rows: 25% 100px auto;
}
複製代碼
可是你能夠選擇明確命名行,請注意行名稱的括號語法
.container{
grid-template-columns: [first] 40px [line2] 50px [line2] auto [line3] auto [col4-start] 50px [five] 5px;
grid-template-rows: [row1-start] 25% [row1-end] 100px [thrid-line] auto [last-line];
}
複製代碼
請注意,一行/列能夠有多個名字,例如這裏第二列將有兩個名字
.contaienr{
grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end]
}
複製代碼
若是您的定義包含重複的部分,您可使用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
網格會容許您設置的網格軌道大小爲網格容器的自由空間的一小部分,例如,這會將每一個項目設置爲容器寬度的三分之一
.container {
grid-template-columns: 1fr 1fr 1fr;
}
複製代碼
可用空間是在任何非彈性項目以後計算的,在這個例子中,fr
單元可用空間的總量不包括50px
.container{
grid-template-columns: 1fr 50px 1fr 1fr;
}
複製代碼
經過應用grid-area
屬性指定網格空間的名稱來定義網格模板。 值:
grid-area
.container{
grid-template-areas: "<grid-area-name> | . | none | ...";
}
複製代碼
例子
.container{
display: grid;
grid-template-columns: repeat(4, 50px);
grid-template-rows: auto;
grid-template-areas:
"header header header header"
"main main . slidebar"
"footer footer footer footer"
}
.item-a{
grid-area: header;
}
.item-b{
grid-area: main;
}
.item-c{
grid-area: slidebar;
}
.item-d{
grid-area: footer;
}
複製代碼
注意: 你不是用這個語法命名行只是空間, 當你使用這種語法時, 空間兩端的行其實是自動命名的,若是你的網格空間名字是foo,那麼這個空間的起始行和起始列的名字就是foo-start,最後一列和最後一行就是foo-end;
一個簡短設置grid-template-rows
, grid-template-columns
和grid-template-areas
在一塊兒的聲明
.container {
grid-template: none | subgrid | <grid-template-rows> <grid-area-name>/ <grid-template-columns>;
}
複製代碼
因爲grid-template
不會重置隱式網格屬性(grid-auto-columns
, grid-auto-rows
, grid-auto-flow
),這多是您在大多數狀況下所要作的,因此建議使用grid
屬而不是grid-template
。
指定網格線的大小 值:
.container{
grid-column-gap: <line-size>;
grid-row-gap: <line-size>;
}
複製代碼
.container{
display: grid;
grid-template-columns: repeat(4, 50px);
grid-template-rows: repeat(4, 80px);
grid-column-gap: 10px;
grid-row-gap: 15px;
}
複製代碼
一種速記grid-row-gap
和grid-column-gap
值:
.container {
grid-gap: <grid-row-gap><grid-column-gap>
}
複製代碼
沿着行軸對齊網格內的內容(而不是align-items
沿着列軸對齊),適用於全部網格容器內的網格項目 值:
.container{
justify-items: start | end | center | stretch
}
複製代碼
例子
.container{
justify-items: start;
}
複製代碼
.container{
justify-items: end;
}
複製代碼
.container{
justify-items: center;
}
複製代碼
.container{
justify-items: stretch;
}
複製代碼
此行爲也能夠經過justify-self
在個別網格項目上設置
沿列軸對齊網格的內容(而不是justify-items
沿着行軸對齊)。該值適用於容器內的全部網格項目 值:
.container {
align-items: start | end | center | stretch;
}
複製代碼
例子
.container {
align-items: start;
}
複製代碼
.container {
align-items: end;
}
複製代碼
.container {
align-items: center;
}
複製代碼
.container {
align-items: stretch;
}
複製代碼
此行爲也能夠經過
align-self
屬性在個別網格項目上設置
有時,網格的總大小可能小於其網格容器的大小, 若是您的全部網格項目都是用非靈活單位進行大小調整,就可能發生這種狀況。這時候能夠設置網格容器內的網格的對齊方式,此屬性沿着行軸對齊網絡 值:
.container{
justify-content: start;
}
複製代碼
.container{
justify-content: end;
}
複製代碼
.container{
justify-content: center;
}
複製代碼
.container{
justify-content: stretch
}
複製代碼
.container{
justify-content: space-around;
}
複製代碼
.container{
justify-content: space-between;
}
複製代碼
.container{
justify-content: space-evenly;
}
複製代碼
此屬性和justify-content
同樣,只不過是沿着列軸對齊網格 值:
.container{
align-content: start;
}
複製代碼
.container{
align-content: end
}
複製代碼
.container{
align-content: center;
}
複製代碼
.container{
align-content: stretch;
}
複製代碼
.container{
align-content: space-around;
}
複製代碼
.container{
align-content: space-between;
}
複製代碼
.container{
align-content: space-evenly;
}
複製代碼
指定任何自動生成的網格軌道的大小,當你明確聲明超出定義的網格空間的行或列(經過grid-template-rows / grid-template-columns)時間,會建立隱式網格軌道 值:
fr
單位) 如何建立隱式網格軌道, 例子:.contaienr{
display: grid;
grid-template-columns: repeat(2, 60px);
grid-template-rows: repeat(2, 90px);
}
複製代碼
這樣會建立一個2 X 2的網格
但如今若是你使用grid-column
和grid-row
定位你的網格項目是這樣的
.item-a {
grid-column: 1 / 2;
grid-row: 2 / 3;
}
.item-b {
grid-column: 5 / 6;
grid-row: 2 / 3;
}
複製代碼
咱們告訴item-b
從第5行開始, 到第6行結束, 可是咱們沒有定義第5行或第6行, 由於咱們引用了不存在的行,因此建立了寬度爲0的隱式軌道來填補空白,咱們可使用grid-auto-columns
和grid-auto-rows
來指定這些隱式軌道的寬度
.container{
grid-auto-columns: 60px;
}
複製代碼
若是您沒有明確放置在網格上的網格項目,則自動分配算法會自動分配這些項目。該屬性控制自動分配算法的原理 值:
<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>
複製代碼
你定義了一個五行兩列的網格,並設置grid-auto-flow
爲row
.container{
display: grid;
grid-template-columns: repeat(5, 60px);
grid-template-rows: repeat(2, 30px);
grid-auto-flow: row;
}
複製代碼
將項目分配在網格容器上,只能爲其中的兩個項目分配空間
.item-a {
grid-column: 1;
grid-row: 1 / 3;
}
.item-e {
grid-column: 5;
grid-row: 1 / 3;
}
複製代碼
若是將grid-auto-flow
設置爲column
簡寫爲全部設置下列屬性的單一聲明: grid-template-rows
,grid-template-columns
, grid-template-areas
, grid-auto-rows
, grid-auto-columns
和grid-flow
。
經過引用特定的網格線來肯定網格內項目的位置。 值:
.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-end
/grid-row-end
聲明, 該項目將默認跨越一個項目,項目能夠相互重疊,您可使用z-index
來控制堆疊順序
簡寫爲grid-column-start
+grid-column-end
和grid-row-start
+grid-row-end
值:
.item-c {
grid-column: 3 / span 2;
grid-row: third-line / 4;
}
複製代碼
爲項目提供一個名稱,以即可以經過使用grid-template-areas
屬性建立的模板來引用他。或者屬性能夠用做grid-row-start
+grid-column-start
+grid-row-end
+grid-column-end
值:
.item {
grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}
複製代碼
例子: 做爲項目分配名稱的一種方法
.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
}
複製代碼
沿着行軸對齊網格的內容,此屬性適用與單個網格項目的內容 值:
.item {
justify-self: start | end | center | stretch;
}
複製代碼
例子:
.item-a {
justify-self: start;
}
複製代碼
.item-a {
justify-self: end;
}
複製代碼
.item-a {
justify-self: center;
}
複製代碼
.item-a {
justify-self: stretch;
}
複製代碼
沿列軸對齊網格內的內容,此值適用與單個網格項目內的內容 值
.item {
align-self: start | end | center | stretch;
}
複製代碼
例子:
.item-a {
align-self: start;
}
複製代碼
.item-a {
align-self: end;
}
複製代碼
.item-a {
align-self: center;
}
複製代碼
.item-a {
align-self: stretch;
}
複製代碼