Grid網格布局介紹
- 網格布局(Grid)是一種更為強大的CSS布局方案,就像是flex布局的更新版。Grid将元素劃分成一個個網格,實作任意組合,做出各種布局。
- 相較于felx布局,Flex 布局是軸線布局,隻能指定"項目"針對軸線的位置,可以看作是一維布局。Grid 布局則是将容器劃分成"行"和"列",産生單元格,然後指定"項目所在"的單元格,可以看作是二維布局。
Grid布局屬性
Grid 布局的屬性分成兩類。一類定義在容器上面,稱為容器屬性;另一類定義在項目上面,稱為項目屬性。這部分先介紹容器屬性。
一、display 屬性
-
指定一個容器采用網格布局。display: grid
運作效果:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .container{ display: grid; grid-template-columns: 50px 50px 50px; grid-template-rows: 50px 50px 50px; } .item{ font-size: 24px; text-align: center; border: 1px solid #fff; } </style> </head> <body style="padding-left: 500px;padding-top: 300px;"> <span style="font-size: 24px">head</span> <div class="container"> <div class="item item1" style="background-color: Aqua;">1</div> <div class="item item2" style="background-color: Blue;">2</div> <div class="item item3" style="background-color: Fuchsia;">3</div> <div class="item item4" style="background-color: Green;">4</div> <div class="item item5" style="background-color: Maroon;">5</div> <div class="item item6" style="background-color: Navy;">6</div> <div class="item item7" style="background-color: Olive;">7</div> <div class="item item8" style="background-color: Red;">8</div> <div class="item item9" style="background-color: Yellow;">9</div> </div> <span style="font-size: 24px">foot</span> </body> </html>
-
display: inline-grid
指定指定元素為行内元素,采用網格布局。
代碼同上,display改為inline-grid
運作效果:
- ps:設為網格布局以後,容器子元素(項目)的float、display: inline-block、display: table-cell、vertical-align和column-*等設定都将失效。
二、grid-template-columns 屬性、grid-template-rows 屬性
- 指定子元素為網格布局後,可以使用
和grid-template-columns
屬性指定grid-template-rows
和每每一列的列寬
一行的行高
。
如:指定一行3行3列寬高均為80的元素。
.container{ display: inline-grid; grid-template-columns: 80px 80px 80px; grid-template-rows: 80px 80px 80px; }
- 除了使用絕對高度,也可以使用百分比。(需要指定父元素的寬高。)
.container{ width: 306px; height: 306px; display: inline-grid; grid-template-columns: 33.3% 33.3% 33.3%; grid-template-rows: 33.3% 33.3% 33.3%; }
- 當元素數量過多時,顯然全部寫出來會非常繁瑣。此時可以使用
repeat()
函數。repeat()函數接收兩個參數值,第一個參數值是重複的次數,第二個參數是重複的值。
如:将上述用repeat()重寫後為:、
除了接收固定的次數與值,.container{ width: 306px; height: 306px; display: inline-grid; grid-template-columns: repeat(3,33.3%); grid-template-rows: repeat(3,33.3%); }
repeat()
函數也可以接收重複的次數和某種模式。
如:列寬定義重複兩次,每次三列,第一列寬度為33px,第二列寬度為66px,第三列寬度為99px
行高定義重複兩次,每行高33%
運作效果:.container{ width: 306px; height: 306px; display: grid; grid-template-columns: repeat(2, 33px 66px 99px); grid-template-rows: repeat(2,33%); }
- 有時,單元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容納盡可能多的單元格,這時可以使用
auto-fill
關鍵字表示自動填充。
如:指定元素每列寬度為300px,然後自動填充,直到容器不能放置更多的列。
如:指定元素每列寬度為100px,然後自動填充,直到容器不能放置更多的列。.container{ display: grid; grid-template-columns: repeat(auto-fill, 300px); grid-template-rows: repeat(2,100px); }
如:指定元素每列寬度為60px,然後自動填充,直到容器不能放置更多的列。.container{ display: grid; grid-template-columns: repeat(auto-fill, 100px); grid-template-rows: repeat(2,100px); }
.container{ display: grid; grid-template-columns: repeat(auto-fill, 60px); grid-template-rows: repeat(2,100px); }
- 為了友善表示比例關系,網格布局提供了
關鍵字(fraction 的縮寫,意為"片段")。如果四列的寬度分别為1fr、2fr、4fr、6fr,就表示後面每列依次為第一列2倍、4倍、6倍。fr
.container{ display: grid; grid-template-columns: 1fr 2fr 4fr 6fr; grid-template-rows: repeat(3,33%); }
關鍵字可以與絕對寬度配合使用,非常友善。fr
.container{ display: grid; grid-template-columns: 100px 1fr 2fr 1fr 100px; grid-template-rows: repeat(2,100px); }
-
minmax()
函數産生一個長度範圍,表示長度就在這個範圍之中。它接受兩個參數,分别為最小值和最大值。
如:表示列寬不小于100px,不大于3fr。
.container{ display: grid; grid-template-columns: 1fr 2fr minmax(100px, 3fr); grid-template-rows: repeat(3,100px); }
-
auto
關鍵字表示由浏覽器自己決定長度。
如:第一列和第三列為100px,第二列自動調節。第二列的寬度,基本上等于該列單元格的最大寬度,除非單元格内容設定了
,且這個值大于最大寬度。min-width
.container{ display: grid; grid-template-columns: 100px auto 100px; grid-template-rows: repeat(3,100px); }
-
屬性和grid-template-columns
屬性裡面,還可以使用grid-template-rows
方括号
,指定每一根網格線的名字,友善以後的引用。
如:代碼指定網格布局為3行 x 3列,是以有4根垂直網格線和4根水準網格線。方括号裡面依次是這八根線的名字。
網格布局允許同一根線有多個名字,比如
。[fifth-line row-5]
.container{ display: grid; grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4]; grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4]; }
-
實用案例
① 兩欄布局
② 十二網格.wrapper { display: grid; grid-template-columns: 70% 30%; }
grid-template-columns: repeat(12, 1fr);
三、grid-row-gap 屬性、grid-column-gap 屬性、grid-gap 屬性
-
屬性設定行與行的間隔(行間距),grid-row-gap
grid-column-gap
屬性設定列與列的間隔(列間距)。
如:指定每行每列之間間距20px
.container{ display: grid; grid-template-columns: repeat(3, 100px); grid-template-rows: repeat(3, 100px); grid-row-gap: 20px; grid-column-gap: 20px; }
-
是grid-gap
grid-column-gap
合并簡寫。文法:grid-row-gap
grid-gap: <grid-row-gap> <grid-column-gap>;
如果grid-gap省略了第二個值,浏覽器認為第二個值等于第一個值。
如:上述代碼用grid-gap改寫
.container{ display: grid; grid-template-columns: repeat(3, 100px); grid-template-rows: repeat(3, 100px); grid-gap: 20px 20px; }
- 根據最新标準,上面三個屬性名的
字首已經删除,grid-
和grid-column-gap
寫成grid-row-gap
和column-gap
,row-gap
寫成grid-gap
。gap
四、grid-template-areas 屬性
網格布局允許指定"區域"(area),一個區域由單個或多個單元格組成。
grid-template-areas
屬性用于定義區域。
如:下述代碼先劃分出9個單元格,然後将其定名為
a
到
i
的九個區域,分别對應這九個單元格。
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-template-areas: 'a b c'
'd e f'
'g h i';
}
如:多個單元格合并成一個區域的寫法如下。将9個單元格分成
a
、
b
、
c
三個區域。
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-template-areas: 'a a a'
'b b b'
'c c c';
}
如:執行個體頂部是頁眉區域
header
,底部是頁腳區域
foote
r,中間部分則為
main
和
sidebar
。
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-template-areas: "header header header"
"main main sidebar"
"footer footer footer";
}
如果某些區域不需要利用,則使用"點"(.)表示。
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-template-areas: 'a . a'
'b b .'
'. c c';
}
注意,區域的命名會影響到網格線。每個區域的起始網格線,會自動命名為區域名-start,終止網格線自動命名為區域名-end。比如,區域名為header,則起始位置的水準網格線和垂直網格線叫做header-start,終止位置的水準網格線和垂直網格線叫做header-end。
五、grid-auto-flow 屬性
劃分網格以後,容器的子元素會按照順序,自動放置在每一個網格。預設的放置順序是"先行後列",即先填滿第一行,再開始放入第二行,即下圖數字的順序。
這個順序由
grid-auto-flow
屬性決定,預設值是
row
,即"先行後列"。也可以将它設成
column
,變成"先列後行"。
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-auto-flow: column;
}
grid-auto-flow
屬性除了設定成
row
和
column
,還可以設成
row dense
和
column dense
。這兩個值主要用于,某些項目指定位置以後,剩下的項目怎麼自動放置。
如:指定1、2各占兩個單元格,在預設情況下,3會跟在2後面,形成以下樣式
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px 100px;
grid-auto-flow: row;
}
.item{
font-size: 24px;
text-align: center;
border: 1px solid #fff;
}
.item1, .item2{
grid-column-start: 1;
grid-column-end: 3;
}
設定
grid-auto-flow: row dense;
表示"先行後列",并且盡可能緊密填滿,盡量不出現空格。形成以下樣式:
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px 100px;
grid-auto-flow: row dense;
}
如果設定
grid-auto-flow: column dense;
,改為先列後行,出現以下樣式。
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px 100px;
grid-auto-flow: column dense;
}
六、justify-items 屬性、align-items 屬性、place-items 屬性
和
flex
布局類似,
justify-items
屬性設定單元格内容的水準位置(左中右),
align-items
屬性設定單元格内容的垂直位置(上中下)。
.container {
justify-items: start | end | center | stretch;
align-items: start | end | center | stretch;
}
這兩個屬性可以取以下值:
-
:對齊單元格的起始邊緣。start
-
:對齊單元格的結束邊緣。end
-
:單元格内部居中。center
-
:拉伸,占滿單元格的整個寬度(預設值)。stretch
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
justify-items: start;
}
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
justify-items: center;
}
place-items屬性是align-items屬性和justify-items屬性的合并簡寫形式。
place-items: <align-items> <justify-items>;
如果省略第二個值,則浏覽器認為與第一個值相等。
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
place-items: start end;
}
七、justify-content 屬性、align-content 屬性、place-content 屬性
justify-content
屬性是整個内容區域在容器裡面的水準位置(左中右),
align-content
屬性是整個内容區域的垂直位置(上中下)。
.container {
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
這兩個屬性可以取以下值:
-
:對齊容器的起始邊框。start
-
:對齊容器的結束邊框。end
-
: 容器内部居中。center
-
:項目大小沒有指定時,拉伸占據整個網格容器。stretch
-
:每個項目兩側的間隔相等。是以,項目之間的間隔比項目與容器邊框的間隔大一倍。space-around
-
:項目與項目的間隔相等,項目與容器邊框之間沒有間隔。space-between
-
:項目與項目的間隔相等,項目與容器邊框之間也是同樣長度的間隔。space-evenly
如:start
.container{
width: 350px;
height: 350px;
border: 1px solid #000;
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
justify-content: start;
}
center
space-around
space-between
place-content
屬性是
align-content
屬性和
justify-content
屬性的合并簡寫形式。
place-content: <align-content> <justify-content>
如:
.container{
width: 350px;
height: 350px;
border: 1px solid #000;
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
place-content:center space-evenly ;
}
八、grid-auto-columns 屬性、grid-auto-rows 屬性
有時候,一些項目的指定位置,在現有網格的外部。比如網格隻有3列,但是某一個項目指定在第5行。這時,浏覽器會自動生成多餘的網格,以便放置項目。
grid-auto-columns
屬性和
grid-auto-row
s屬性用來設定,浏覽器自動建立的多餘網格的列寬和行高。它們的寫法與
grid-template-columns
和
grid-template-rows
完全相同。如果不指定這兩個屬性,浏覽器完全根據單元格内容的大小,決定新增網格的列寬和行高。
如:
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-auto-rows: 50px;
}
.item{
font-size: 24px;
text-align: center;
border: 1px solid #fff;
}
.item8{
grid-row-start: 4;
grid-column-start: 2;
}
九、grid-template 屬性、grid 屬性
grid-template
屬性是
grid-template-columns
、
grid-template-rows
和
grid-template-areas
這三個屬性的合并簡寫形式。
grid
屬性是
grid-template-rows
、
grid-template-columns
、
grid-template-areas
、
grid-auto-rows
、
grid-auto-column
s、
grid-auto-flow
這六個屬性的合并簡寫形式。
從易讀易寫的角度考慮,還是建議不要合并屬性
項目屬性
一、grid-column-start 屬性、grid-column-end 屬性、grid-row-start 屬性、grid-row-end 屬性
項目的位置是可以指定的,具體方法就是指定項目的四個邊框,分别定位在哪根網格線。
- grid-column-start屬性:左邊框所在的垂直網格線
- grid-column-end屬性:右邊框所在的垂直網格線
- grid-row-start屬性:上邊框所在的水準網格線
- grid-row-end屬性:下邊框所在的水準網格線
.container{
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
}
.item{
font-size: 24px;
text-align: center;
border: 1px solid #fff;
}
.item2{
grid-column-start: 2;
grid-column-end: 4;
}
這四個屬性的值,除了指定為第幾個網格線,還可以指定為網格線的名字。
.item-1 {
grid-column-start: header-start;
grid-column-end: header-end;
}
這四個屬性的值還可以使用
span
關鍵字,表示"跨越",即左右邊框(上下邊框)之間跨越多少個網格。
.item-1 {
grid-column-start: span 2;
}
二、grid-column 屬性、grid-row 屬性
grid-column
屬性是
grid-column-start
和
grid-column-end
的合并簡寫形式
grid-row
屬性是
grid-row-start
屬性和
grid-row-end
的合并簡寫形式。
grid-column: / ;
grid-row: / ;
.item-1 {
grid-column: 1 / 3;
grid-row: 1 / 2;
}
/* 等同于 */
.item-1 {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 2;
}
三、grid-area 屬性
grid-area屬性指定項目放在哪一個區域。
.item-1 {
grid-area: e;
}
.item {
grid-area: <row-start> / <column-start> / <row-end> / <column-end>;
}
四、justify-self 屬性、align-self 屬性、place-self 屬性
.item {
justify-self: start | end | center | stretch;
align-self: start | end | center | stretch;
}
- start:對齊單元格的起始邊緣。
- end:對齊單元格的結束邊緣。
- center:單元格内部居中。
- stretch:拉伸,占滿單元格的整個寬度(預設值)。