基本概念
网格布局是将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。
- 容器:一个案例中最大的盒子,可以理解为父元素
- 项目:一个案例中,最大盒子里面的内容,可以理解为子元素
网格Grid布局 vs flex布局
- Grid 布局是将容器划分成“行”和“列”,产生单元格,然后指定“项目位置”的单元格,可以看作是二维布局。
- Flex 布局是轴线布局,只能指定“项目”针对于轴线的位置,可以看作是一维布局。
- 网格布局中的属性和flex布局类似,主要分为两类,一是容器属性,二是项目属性。
网格属性
| 属性 | 说明 |
|---|
| display | display: grid;(块级网格) / display: inline-grid;(行内块网格) |
| grid-template-rows | 规定行属性,取值个数决定有多少行 |
| grid-template-columns | 规定列属性,取值个数决定有多少列 |
| gap | 规定行列间距,是grid-gap的新版本写法,功能语法一样,例如,新版本 gap:15px 10px; 旧版本 grid-gap:15px 10px;行间距15px,列间距10px,这种写法是简写写法;包括row-gap(新版本) / grid-row-gap(旧版本)和 column-gap(新版本) / grid-column-gap(旧版本) |
| grid-template-areas | 将这个网格容器,分为多个区域,每个区域对应一个单元格,并通过grid-area制定项目名称 |
| grid-auto-flow | 规定自动放置的项目如何插入网格中,row(默认,通过填充每一行来放置项目)/ column(填充每一列) / dense(填充任何地方) / row dense(填充行,且填充孔) / column dense(填充列,且填充孔) |
| place-content | 简写属性,place-content:<align-content> <justify-content>; 定义网格项目的水平和垂直对齐方式,取值包括 start / end / center / stretch / space-around / space-between / space-evenly,如果省略第二个值,则将第一个值同时分配给这两个属性 |
属性 1 定义网格
.parent-1{
display: grid;
}
.parent-2{
display: inline-grid;
}
属性 2 行列数量及宽度划分
.parent{
grid-template-columns: 200px 200px 200px;
grid-template-rows: 200px 200px;
}
.parent{
grid-template-columns: 33.33% 33.33% 33.33%;
grid-template-rows: 33.33% 33.33% 33.33%;
}
.parent{
grid-template-columns: repeat(3, 33.3%);
grid-template-rows: repeat(3, 33.3%);
}
.parent{
grid-template-columns: repeat(auto-fill,33.33%);
grid-template-rows: repeat(auto-fil,33.33%);
}
.parent{
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 1fr 100px 100px;
}
.parent{
grid-template-columns: minmax(100px, 200px) 200px 200px;
grid-template-rows: 200px 200px 200px;
}
.parent{
grid-template-columns: 200px auto 150px;
grid-template-rows: auto 180px 100px;
}
属性 3 行列间隔
.parent{
gap: 15px 10px;
}
属性 4 网格区域、单元格名称
.parent{
grid-template-areas:
"area_a area_a area_c"
"area_a area_a area_f"
"area_g area_h area_i";
}
.child-1{
grid-area: area_a;
}
属性 5 项目放置
.parent-column{
grid-auto-flow: column;
}
.parent-row{
grid-auto-flow: row;
}
属性 6 网格对齐方式
.child{
place-content: end start;
}
child{
align-content: start;
justify-content: end;
}
项目属性
属性 1 网格项目合并
| 属性 | 说明 |
|---|
| grid-column | 简写属性,格式为 grid-column:<grid-column-start>/<grid-column-end>; 前一个属性是左边框所在的垂直网格线,后面是右边框所在的垂直网格线 |
| grid-row | 简写属性,格式为 grid-row:<grid-row-start>/<grid-row-end>; 前一个属性是上边框所在的水平网格线,后面是下边框所在的水平网格线 |
- 如果一个m行n列的网格,需要(m+1)+(n+1)条线,m+1条横线,n+1条纵线
.parent{
display: grid;
grid-template-columns: repeat(3,33.33%);
grid-template-rows: repeat(3,33.33%);
gap: 10px;
}
.child:nth-child(1){
background: url(./meng.jpg) no-repeat;
background-size: cover;
}
.child:nth-child(2){
background: url(./cb91f359b0.jpg) no-repeat;
background-size: cover;
grid-column: 2/4;
grid-row: 1/3;
}
.child:nth-child(3){
background: url(./dfa6dd68bc.jpg) no-repeat;
background-size: cover;
grid-column: 1/2;
grid-row: 2/4;
}
.child:nth-child(4){
background: url(./920333fc0bb6239833eac5561adcb293.jpeg) no-repeat;
background-size: cover;
grid-column: 2/4;
grid-row: 3/4;
}

实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin:0;
padding: 0;
}
html,body{
height: 100%;
}
section{
border: 5px solid black;
width: 80%;
height: 98%;
margin: auto;
display: grid;
grid-template-columns: minmax(100px,150px) 200px 200px;
grid-template-rows: 200px 200px 200px;
gap: 20px 12px;
grid-template-areas: "a a b"
"a a b"
"c c d";
place-content: center;
}
div{
outline: 1px solid black;
text-align: center;
font:normal bolder 100px/100px Aria;
color: lightpink;
}
div:nth-child(1){
background:url(./horse/horse.png) no-repeat center;
background-size: 60%;
grid-area: a;
}
div:nth-child(2){
background: url(./zhangdan.svg) no-repeat center;
background-size: cover;
grid-area: b;
}
div:nth-child(3){
background: url(./水波纹动态图.gif) no-repeat center;
grid-area: c;
}
div:nth-child(4){
background: url(./meng.jpg) center;
background-size: contain;
grid-area: d;
}
</style>
</head>
<body>
<section>
<div>a</div>
<div>b</div>
<div>c</div>
<div>d</div>
</section>
</body>
</html>
