CSS Grid Layout是CSS為布局新增的一個(gè)網(wǎng)格布局的模塊泊窘,網(wǎng)格布局主要針對(duì)Web應(yīng)用程序開發(fā)箕慧。
- Flex布局:基于軸線的一維布局
- Grid布局:基于網(wǎng)格的二維布局
Flex彈性布局是軸線布局锅睛,需指定項(xiàng)目所針對(duì)軸線的位置芒澜,因此可看作是一維布局埋合。Grid網(wǎng)格布局則是將容器劃分為行和列以產(chǎn)生單元格揍异,然后指定項(xiàng)目所在單元格全陨,因此可以看作是二維布局。
Grid網(wǎng)格布局的核心理念與Flexbox彈性盒子類似衷掷,都是基于容器Container
和容器中的項(xiàng)目Item
烤镐。CSS網(wǎng)格(Grid)布局與彈性(Flexbox)一維布局不同之處在于,Grid是一個(gè)二維布局系統(tǒng)棍鳖,它可以同時(shí)處理行和列炮叶。通過將CSS規(guī)則應(yīng)用于父元素(Container碗旅,網(wǎng)格容器)和子元素(Items,網(wǎng)格項(xiàng))可輕松使用網(wǎng)格布局镜悉。
CSS網(wǎng)格布局的目標(biāo)是完全改變基于網(wǎng)格的用戶界面的布局方式祟辟,之前使用表格(Table)、浮動(dòng)(Float)侣肄、定位(Position)旧困、內(nèi)嵌塊(Inline-Block)的布局方式本質(zhì)上都只是Hacks,他們會(huì)遺落很多重要的設(shè)置稼锅,比如垂直居中吼具。網(wǎng)格布局創(chuàng)建的結(jié)構(gòu)與使用古老的Table
表格標(biāo)簽類似,只是Grid布局是在CSS中實(shí)現(xiàn)而非HTML中實(shí)現(xiàn)矩距。同時(shí)可使用媒體查詢根據(jù)不同上下文重新定義布局拗盒。對(duì)于響應(yīng)式設(shè)計(jì)從此不再擔(dān)心因?yàn)镠TML結(jié)構(gòu)而影響布局。Grid布局可讓現(xiàn)有布局脫離文檔流的限制锥债,也就是說陡蝇,HTML結(jié)構(gòu)無需根據(jù)設(shè)計(jì)稿從上往下布置,可以自由地更改頁(yè)面元素的位置哮肚。
雖然Flexbox彈性盒子的出現(xiàn)改善了布局方式登夫,但它的目標(biāo)是為了解決簡(jiǎn)單的一維布局,對(duì)于復(fù)雜的二維布局Grid網(wǎng)格布局則是專門為解決此類問題而創(chuàng)建的CSS模塊允趟。實(shí)際上Flexbox彈性盒子和Grid網(wǎng)格布局是可以協(xié)同工作完美配合的恼策。
例如:使用Grid網(wǎng)格布局定位頁(yè)面內(nèi)容,對(duì)齊標(biāo)頭組件潮剪,并將頁(yè)面變?yōu)轫憫?yīng)式涣楷。
- 定位頁(yè)面內(nèi)容
使用Grid的網(wǎng)格模板區(qū)域grid-template-areas
,定義四個(gè)網(wǎng)格區(qū)域分別為header鲁纠、main总棵、sidebar、footer
<style>
.container{display:grid; grid-template-areas:"header header" "main sidebar" "footer footer"; grid-gap;60px;}
header{grid-area:header;}
.main{grid-area:main;}
.sidebar{grid-area:sidebar;}
footer{grid-area:footer;}
</style>
<header></header>
<section class="main"></section>
<aside class="sidebar"></aside>
<footer></footer>
- 將頁(yè)面變?yōu)轫憫?yīng)式
使用媒體查詢重新排列網(wǎng)格區(qū)域
@media (max-width:600px){
.container{grid-template-areas:"header" "main" "sidebar" "footer"; grid-template-columns:1fr;}
}
- 對(duì)齊標(biāo)頭組件
在header
中為了拆分導(dǎo)航和按鈕改含,需在header
中為標(biāo)頭定義display:grid
屬性情龄,并設(shè)置一個(gè)2列的網(wǎng)格,同時(shí)定義在對(duì)應(yīng)的邊界上捍壤。
header{display:grid; grid-template-columns:1fr 1fr;}
header nav{justify-self:start;}
header button{justify-self:end;}
完整代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>grid</title>
</head>
<body>
<div class="container">
<header>
<nav>
<div class="nav-item"><a href="#"><h1>Header</h1></a></div>
<div class="nav-item"><a href="#">link</a></div>
</nav>
<button class="btn">button</button>
</header>
<section class="main">
<h2 class="title">CSS Grid Layout</h2>
<div class="content">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </div>
<img src="http://www.quanbaike.com/tool/picapi/2d/api.php">
</section>
<aside class="sidebar">
<h3>sidebar</h3>
</aside>
<footer>
<h3>footer</h3>
<div>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</div>
</footer>
</div>
</body>
</html>
*{margin:0; padding:0; box-sizing:border-box;}
body{text-decoration:none; color:inherit;}
a{text-decoration:none; color:inherit;}
/*layout*/
.container{
max-width:900px; margin:0 auto; padding:0 60px; background-color:#fafafa;
display:grid; grid-template-areas:"header header" "main sidebar" "footer footer"; grid-template-columns:3fr 1fr; grid-gap:60px;
}
/*header*/
header{
grid-area:header; padding:20px 0; color:#ef5350;
display:grid; grid-template-columns:1fr 1fr;
}
header nav{justify-self:start;}
header button{justify-self:end;}
.nav-item{display:inline-block; margin-right:15px;}
.btn{border:none; background-color:#ef5350; color:#fff; padding:8px 25px; cursor:pointer; text-transform:uppercase;}
/*main*/
.main{grid-area:main;}
.main .title{font-size:32px; margin-bottom:55px;}
.main .content{margin-bottom:50px;}
.main img{width:100%;}
/*sidebar*/
.sidebar{grid-area:sidebar; padding:20px; border:1px solid #a2a2a2;}
/*footer*/
footer{grid-area:footer; padding:20px 0; color:#ef5350; text-align:center;}
footer div{padding:10px; color:#777; font-size:12px;}
/*media*/
@media (max-width: 600px){
.container{grid-template-areas:"header" "main" "sidebar" "footer"; grid-template-columns:1fr;}
}
網(wǎng)格結(jié)構(gòu)
使用Grid布局骤视,首先需要使用display:grid
將父元素定義為一個(gè)網(wǎng)格容器,然后使用grid-template-rows
和grid-template-column
設(shè)置行和列的尺寸鹃觉。接著通過grid-row
和grid-column
將容器子元素放入其中专酗。
Grid布局與Flexbox相似之處在于尤蛮,網(wǎng)格項(xiàng)(Grid Item)的HTML源碼結(jié)構(gòu)的順序是不重要的溪北,CSS可以以任何順序放置它們做院,這使得媒體查詢(Media Queries)重新排列網(wǎng)格變得容易市框。可以通過定義整個(gè)頁(yè)面的布局佑笋,然后重新排列布局以使用不同的屏幕寬度翼闹。
- 網(wǎng)格容器(Grid Container)
網(wǎng)格布局的節(jié)點(diǎn)區(qū)域,即應(yīng)用display:grid
的元素蒋纬,是網(wǎng)格項(xiàng)(Grid Item)的直接父級(jí)猎荠。
<div class="grid-container">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
網(wǎng)格項(xiàng)(Grid Item)
網(wǎng)格項(xiàng)是網(wǎng)格容器的直屬下級(jí)元素,網(wǎng)格容器內(nèi)部不采用網(wǎng)格定位的子元素蜀备,只能是頂級(jí)元素关摇。網(wǎng)格線(Grid Line)
網(wǎng)格線是構(gòu)成網(wǎng)格系統(tǒng)的分界線或分割線,用來分隔容器的線碾阁,可分為水平網(wǎng)格線(row grid lines)和垂直網(wǎng)格線(column grid lines)输虱,用于將網(wǎng)格切分為行和列并定位網(wǎng)格項(xiàng)。
- 網(wǎng)格軌道(Grid Track)
網(wǎng)格軌道是指兩條相鄰網(wǎng)格線之間的空間瓷蛙,可見其想象成是網(wǎng)格的行或列悼瓮。
- 網(wǎng)格單元格(Grid Cell)
兩個(gè)相鄰行列網(wǎng)格線之間的交叉空間戈毒,行和列交叉形成單元格艰猬。單元格是網(wǎng)格系統(tǒng)中的一個(gè)單元。
- 網(wǎng)格區(qū)域(Grid Area)
網(wǎng)格區(qū)域是由任意數(shù)量的網(wǎng)格單元格組成的空間區(qū)域
- 行:水平分割線分割成行埋市,n行需要n+1條水平分割線冠桃。
- 列:垂直分割線將容器分隔成列,n列需n+1條垂直分割線道宅。
網(wǎng)格項(xiàng)和單元格之間的區(qū)別
例如:使用Grid網(wǎng)格布局實(shí)現(xiàn)圣杯布局
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>grid</title>
</head>
<body>
<div class="container">
<header class="header">header</header>
<aside class="navbar">navbar</aside>
<main class="main">main</main>
<aside class="sidebar">sidebar</aside>
<footer class="footer">footer</footer>
</div>
</body>
</html>
*{margin:0; padding:0; box-sizing:border-box;}
body{text-decoration:none; color:inherit;}
a{text-decoration:none; color:inherit;}
/*layout*/
.container{
max-width:56em; margin:0 auto; padding:1em; background-color:#fafafa;
display:grid; grid-template-areas:"header header header" "navbar main sidebar" "footer footer footer"; grid-template-columns:1fr 3fr 1fr; grid-template-rows:1fr 3fr 1fr; grid-gap:1em;
}
.header .footer{grid-column:1 / 4;}
.container > *{display:flex; justify-content:center; align-items:center; border:1px solid #eee; padding:1em;}
/*header*/
.header{grid-area:header;}
/*navebar*/
.navebar{grid-area:navebar;}
/*main*/
.main{grid-area:main;}
/*sidebar*/
.sidebar{grid-area:sidebar;}
/*footer*/
.footer{grid-area:footer;}
/*media*/
@media all and (max-width: 700px){
aside, main{grid-column:1 / 4;}
}
網(wǎng)格容器
默認(rèn)情況下食听,網(wǎng)格容器中的元素都是塊級(jí)元素,但也可設(shè)置為行內(nèi)元素污茵。
設(shè)置網(wǎng)格容器
-
display:grid
使用display:grid
指定節(jié)點(diǎn)后便可以使用網(wǎng)格布局來構(gòu)建行和列樱报,用于生成一個(gè)塊級(jí)網(wǎng)格。
<style>
.grid-container{
display:grid;
}
</style>
<div div="grid"></div>
-
display:inline-block
用于生成一個(gè)內(nèi)聯(lián)網(wǎng)格
當(dāng)設(shè)置網(wǎng)格布局后泞当,網(wǎng)格容器內(nèi)的網(wǎng)格項(xiàng)的float
迹蛤、display:inline-block
、display:table-cell
襟士、display:vertical-align
和column-*
等設(shè)置都將會(huì)失效盗飒。
-
float
和clear
使用在網(wǎng)格項(xiàng)中會(huì)失效 - 多列布局模塊中的
column-*
屬性運(yùn)用在網(wǎng)格容器上會(huì)失效 -
vertical-align
使用在網(wǎng)格單元格上會(huì)失效 -
:first-line
和:first-letter
等為元素不能應(yīng)用在網(wǎng)格容器上
容器屬性 | 描述 |
---|---|
display | 將元素定義為網(wǎng)格,并為其內(nèi)容建立網(wǎng)格格式的上下文陋桂。 |
grid-template-columns | 設(shè)置列內(nèi)容的屬性 |
grid-template-rows | 設(shè)置行內(nèi)容的屬性 |
grid-gap | 設(shè)置行或列的間距 |
grid-template-areas | 設(shè)置單元格區(qū)域 |
grid-auto-flow | 設(shè)置單元格方向 |
grid-auto-columns | 設(shè)置超出網(wǎng)格的單元格屬性 |
grid-auto-rows | 設(shè)置超出網(wǎng)格的單元格屬性 |
place-items | 設(shè)置單元格中內(nèi)容排列位置 |
place-content | 設(shè)置內(nèi)容區(qū)域在容器中的位置 |
網(wǎng)格項(xiàng)目
網(wǎng)格項(xiàng)目通過引用特定網(wǎng)格線(grid lines)來確定網(wǎng)格項(xiàng)(grid item)在網(wǎng)格內(nèi)的位置
.grid-item{
grid-column-start: <line> | <name> | span <number> | span <name> | auto;
grid-column-end: <line> | <name> | span <number> | span <name> | auto;
grid-row-start: <line> | <name> | span <number> | span <name> | auto;
grid-row-end: <line> | <name> | span <number> | span <name> | auto;
}
網(wǎng)格項(xiàng)屬性 | 描述 |
---|---|
grid-row-start | 網(wǎng)格項(xiàng)行開始網(wǎng)格線 |
grid-row-end | 網(wǎng)格項(xiàng)行結(jié)束網(wǎng)格線 |
grid-column-start | 網(wǎng)格項(xiàng)列開始網(wǎng)格線 |
grid-column-end | 網(wǎng)格項(xiàng)列結(jié)束網(wǎng)格線 |
grid-row | grid-row-start和grid-row-end的合并簡(jiǎn)化形式 |
grid-column | grid-column-start和grid-column-end的合并簡(jiǎn)化形式 |
網(wǎng)格線取值類型
取值類型 | 描述 |
---|---|
line | 一個(gè)數(shù)字引用一個(gè)編號(hào)的網(wǎng)格線逆趣,或使用一個(gè)名字來引用一個(gè)命名的網(wǎng)格線。 |
span <number> | 網(wǎng)格項(xiàng)跨越所提供的網(wǎng)格軌道的數(shù)量 |
span <name> | 網(wǎng)格項(xiàng)跨域到與之提供的名稱位置 |
auto | 自動(dòng)放置自動(dòng)跨越嗜历,默認(rèn)會(huì)擴(kuò)展一個(gè)網(wǎng)格軌道的寬度或高度宣渗。 |
當(dāng)元素設(shè)置網(wǎng)格項(xiàng)屬性后抖所,以下CSS屬性將對(duì)網(wǎng)格項(xiàng)失效。
float
display:inline-block
display:table-cell
vertical-align
column-*
例如:網(wǎng)格項(xiàng)定位
- 列:從第2條列線開始到名為
five
的列線結(jié)束 - 行:從名為
row1-start
行線開始到第3條行線結(jié)束
.grid-container{
display:grid;
}
.item-a{
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start;
grid-row-end:3;
}
例如:網(wǎng)格線跨度
- 列:從第1條列線開始跨越到名為col4-start的列線結(jié)束
- 行:從第2條行線開始跨越2條行線后結(jié)束
.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
屬性痕囱,默認(rèn)情況下網(wǎng)格項(xiàng)將占據(jù)1個(gè)軌道部蛇。網(wǎng)格項(xiàng)是可以相互重疊的,可設(shè)置z-index
屬性來控制層疊的上下順序咐蝇。
簡(jiǎn)化形式
grid-column
和grid-row
屬性是grid-column-start
+grid-column-end
和grid-row-start
+grid-row-end
屬性的簡(jiǎn)寫形式涯鲁。
.grid-item{
grid-column: <start-line> / <end-line> | <start-line> / span <value>;
grid-row: <start-line> / <end-line> | <start-line> / span <value>;
}
grid-column
和grid-row
的取值是<start-line> / <end-line>
,每個(gè)網(wǎng)格項(xiàng)接受相同的值有序,包括跨度抹腿。
例如:網(wǎng)格項(xiàng)定位簡(jiǎn)寫
- 列:從第3條列線開始跨越2個(gè)網(wǎng)格后結(jié)束
- 行:從名為
third-line
的行線開始到第4個(gè)行線結(jié)束
.item-c{
grid-column: 3 / span 2;
grid-row: third-line / 4;
}
若沒有聲明分割線結(jié)束位置,則網(wǎng)格項(xiàng)默認(rèn)占據(jù)1個(gè)網(wǎng)格軌道旭寿。
行高列寬
使用grid-template-rows
設(shè)置行高警绩,使用grid-template-columns
設(shè)置列寬。grid-template-rows
和grid-template-columns
使用空格分隔的值列表盅称,用來定義網(wǎng)格的行和列肩祥。這些值表示網(wǎng)格軌道(Grid Track)的大小,他們之間的空格則表示分割線缩膝。
取值 | 描述 |
---|---|
track-size | 可以是長(zhǎng)度值混狠、百分比、等分塊fr
|
line-name | 名稱 |
.grid-container{
display:grid;
grid-template-rows:<track-size>... | <line-name> <track-size>...;
grid-template-columns:<track-size>... | <line-name> <track-size>...;
}
需要注意的是疾层,當(dāng)在網(wǎng)格軌道值之間保留空格時(shí)網(wǎng)格線會(huì)自動(dòng)分配正數(shù)和負(fù)數(shù)的名稱将饺,也可明確指定網(wǎng)格線名稱。
.grid-container{
display:grid;
grid-template-rows: 25% 100px auto;
grid-template-columns: 40px 50px auto 50px 40px;
}
.grid-container{
display:grid;
grid-template-rows:[row1-first] 25% [row1-end] 100px [third-line] auto [last-line];
grid-template-columns:[first] 40px [line2] 50px [line3] auto [col-start] 50px [five] 40px [end];
}
當(dāng)指定網(wǎng)格線名稱是需使用[]
中括號(hào)將名稱包裹
一條網(wǎng)格線可以包含多個(gè)名稱痛黎,網(wǎng)格線名稱<line-name>
的多個(gè)名稱之間使用空格分隔予弧。
.grid-container{
display:grid;
grid-template-rows:[row1-start] 25% [row2-start row1-end] 25% [row2-end];
}
如果需要定義包含多個(gè)重復(fù)的值,可使用repeat()
表示法來簡(jiǎn)化定義湖饱。
.grid-container{
display:grid;
grid-template-columns: repeat(2, 20px [col]);
}
/*等價(jià)寫法*/
.grid-container{
display:grid;
grid-template-columns: 20px [col] 20px [col];
}
例如:設(shè)置3行4列的網(wǎng)格掖蛤,每個(gè)單元格空間都是100px,即每個(gè)單元格的行高為100px井厌,列寬為100px蚓庭。
.grid{
display:grid;
grid-template-rows:100px 100px 100px;
grid-template-columns:100px 100px 100px 100px;
}
行高和列表的設(shè)置方式
設(shè)置方式 | 描述 |
---|---|
絕對(duì)單位 | grid-template-rows: 100px 100px 100px; |
使用百分比%
|
grid-template-columns: 25% 25% 25% 25%; |
使用repeat() 方法 |
grid-template-columns: repeat(4, 25%); |
使用fr 關(guān)鍵字 |
grid-template-columns: 50px 3fr 1fr 2fr; |
使用minmax() 方法 |
grid-template-columns:150px 1fr 1fr minmax(50px, 150px); |
使用auto 關(guān)鍵字 |
grid-template-columns:100px auto 130px 100px; |
使用網(wǎng)格線的名稱 | grid-template-columns: [c1] 100px [c2] 100px [c1] 100px [c3] auto [c4]; |
repeat
使用repeat()
方法
repeat(times, value)
參數(shù) | 描述 |
---|---|
times | 重復(fù)次數(shù) |
value | 重復(fù)的值 |
當(dāng)單元格很多且重復(fù)時(shí)可使用repeat
方法,repeat
方法可接受兩個(gè)參數(shù)旗笔,第一個(gè)時(shí)重復(fù)的次數(shù)彪置,第二個(gè)時(shí)所需重復(fù)的值。repeat
方法除了使用重復(fù)值蝇恶,還可以使用重復(fù)模式拳魁。
grid-template-rows: repeat(3 , 33%);
grid-template-columns: repeat(4, 25%);
重復(fù)模式
grid-template-columns: repeat(2, 100px 100px);
例如:使用Grid布局實(shí)現(xiàn)3x3的九宮格布局
<style>
.grid-container{
display:grid;
grid-template-columns:repeat(3, 33.3%);
grid-template-rows:repeat(3, 33.3%);
}
</style>
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
使用auto-fill
讓容器自動(dòng)判斷是否填充,當(dāng)單元格大小固定時(shí)但網(wǎng)格容器大小不確定時(shí)撮弧,若希望每一行或每一列可以容納盡可能多的單元格時(shí)可采用auto-fill
關(guān)鍵字來自動(dòng)填充潘懊。
grid-template-columns: repeat(auto-fill, 100px 20px 80px);
fr
使用fr
關(guān)鍵字
fr
(fraction姚糊,片段)單元允許使用等分網(wǎng)格容器剩余可用空間來設(shè)置網(wǎng)格軌道的大小。
例如:將每個(gè)網(wǎng)格項(xiàng)設(shè)置為網(wǎng)格空間寬度的1/3
.grid-container{
display:grid;
grid-template-rows: 1fr 1fr 1fr;
}
剩余可用空間是除開所有非靈活網(wǎng)格項(xiàng)之后計(jì)算得到的授舟,若兩列段都分別為1fr
和2fr
則表示后者為前者2倍救恨,可結(jié)合px
使用,可對(duì)剩余空間按fr
分配释树。
例如:可用空間總量減去50px后的剩余可用空間肠槽,使用fr
按等分比例分配。
grid-template-columns: 50px 3fr 1fr 2fr;
網(wǎng)格區(qū)域
可設(shè)置網(wǎng)格容器的grid-template-areas
屬性來指定網(wǎng)格區(qū)域名稱奢啥,用以定義網(wǎng)格模板秸仙。在通過設(shè)置網(wǎng)格項(xiàng)的grid-area
屬性來定義網(wǎng)格區(qū)域。
.grid-container{
grid-template-areas:
"<grid-area-name> | . | name | ..."
"...";
}
例如:定義3行4列網(wǎng)格桩盲,第1行由4個(gè)header區(qū)域組成寂纪,第2行由2個(gè)main區(qū)域和1個(gè)空單元格和1個(gè)sidebar區(qū)域組成,第3行由4個(gè)footer區(qū)域組成赌结。
.grid-container{
display:grid;
grid-template-areas:
"header header header header"
"main main . sidebar"
"footer footer footer footer";
}
.item-header{
grid-area:header;
}
.item-main{
grid-area:main;
}
.item-sidebar{
grid-area:sidebar;
}
.item-footer{
grid-area:footer;
}
- 使用一個(gè)點(diǎn)號(hào)
.
表示一個(gè)空單元格捞蛋,這種語法本身可視為網(wǎng)格的可視化結(jié)構(gòu)。 - 可以使用任意數(shù)量相鄰的點(diǎn)
.
來聲明單個(gè)空單元格柬姚,只要點(diǎn)之間沒有空隙隔開就代表一個(gè)單獨(dú)的單元格拟杉。 - 聲明中每一行都需要具有相同數(shù)量的單元格
- 重復(fù)的網(wǎng)格區(qū)域名稱將會(huì)導(dǎo)致內(nèi)容跨域單元格
網(wǎng)格模板
網(wǎng)格模板grid-template
用于定義grid-template-rows
、grid-template-columns
伤靠、grid-template-area
三個(gè)的簡(jiǎn)寫屬性捣域。
.grid-container{
grid-template: none | <grid-template-rows> / <grid-template-columns>;
}
-
grid-template:none
表示將三個(gè)屬性值設(shè)置為初始值 -
<grid-template-rows> / <grid-template-columns>
表示將grid-template-rows
和grid-template-columns
設(shè)置為特定的值啼染,同時(shí)設(shè)置grid-template-area
為none
宴合。
.grid-container{
grid-template:
[row1-start] "header header header" 25px [row1-end]
[row2-start] "footer footer footer" 25px [row2-end]
/ auto 50px auto;
}
.grid-container{
grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
grid-template-columns: auto 50px auto;
grid-areas:"header header header" "footer footer footer";
}
網(wǎng)格間隙
通過設(shè)置網(wǎng)格容器的grid-row-gap
和grid-column-gap
屬性來指定網(wǎng)格線的大小,可想象成行列之間的間距的寬度迹鹅,即行間距和列間距卦洽。
.grid-container{
grid-row-gap: <line-size>;
grid-column-gap: <line-size>;
}
/*簡(jiǎn)寫*/
.grid-container{
grid-gap: <grid-row-gap> <grid-column-gap>;
}
-
grid-gap
是grid-row-gap
和grid-column-gap
的簡(jiǎn)寫形式 - 若
grid-row-gap
沒有定義則自動(dòng)設(shè)置為grid-column-gap
的長(zhǎng)度
例如:設(shè)置九宮格布局
.grid-container{
display:grid;
grid-template-rows: 100px auto 100px;
grid-template-columns: 100px auto 100px;
grid-row-gap:15px;
grid-column-gap: 10px;
}
例如:九宮格間隙簡(jiǎn)寫
.grid-container{
display:grid;
grid-template-rows: 100px auto 100px;
grid-template-columns: 100px auto 100px;
grid-gap:15px 10px;
}
網(wǎng)格項(xiàng)對(duì)齊方式
網(wǎng)格容器內(nèi)的網(wǎng)格項(xiàng)的對(duì)齊方式可分為2種
- 水平對(duì)齊
justify-items
- 垂直對(duì)齊
align-items
通過設(shè)置網(wǎng)格容器的place-items
屬性,用于配置容器項(xiàng)的水平對(duì)齊方式justify-items
和垂直對(duì)齊方式align-items
斜棚。簡(jiǎn)單來說阀蒂,place-items
實(shí)際上是justify-items
和align-items
的簡(jiǎn)寫形式。
.grid-container{
display:grid;
place-items:<align-items> <justify-items>;
}
place-items
的第1個(gè)值用來設(shè)置align-items
垂直對(duì)齊屬性弟蚀,第2個(gè)值用來設(shè)置justify-items
水平對(duì)齊屬性蚤霞。若省略第2個(gè)值則第1個(gè)值將自動(dòng)分配給這兩個(gè)屬性。
水平對(duì)齊
通過設(shè)置網(wǎng)格容器的justify-items
屬性义钉,即沿著inline
行軸線對(duì)齊網(wǎng)格項(xiàng)昧绣,justify-items
屬性的取值即網(wǎng)格項(xiàng)的對(duì)齊方式,其值適用于網(wǎng)格容器內(nèi)的所有網(wǎng)格項(xiàng)捶闸。
.grid-container{
display:grid;
justify-items: start | end | center |stretch;
}
水平對(duì)齊 | 描述 |
---|---|
start | 左對(duì)齊夜畴,將網(wǎng)格項(xiàng)沿單元格左側(cè)起始邊緣對(duì)齊拖刃。 |
end | 右對(duì)齊,將網(wǎng)格項(xiàng)沿單元格右側(cè)結(jié)束邊緣對(duì)齊贪绘。 |
center | 居中對(duì)齊兑牡,將網(wǎng)格項(xiàng)沿單元格的水平中間位置對(duì)齊。 |
stretch | 默認(rèn)税灌,水平拉伸填滿單元格水平寬度均函。 |
四種內(nèi)容對(duì)齊方式也可應(yīng)用于網(wǎng)格項(xiàng)中的justify-self
屬性中。
.grid-item{
justify-item: start | end | center | stretch;
}
垂直對(duì)齊
通過設(shè)置網(wǎng)格容器的align-items
屬性可沿block
列軸線對(duì)齊網(wǎng)格項(xiàng)菱涤,與之反向的屬性是justify-items
边酒,justify-items
沿inline
行軸線對(duì)齊。align-item
適用于網(wǎng)格容器內(nèi)所有的網(wǎng)格項(xiàng)狸窘。
align-items
的取值包括4種
垂直對(duì)齊 | 描述 |
---|---|
start | 頂對(duì)齊墩朦,將網(wǎng)格項(xiàng)對(duì)齊到單元格頂部起始邊緣位置。 |
end | 底對(duì)齊翻擒,將網(wǎng)格項(xiàng)對(duì)齊到單元格底部結(jié)束邊緣位置氓涣。 |
center | 垂直居中對(duì)齊,將網(wǎng)格項(xiàng)對(duì)齊到單元格垂直中間位置陋气。 |
stretch | 默認(rèn)值劳吠,垂直拉伸填滿單元格垂直高度。 |
align-items
的4種對(duì)齊方式同樣適用于網(wǎng)格項(xiàng)的align-self
屬性巩趁。
網(wǎng)格內(nèi)容對(duì)齊方式
當(dāng)網(wǎng)格容器大于網(wǎng)格項(xiàng)總計(jì)大小時(shí)痒玩,若網(wǎng)格項(xiàng)均采用非靈活性的單位設(shè)置時(shí),比如px
像素议慰。此時(shí)可以設(shè)置網(wǎng)格容器內(nèi)網(wǎng)格內(nèi)容的對(duì)齊方式蠢古。網(wǎng)格內(nèi)容的對(duì)齊方式也分為2種,分別是
- 網(wǎng)格內(nèi)容水平對(duì)齊
justify-content
- 網(wǎng)格內(nèi)容垂直對(duì)齊
align-content
水平對(duì)齊
justify-content
屬性會(huì)沿著inline
行軸線方向?qū)ζ渚W(wǎng)格别凹,與之相反相反的屬性為align-content
草讶,align-content
將沿著block
列軸線方向?qū)R網(wǎng)格。
水平對(duì)齊 | 描述 |
---|---|
start | 左對(duì)齊炉菲,將網(wǎng)格對(duì)齊到網(wǎng)格容器的左側(cè)起始邊緣堕战。 |
end | 右對(duì)齊,將網(wǎng)格對(duì)齊到網(wǎng)格容器的右側(cè)結(jié)束邊緣拍霜。 |
center | 水平居中嘱丢,將網(wǎng)格對(duì)齊到網(wǎng)格容器的水平中間位置。 |
stretch | 水平拉伸祠饺,調(diào)整網(wǎng)格項(xiàng)寬度越驻,允許網(wǎng)格填充整個(gè)網(wǎng)格容器的寬度。 |
space-between | 兩端對(duì)齊,每個(gè)網(wǎng)格項(xiàng)之間放置均勻空間伐谈,左右兩端0空間烂完。 |
space-around | 每個(gè)網(wǎng)格項(xiàng)之間放置均勻空間,左右兩端放置一半空間诵棵。 |
space-evenly | 每個(gè)網(wǎng)格項(xiàng)之間放置均勻空間抠蚣,左右兩端放置一個(gè)均勻空間。 |
.grid-container{
display:grid;
justify-content: start | end | center | stretch | space-between | space-around | space-evenly;
}
垂直對(duì)齊
當(dāng)網(wǎng)格總計(jì)尺寸小于網(wǎng)格容器時(shí)履澳,此時(shí)若使用非靈活性的尺寸單位尺寸(比如:px像素)來設(shè)置大小嘶窄,就可能出現(xiàn)網(wǎng)格內(nèi)元素的排列問題。在這種情況下距贷,可以通過設(shè)置網(wǎng)格容器中內(nèi)容的對(duì)齊方式來實(shí)現(xiàn)內(nèi)容的布局柄冲。align-content
屬性可沿列軸線block
對(duì)齊網(wǎng)格。
垂直對(duì)齊 | 描述 |
---|---|
start | 頂對(duì)齊忠蝗,將網(wǎng)格對(duì)齊到網(wǎng)格容器的頂部起始邊緣现横。 |
end | 底對(duì)齊,將網(wǎng)格對(duì)齊到網(wǎng)格容器底部結(jié)束邊緣阁最。 |
center | 垂直居中戒祠,將網(wǎng)格對(duì)齊到網(wǎng)格容器垂直中間位置。 |
stretch | 垂直拉伸速种,調(diào)整網(wǎng)格項(xiàng)的高度姜盈,允許網(wǎng)格垂直拉伸后填滿整個(gè)網(wǎng)格容器的高度。 |
space-between | 垂直兩端對(duì)齊配阵,在每個(gè)網(wǎng)格項(xiàng)之間放置一個(gè)均勻的空間馏颂,上下兩端0空間。 |
space-around | 垂直兩端減半對(duì)齊棋傍,在每個(gè)網(wǎng)格項(xiàng)之間放置一個(gè)均勻的空間救拉,上下兩端放置一半的空間。 |
space-evenly | 垂直兩端均勻?qū)R舍沙,在每個(gè)網(wǎng)格項(xiàng)之間放置一個(gè)均勻空間近上,上下兩端放置一個(gè)均勻空間。 |
.grid-container{
display:grid;
align-content: start | end | center | stretch | space-between | space-around | space-evenly;
}
簡(jiǎn)寫形式
place-content
是justify-content
和align-content
的簡(jiǎn)寫形式
.grid-container{
display:grid;
place-content:<align-content> <justify-content>;
}
place-content
的第一個(gè)參數(shù)是align-content
拂铡,第二個(gè)參數(shù)是justify-content
。若place-content
僅設(shè)置一個(gè)參數(shù)則自動(dòng)將值分配給這兩個(gè)屬性葱绒。
網(wǎng)格軌道(Grid Tracks)
Grid網(wǎng)格布局使我們?cè)贑SS中定義網(wǎng)格感帅,并將網(wǎng)格項(xiàng)放置到網(wǎng)格單元格中。事實(shí)上無需指定每個(gè)網(wǎng)格軌道地淀,也無需手動(dòng)放置每個(gè)網(wǎng)格項(xiàng)失球,因?yàn)榫W(wǎng)格布局足夠靈活可自適應(yīng)網(wǎng)格項(xiàng)。這些都是由顯式和隱式網(wǎng)格來處理。
顯式網(wǎng)格
使用grid-template-rows
实苞、grid-template-columns
豺撑、grid-template-areas
屬性定義形成固定數(shù)量網(wǎng)格線和網(wǎng)格軌道的方式成為顯式網(wǎng)格。
例如:定義2x4即2個(gè)水平軌道和4個(gè)垂直軌道的顯式網(wǎng)格
.grid-container{
display:grid;
grid-template-rows:100px 100px;
grid-template-columns:1fr 1fr 1fr 1fr;
grid-gap:10px;
}
對(duì)于重復(fù)軌道黔牵,可使用repeat()
表示法來自動(dòng)化實(shí)現(xiàn)聪轿,repeat()
表示法的第一個(gè)參數(shù)是重復(fù)的次數(shù),第二個(gè)參數(shù)用來指定軌道列表猾浦。
grid-template-columns:1fr 1fr 1fr 1fr;
grid-template-columns:repeat(4, 1fr);
grid-template-columns:repeat(2, 1fr 1fr);
repeat()
函數(shù)可以再進(jìn)一步自動(dòng)化陆错,即是用auto-fill
和auto-fit
關(guān)鍵字替代設(shè)置固定數(shù)量的重復(fù),以實(shí)現(xiàn)自動(dòng)重復(fù)軌道金赦。
-
auto-fill
自動(dòng)填充軌道
auto-fill
關(guān)鍵字創(chuàng)建適合網(wǎng)格容器的軌道數(shù)量音瓷,而不會(huì)導(dǎo)致網(wǎng)格溢出。
例如:重復(fù)放入寬度為100px的垂直軌道以自適應(yīng)網(wǎng)格容器
.grid-container{
display:grid;
grid-template-columns: repeat(auto-fill, 100px);
}
注意:如果使用repeat(auto-fill, 1fr)
則只會(huì)創(chuàng)建一個(gè)軌道夹抗,因?yàn)閷挾?code>1fr的單個(gè)軌道已經(jīng)填滿整個(gè)網(wǎng)格容器绳慎。
-
auto-fit
自動(dòng)調(diào)整軌道
auto-fit
關(guān)鍵字的行為和auto-fill
相同,auto-fit
在網(wǎng)格項(xiàng)目放置后漠烧,只會(huì)根據(jù)需要?jiǎng)?chuàng)建任意數(shù)量的軌道偷线,而且任何空的重復(fù)軌道都會(huì)折疊在一起合并起來。
在repeat()
函數(shù)中使用auto-fit
會(huì)根據(jù)需要出盡可能多的軌道沽甥,而且軌道盡會(huì)可能多地放入網(wǎng)格容器中声邦。
例如:
.grid-container{
display:grid;
grid-template-columns:repeat(auto-fit, 100px);
grid-gap:10px;
}
repeat()
函數(shù)中使用固定數(shù)量的垂直軌道,當(dāng)網(wǎng)格項(xiàng)超過固定數(shù)量時(shí)會(huì)自動(dòng)添加更多的行摆舟。
例如:
html, body{
height:100%;
}
.grid-container{
display:grid;
height:100%;
grid-template-rows: repeat(auto-fill, 100px);
grid-template-columns: repeat(auto-fill, 100px);
grid-gap:10px;
}
隱式網(wǎng)格
當(dāng)網(wǎng)格項(xiàng)的數(shù)量多于網(wǎng)格單元格時(shí)亥曹,或者網(wǎng)格項(xiàng)位于顯式網(wǎng)格外部時(shí),網(wǎng)格容器會(huì)通過網(wǎng)格添加網(wǎng)格線自動(dòng)生成網(wǎng)格軌道恨诱。顯式網(wǎng)格與額外的隱式網(wǎng)格軌道和網(wǎng)格線形成了所謂的隱式網(wǎng)格媳瞪。
例如:當(dāng)2個(gè)網(wǎng)格放置在顯式網(wǎng)格之外時(shí)會(huì)導(dǎo)致創(chuàng)建隱式網(wǎng)格線和軌道
.grid-container{
display:grid;
}
.grid-item:first-child{
grid-column-start:-1;
}
.grid-item:nth-child(4){
grid-row-start:4;
}
隱式軌道的寬度和高度是自動(dòng)設(shè)置,其大小足以適應(yīng)放置的網(wǎng)格項(xiàng)照宝,可更改其默認(rèn)行為蛇受。
調(diào)整隱式軌道
Grid網(wǎng)格布局中可使用grid-auto-rows
和grid-auto-columns
屬性指定自動(dòng)生成的網(wǎng)格軌道的大小,即隱式網(wǎng)格軌道厕鹃。當(dāng)網(wǎng)格容器中的網(wǎng)格項(xiàng)多于單元格時(shí)或網(wǎng)格項(xiàng)位于顯式網(wǎng)格之外時(shí)兢仰,會(huì)自動(dòng)創(chuàng)建隱式網(wǎng)格軌道。
grid-auto-rows: <track-size> ...;
grid-auto-columns: <track-size> ...;
track-size
可以是長(zhǎng)度值剂碴、百分比把将、等分網(wǎng)格容器中可用空間的分?jǐn)?shù)即fr
。
通過使用grid-auto-rows
和grid-auto-columns
屬性可以控制隱式網(wǎng)格軌道的大小忆矛。
例如:生成2x2的網(wǎng)格察蹲,單元格寬高為60x90。
.grid-container{
display:grid;
grid-template-rows:90px 90px;
grid-template-columns: 60px 60px;
}
使用grid-column
和grid-row
定位網(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-a
從第1條列線到第2條列線結(jié)束即第1列,從第2條行線開始到第3條行線結(jié)束即第2行洽议,中間交叉的位置即[2, 1]
第2行第1列宗收。 -
item-b
從第5列線開始到第6列線結(jié)束,從第2行線開始到第3行線結(jié)束亚兄。但從未定義第5列線混稽、第6列線,引用的網(wǎng)格線不存在儿捧,此時(shí)會(huì)自動(dòng)創(chuàng)建寬度為0的隱式網(wǎng)格軌道以填補(bǔ)空缺荚坞,此時(shí)可使用grid-auto-rows
和grid-auto-columns
指定隱式軌道的大小。
.grid-container{
display:grid;
grid-auto-columns:60px;
}
例如:固定寬度和高度的隱式軌道
.grid-container{
display:grid;
grid-template-rows:100px 100px;
grid-template-columns:repeat(4, 1fr);
grid-gap:10px;
grid-auto-rows:60px;
grid-auto-columns:200px;
}
通過minmax()
函數(shù)來指定范圍菲盾,可使隱式軌道更為靈活颓影。
例如:設(shè)置隱式軌道至少有200px的寬度和60px的高度,若內(nèi)容需要將自動(dòng)擴(kuò)展懒鉴。
.grid-container{
grid-auto-rows:minmax(60px, auto);
grid-auto-columns:minmax(200px, auto);
}
學(xué)習(xí)資料
https://www.html.cn/archives/8510
https://www.html.cn/archives/10327
https://zhuanlan.zhihu.com/p/40148221