摘要:簡言網格布局是一套二維的頁面布局系統,它的出現將完全顛覆頁面布局的傳統方式。例用屬性和定義網格,同時定義網格線名稱。例一組區域名稱要放在單引號或雙引號內,每一個名稱之間以空格分隔。例本例中,是通過隱式網
簡言
CSS網格布局(Grid)是一套二維的頁面布局系統,它的出現將完全顛覆頁面布局的傳統方式。傳統的CSS頁面布局 一直不夠理想。包括table布局、浮動、定位及內聯塊等方式,從本質上都是Hack的方式,并且遺漏了一些重要的功能(比如:垂直居中)。Flexbox的出現部分解決了上述問題,但Flex布局是為了解決簡單的一維布局,適用于頁面局部布局。而Grid天然就是為了解決復雜的二維布局而出現的,適用頁面的整體布局。在實際工作中,Grid和Flexbox不但不矛盾,而且還能很好的結合使用。做為WEB程序員,我們在頁面布局問題上都付出過努力,也將不斷探索新的方案。而Grid是第一個專門為布局問題而生的CSS模塊,我們有理由對Grid充滿期待。
本文包括18個小節,62個實例,完整閱讀需要時間20分鐘以上。
為了獲得最佳的閱體驗,可以訪問如下格式的教程:
學習CSS網格
1 網格容器將屬性 display 值設為 grid 或 inline-grid 就創建了一個網格容器,所有容器直接子結點自動成為網格項目。
1.1 例1grid { display: grid; }
網格項目按行排列,網格項目占用整個容器的寬度。
演示程序
1.1 例2grid { display: inline-grid; }
網格項目按行排列,網格項目寬度由自身寬度決定。
演示程序
2 顯示網格屬性grid-template-rows和grid-template-columns用于顯示定義網格,分別用于定義行軌道和列軌道。
2.1 例3grid { display: grid; grid-template-rows: 50px 100px; }
屬性grid-template-rows用于定義行的尺寸,即軌道尺寸。軌道尺寸可以是任何非負的長度值(px,%,em,等)
網格項目1的行高是50px,網格項目2的行高是100px。
因為只定義了兩個行高,網格項目3和4的行高取決于其本身的高度。
演示程序
2.2 例4grid { display: grid; grid-template-columns: 90px 50px 120px; }
類似于行的定義,屬性grid-template-columns用于定義列的尺寸。
因為定義中只有三列,所以項目4,5,6排在新的一行; 并因為它們位于第1,2,3列的軌道上,所以其寬度等于定義中第1,2,3列軌道的寬度。
網格項目的第1列,第2列,第3列的寬度分別是 90px, 50px 和 120px 。
演示程序
2.3 例5grid { display: grid; grid-template-columns: 1fr 1fr 2fr; }
單位fr用于表示軌道尺寸配額,表示按配額比例分配可用空間。
本例中,項目1占 1/4 寬度,項目2占 1/4 寬度,項目3占 1/2 寬度。
演示程序
2.4 例6grid { display: grid; grid-template-columns: 3rem 25% 1fr 2fr; }
單位fr和其它長度單位混合使用時,fr的計算基于其它單位分配后的剩余空間。
本例中,1fr = (容器寬度 - 3rem - 容器寬度的25%) / 3
演示程序
3 軌道的最小最大尺寸設置函數minmax()用于定義軌道最小/最大邊界值。
3.1 例7grid { display: grid; grid-template-rows: minmax(100px, auto); grid-template-columns: minmax(auto, 50%) 1fr 3em; }
函數minmax()接收兩個參數:第一個參數表示最小軌道尺寸,第二個參數表示最大軌道尺寸。長度值可以是auto,表示軌道尺寸可以根據內容大小進行伸長或收縮。
本例中,第一行最小高度設置成100px,但是最大高度設置成auto,表示行高可以根據內容伸長超過100px。
本例中,第一列寬度的最大值設置成50%,表示其寬度不能超過整個容器寬度的50%。
演示程序
4 重復的網格軌道函數repeat()用來定義重復的網格軌道,尤其適用于有多個相同項目的情況下。
4.1 例8grid { display: grid; grid-template-rows: repeat(4, 100px); grid-template-columns: repeat(3, 1fr); }
函數repeat()接收兩個參數:第一個參數表示重復的次數,第二個參數表示軌道尺寸。
演示程序
4.2 例9grid { display: grid; grid-template-columns: 30px repeat(3, 1fr) 30px; }
函數repeat()可以用在軌道定義列表當中。
本例中,第1列和第5列的寬度是30px。函數repeat()創建了中間3列,每一列寬度都是1fr。
演示程序
5 定義網格間隙屬性grid-column-gap 和 grid-row-gap用于定義網格間隙。
網格間隙只創建在行列之間,項目與邊界之間無間隙。
5.1 例10grid { display: grid; grid-row-gap: 20px; grid-column-gap: 5rem; }
間隙尺寸可以是任何非負的長度值(px,%,em等)。
演示程序
5.2 例11grid { display: grid; grid-gap: 100px 1em; }
屬性grid-gap是grid-row-gap和grid-column-gap的簡寫形式。
第一個值表示行間隙,第二個值表示列間隙。
演示程序
5.3 例12grid { display: grid; grid-gap: 2rem; }
如只有一個值,則其即表示行間隙,也表示列間隙。
演示程序
6 用網格線編號定位項目網格線本質上是用來表示網格軌道的開始和結束。
每一條網格線編號都以1開始,以1為步長向前編號,其中包括行列兩組網格線。
6.1 例13.item1 { grid-row-start: 2; grid-row-end: 3; grid-column-start: 2; grid-column-end: 3; }
這是一個3行2列的網格,即在行上有4條網格線,在列上有3條網格線。項目1利用網格線編號定位在第2行第2列的位置上。
本例中,項目只跨越一行一列,則grid-row-end和grid-column-end的定義可以省略。
演示程序
6.2 例14.item1 { grid-row: 2; grid-column: 3 / 4; }
屬性grid-row 是 grid-row-start 和 grid-row-end的簡寫形式。
屬性grid-column 是 grid-column-start 和 grid-column-end的簡寫形式。
如果只指定一個值,它表示 grid-row/column-start。
如果兩個值都指定,第一個表示 grid-row/column-start ,第二個值表示grid-row/column-end。而且你必須用斜杠(/)分隔這兩個值。
演示程序
6.3 例15.item1 { grid-area: 2 / 2 / 3 / 3; }
屬性grid-area 是 grid-row-start, grid-column-start, grid-row-end 和 grid-column-end的簡寫形式。
如果四個值都指定,則第一個表示 grid-row-start, 第二個表示 grid-column-start, 第三個表示 grid-row-end ,第四個表示 grid-column-end。
演示程序
7 網格項目跨越行列網格項目默認都占用一行和一列,但可以使用前一節中定位項目的屬性來指定項目跨越多行或多列。
7.1 例16.item1 { grid-column-start: 1; grid-column-end: 4; }
通過grid-column-start和grid-column-end屬性值的設置,使該網格項目跨越多列。
演示程序
7.2 例17.item1 { grid-row-start: 1; grid-row-end: 4; }
通過grid-row-start和grid-row-end屬性值的設置,使該網格項目跨越多行。
演示程序
7.3 例18.item1 { grid-row: 2 / 5; grid-column: 2 / 4; }
簡寫屬性 grid-row 和 grid-column 即能用來定位項目,也能用來使項目跨越多個行列。
演示程序
7.4 例19.item1 { grid-row: 2 / span 3; grid-column: span 2; }
關鍵字 span 用來指定跨越行或列的數量。
演示程序
8 網格線命名當利用屬性grid-template-rows 和 grid-template-columns定義網格時,可以同時定義網格線的名稱。網格線名稱可以用于定位網格項目。
8.1 例20grid { display: grid; grid-template-rows: [row-1-start] 1fr [row-2-start] 1fr [row-2-end]; grid-template-columns: [col-1-start] 1fr [col-2-start] 1fr [col-3-start] 1fr [col-3-end]; }
用屬性grid-template-rows 和 grid-template-columns定義網格,同時定義網格線名稱。
為避免混淆,網格線名稱應避免使用規范中的關鍵字(span等)。
定義網格線名稱的方法是要將其放在中括號內([name-of-line]),并要和網格軌道相對應。
8.2 例21grid { display: grid; grid-template-rows: [row-start row-1-start] 1fr [row-1-end row-2-start] 1fr [row-2-end row-end]; grid-template-columns: [col-start] 1fr [col-2-start] 1fr [col-3-start] 1fr [col-end]; }
可以給同一網格線定義多個名稱,方法就是在中括號內用空格將多個名稱分開。
每一個網格線名都可以被引用,以用來定位網格項目。
9 用網格線名定位項目利用命名的網格線,可以很方便地進行項目定位。
9.1 例22.item1 { grid-row-start: row-2-start; grid-row-end: row-end; grid-column-start: col-2-start; grid-column-end: col-end; }
引用網格線名稱不用加中括號。
演示程序
9.2 例23.item1 { grid-row: row-2-start / row-end; grid-column: col-2-start / col-end; }
簡寫屬性grid-row 和 grid-column也可以利用網格線名稱來定位項目。
演示程序
10 用同名網格線命名和定位項目函數repeat()可以定義同名網格線。這節省了給每條網格都命名的時間。
10.1 例24grid { display: grid; grid-template-rows: repeat(3, [row-start] 1fr [row-end]); grid-template-columns: repeat(3, [col-start] 1fr [col-end]); }
函數repeat()可以用來定義同名網格線。 這樣多個網格線擁有相同的名字。
同名網格線會被分配一個位置編號,做為其唯一標識。
10.2 例25.item1 { grid-row: row-start 2 / row-end 3; grid-column: col-start / col-start 3; }
用同名網格線來定位項目時,應注意在網格線名稱和編號之間有一個空格。
本例中,項目1的行定位開始于第2條名稱是row-start的網格線,結束于第3條名稱是row-end的網格線;列定位開始于第1條名稱是col-start的網格線,結束于第3條名稱是col-start的網格線。
演示程序
11 用網格區域命名和定位項目如同網格線命名,可以用屬性grid-template-areas給網格區域命名。網格區域名稱可以用來定位網格項目。
11.1 例26grid { display: grid; grid-template-areas: "header header" "content sidebar" "footer footer"; grid-template-rows: 150px 1fr 100px; grid-template-columns: 1fr 200px; }
一組區域名稱要放在單引號或雙引號內,每一個名稱之間以空格分隔。
每一組名稱定義一行,每一個名稱定義一列。
11.2 例27header { grid-row-start: header; grid-row-end: header; grid-column-start: header; grid-column-end: header; }
網格區域名稱可以用在屬性grid-row-start, grid-row-end, grid-column-start, 和 grid-column-end的值中,用來定位項目。
11.3 例28footer { grid-row: footer; grid-column: footer; }
網格區域名稱也可以用于簡寫屬性grid-row 和 grid-column的值中。
11.4 例29aside { grid-area: sidebar; }
網格區域名稱也可以用于簡寫屬性grid-area的值中。
演示程序
12 隱式網格隱式網格用來在顯式網格之外定位項目。有時在顯示網格中沒有足夠的空間,或者是要在顯示網格之外定位項目就要用到隱式網格。這時可以把這些項目放置在隱式網格中。
隱式網格可以通過屬性 grid-auto-rows, grid-auto-columns, 和 grid-auto-flow 來定義。
12.1 例30grid { display : grid; grid-template-rows: 70px; grid-template-columns: repeat(2, 1fr); grid-auto-rows: 140px; }
本例中,只定一個行軌道,因此項目 1 和 2 高 70px 。
第2行軌道有隱式網格自動創建并為項目 3 和 4 分配了空間。 屬性grid-auto-rows 定義了隱式網格的行軌道尺寸,即項目3和4的高度是 140px 。
演示程序
12.2 例31grid { display : grid; grid-auto-flow: row; }
缺省的網格布局方向是行的方向(row)。
12.3 例32grid { display : grid; grid-auto-flow: column; }
網格的布局方向可以定義為列的方向(column)。
12.4 例33grid { display : grid; grid-template-columns: 30px 60px; grid-auto-flow: column; grid-auto-columns: 1fr; }
本例中,我們只定義了兩個列軌道的尺寸30px 和 60px。
隱式網格中自動創建其它列并給項目3,4,5分配空間;分配的空間尺寸是通過屬性 grid-auto-columns定義的。
演示程序
13 隱式命名的網格區域網格線名稱可以任意指定,但分配以 -start 和 -end 結尾的名字有額外的益處,這樣隱式地創建了具名網格區域,該名稱可以用于項目定位。
13.1 例34grid { display : grid; grid-template-rows: [outer-start] 1fr [inner-start] 1fr [inner-end] 1fr [outer-end]; grid-template-columns: [outer-start] 1fr [inner-start] 1fr [inner-end] 1fr [outer-end]; }
本例中,行和列都有名為inner-start 和 inner-end的網格線,它們隱式地給網格區域分派了名稱(inner)。
item1 { grid-area: inner; }
這樣我們就能夠直接使用網格區域名來定位,而不需要再用網格線來定位項目了。
演示程序
14 隱式命名的網格線隱式命名網格線和隱式命名的網格區域的工作原理剛好相反。
14.1 例35grid { display : grid; grid-template-areas: "header header" "content sidebar" "footer footer"; grid-template-rows: 80px 1fr 40px; grid-template-columns: 1fr 200px; }
定義網格區域時隱式的命名了網格線的名稱。這些網格線的名稱是基于區域名加上-start 或 -end后綴組成的。
14.2 例36item1 { grid-row-start: header-start; grid-row-end: content-start; grid-column-start: footer-start; grid-column-end: sidebar-end; }
本例中,header是通過隱式網格線名稱進行定位的。
演示程序
15 層疊網格項目通過項目定位可以使多個項目層疊在一起,屬性z-index可以改變層疊項目的層次。
15.1 例37.item-1, .item-2 { grid-row-start: 1; grid-column-end: span 2; } .item-1 { grid-column-start: 1; z-index: 1; } .item-2 { grid-column-start: 2 }
本例中,項目1 和 2 行定位開始于第1條行網格線,并跨越兩列。
兩個項目都是用網格線編號進行定位。項目1起始于第1條列網格線,項目2起始于第2條列網格線,這使得兩個項目在第一行中間列發生層疊。
缺省情況下,項目2將層疊于項目1之上;然而,給項目1設置屬性z-index: 1就使得項目1層疊于項目2之上。
演示程序
15.2 例38.overlay { grid-row-start: header-start; grid-row-end: content-end; grid-column-start: content-start; grid-column-end: sidebar-start; z-index: 1; }
本例中,利用在 grid-template-areas 定義中的隱式網格線名稱,定位了一個網格項目(overlay),并將層疊于上層。
演示程序
16 網格項目的對齊方式CSS的 盒模型對齊模塊 補充了CSS網格的內容,網格項目可以按行或列的軸線方向實現多種對齊方式。
屬性justify-items 和 justify-self 以行軸為參照對齊項目,屬性align-items 和 align-self 以列軸為參照對齊項目。
屬性justify-items 和 align-items 是網格容器的屬性,并支持如下這些值:
auto
normal
start
end
center
stretch
baseline
first baseline
last baseline
16.1 例39.grid { grid-template-rows: 80px 80px; grid-template-columns: 1fr 1fr; grid-template-areas: "content content" "content content"; } .item { grid-area: content } .grid { justify-items: start }
在行的軸線起點處對齊。
演示程序
16.2 例40grid { justify-items: center; }
在行的軸線中點處對齊。
演示程序
16.3 例41grid { justify-items: end; }
在行的軸線終點處對齊。
演示程序
16.4 例42grid { justify-items: stretch; }
在行的軸線方向延伸并填滿整個區域。stretch是缺省值。
演示程序
16.5 例43grid { align-items: start; }
在列的軸線起點處對齊。
演示程序
16.6 例44grid { align-items: center; }
在列的軸線中點處對齊。
演示程序
16.7 例45grid { align-items: end; }
在列的軸線終點處對齊。
演示程序
16.8 例46grid { align-items: stretch; }
在列的軸線方向延伸并填滿整個區域。
演示程序
16.9 例47grid { justify-items: center; align-items: center; }
項目定位于行軸和列軸線的中間位置。
演示程序
17 網格項目的對齊方式2項目可以用屬性align-self 和 justify-self定義自己的對齊方式,并支持如下這些屬性值:
auto
normal
start
end
center
stretch
baseline
first baseline
last baseline
17.1 例48.item1 { justify-self: start } .item2 { justify-self: center } .item3 { justify-self: end }
屬性justify-self 在行的軸線方向定義對齊方式。
演示程序
17.2 例49.item1 { align-self: start } .item2 { align-self: center } .item3 { align-self: end }
屬性align-self 在列的軸線方向定義對齊方式。
演示程序
17.3 例50.item1 { justify-self: center align-self: center }
項目1定位在行的軸線和列的軸線的中間位置。
演示程序
18 網格軌道的對齊方式在網格容器中,網格軌道延軸線方向有多種對齊方式。
屬性align-content用于定義網格軌道延著行的軸線的對齊方式,而屬性justify-content用于定義網格軌道沿著列的軸線的對齊方式。并分別支持如下屬性:
normal
start
end
center
stretch
space-around
space-between
space-evenly
baseline
first baseline
last baseline
18.1 例51.grid { width: 100%; height: 300px; grid-template-columns: repeat(4, 45px); grid-template-rows: repeat(4, 45px); grid-gap: 0.5em; justify-content: start; }
列的軌道在行的軸線起點處對齊。start 是缺省值。
演示程序
18.2 例52.grid { justify-content: end; }
列的軌道在行的軸線終點處對齊。
演示程序
18.3 例53.grid { justify-content: center; }
列的軌道在行的軸線中間處對齊。
演示程序
18.4 例54.grid { justify-content: space-around; }
在每一列的兩側平均分配額外空間。
演示程序
18.5 例55.grid { justify-content: space-between; }
在列與列之間平均分配額外的空間。
演示程序
18.6 例56.grid { justify-content: space-evenly; }
在列與列之間及列與邊界之間平均分配額外空間。
演示程序
18.7 例57.grid { align-content: start; }
行的軌道在列的軸線起點處對齊,屬性start是缺省值。
演示程序
18.8 例58.grid { align-content: end; }
行的軌道在列的軸線終點處對齊。
演示程序
18.9 例59.grid { align-content: center; }
行的軌道在列的軸線中點處對齊。
演示程序
18.10 例60.grid { align-content: space-around; }
每一行的兩側平均分配額外空間。
演示程序
18.11 例61.grid { align-content: space-between; }
在行與行之間平均分配額外空間。
演示程序
18.12 例62.grid { align-content: space-evenly; }
在行與行之間及行與邊界之間平均分配額外空間。
演示程序
結語本教程相對全面地介紹了網格的相關內容,但這并不是一個完整的技術文檔。想更全面的學習相關內容,推薦訪問 Mozilla開發者網絡 和 W3C 的網格文檔。
由于能力有限,翻譯中難免錯誤較多,還請大家多多諒解!
十分感謝原文作者Jonathan Suh在本文排版設計,示例制作,文字編輯等方面卓越的工作。
為了獲得最佳的閱體驗,請訪問如下排版的教程:
學習CSS網格
英文原版
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/113191.html
摘要:一概述網格布局是一套二維的頁面布局系統,它的出現將完全顛覆頁面布局的傳統方式。接下來,我們從網格容器到網格項的各個基本屬性來介紹網格布局。例網格項目按行排列,網格項目寬度由自身寬度決定。這時,瀏覽器會自動生成多余的網格,以便放置項目。 一、概述 CSS網格布局(Grid)是一套二維的頁面布局系統,它的出現將完全顛覆頁面布局的傳統方式。 首先來介紹幾個概念: 想象一個三行三列的布局,網格...
摘要:一概述網格布局是一套二維的頁面布局系統,它的出現將完全顛覆頁面布局的傳統方式。接下來,我們從網格容器到網格項的各個基本屬性來介紹網格布局。例網格項目按行排列,網格項目寬度由自身寬度決定。這時,瀏覽器會自動生成多余的網格,以便放置項目。 一、概述 CSS網格布局(Grid)是一套二維的頁面布局系統,它的出現將完全顛覆頁面布局的傳統方式。 首先來介紹幾個概念: 想象一個三行三列的布局,網格...
摘要:最精彩的地方在于所有的響應特性被添加到了一行代碼中。基礎響應單位柵格布局帶來了一個全新的值單位,單位通常簡寫為,它允許你根據需要將容器拆分為多個塊。 原文地址: https://medium.com/free-code-...原文作者: Per Harald Borgen 翻譯作者: hanxiansen showImg(https://segmentfault.com/img/re...
摘要:重復網格區域的名稱導致內容跨越這些單元格。中間一排將由兩個區域,一個是空單元格,一個區域組成。你可以使用任意數量的相鄰的點來聲明單個空單元格。只要這些點之間沒有空隙隔開,他們就代表一個單獨的單元格。? CSS Grid 布局是 CSS 中最強大的布局系統。與 flexbox 的一維布局系統不同,CSS Grid 布局是一個二維布局系統,也就意味著它可以同時處理列和行。通過將 CSS 規則應用...
閱讀 2967·2021-11-25 09:43
閱讀 3632·2021-08-31 09:41
閱讀 1237·2019-08-30 15:56
閱讀 2118·2019-08-30 15:55
閱讀 2993·2019-08-30 13:48
閱讀 2815·2019-08-29 15:15
閱讀 984·2019-08-29 15:14
閱讀 2657·2019-08-28 18:26