01 Grid 布局简介
Grid 布局将网页划分成行和列从而形成一个个网格,可以任意组合成不同的网格。
容器:采用 Grid 布局的元素,称为 Grid 容器(Grid container),简称容器。
项目:采用 Grid 布局的元素的所有子元素自动成为容器成员,称为 Grid 项目(Grid item),简称项目。
项目只能是容器的顶层子元素,不包含项目的子元素。
单元格:行和列分割出来的区域叫做单元格(cell)。
网格线:划分容器区域的线,被称为网格线(grid line)。网格线是从 1 开始进行计数的。如有 4 * 4 个格子的容器有 5 根水平网格线和 5 根垂直网格线。
设为网格布局以后,容器子元素(项目)的 float、display: inline-block、display: table-cell、vertical-align 和 column-* 等设置都将失效.
Grid 布局示意图:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9cnW1xWbilnRXp1c5YkYzEjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1ATNyMTN0ADMzEDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
02 父元素/容器属性
2.1 grid-template-columns; grid-template-rows
上述属性设置网格的宽度和高度。主要有以下几种设置参数值的方法:
-
使用数值设置单元格宽度
-
使用百分数设置单元格宽度
-
使用 repeat() 设置单元格宽度
该函数接收两个参数:- 参数 1:重复的次数
- 参数 2:要重复的值
grid-template-columns: repeat(3, 300px); grid-template-columns: repeat(1, 250px 400px 350px);
-
使用 auto-fill 设置单元格宽度
适用于单元格的大小是固定的,但是容器的大小不确定的情况。 -
使用 fr(fraction "片段"的缩写) 关键字设置单元格宽度
如果两列的宽度分别为 1fr 和 2fr,就表示后者是前者的两倍。 -
minmax() 函数产生一个长度范围,表示长度在这个范围内
该函数接收两个参数表示最大值和最小值。
2.2 grid-row-gap; grid-column-gap; grid-gap
上述属性设置容器内部网格线(不包含边缘网格线)的宽度。
目前上述的三个属性分别被 row-gap, column-gap, gap 替代。
2.3 grid-template-areas
该属性用于定义区域。如果某些区域不需要利用,则使用 点(.) 表示。
区域的命名会影响到网格线:每个区域的起始网格线,会自动命名为区域名-start,终止网格线自动命名为区域名-end。
2.4 justify-items; algin-items; place-items
上述属性设置网格内容的位置。
属性名 | 作用 |
---|---|
justify-items | 设置单元格内容的水平位置(左中右) |
align-items | 设置单元格内容的垂直位置(上中下) |
place-items | align-items 属性和 justify-items 属性的合并简写形式 |
place-items: <align-items> <justify-items>
2.5 justify-content; algin-content; place-content
上述属性设置整个内容区域在容器里面的位置。
属性名 | 作用 |
---|---|
justify-content | 设置单元格内容的水平位置(左中右) |
align-content | 设置单元格内容的垂直位置(上中下) |
place-content | align-items 属性和 justify-items 属性的合并简写形式 |
place-content: <align-content> <justify-content>
03 子元素/项目属性
3.1 grid-column-start; rid-column-end; grid-row-start; grid-row-end
上述属性通过指定项目的四个边框(具体的网格线)指定项目的位置。
属性名 | 作用 |
---|---|
grid-column-start | 左边框所在的垂直网格线 |
grid-column-end | 右边框所在的垂直网格线 |
grid-row-start | 上边框所在的水平网格线 |
grid-row-end | 下边框所在的水平网格线 |
这四个属性的值还可以使用 span 关键字,表示跨越,即左右/上下边框之间跨越多少个网格。
如果产生了项目的重叠,则使用 z-index 属性指定项目的重叠顺序。
3.2 grid-area
上述属性是 3.1 中属性的缩写形式
grid-area: <row-start> / <column-start> / <row-end> / <column-end>
3.3 justify-self; align-self; place-self
上述属性设置单元格内容的位置。
属性名 | 作用 |
---|---|
justify-self | 设置单元格内容的水平位置(左中右) |
align-self | 设置单元格内容的垂直位置(上中下) |
place-self | align-self 属性和 justify-self 属性的合并简写形式 |
place-self: <align-self> <justify-self>;
04 布局示例
<style>
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
a {
text-decoration: none;
}
h3 {
color: red;
font-size: 25px;
text-align: center;
}
.center-text {
color: #fff;
font-size: 50px;
font-weight: 700;
text-align: center;
line-height: 200px;
}
</style>
4.1 父元素/容器属性 grid-template-columns/rows 设置网格的宽度和高度
<style>
.grid-template-exmaple {
display: grid;
/*************************************************************************
1: 使用数值设置单元格宽度
*************************************************************************/
/* grid-template-columns: 300px 300px 300px; */
/*************************************************************************
2: 使用百分数设置单元格宽度
*************************************************************************/
/* grid-template-columns: 33.33% 33.33% 33.33%; */
/*************************************************************************
3: 使用 repeat() 设置单元格宽度
该函数接收两个参数:
参数1: 重复的次数
参数2: 要重复的值
*************************************************************************/
/* grid-template-columns: repeat(3, 300px); */
/* grid-template-columns: repeat(1, 250px 400px 350px); */
/*************************************************************************
4: 使用 auto-fill 设置单元格宽度
适用于单元格的大小是固定的,但是容器的大小不确定
*************************************************************************/
/* grid-template-columns: repeat(auto-fill, 250px); */
/* grid-template-columns: repeat(auto-fit, 250px); */
/*************************************************************************
5: 使用 fr(fraction "片段"的缩写) 关键字设置单元格宽度
如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍
*************************************************************************/
/* grid-template-columns: 1fr 1fr 1fr; */
/*************************************************************************
6: minmax() 函数产生一个长度范围,表示长度在这个范围内
该函数接收两个参数表示最大值和最小值
*************************************************************************/
/* grid-template-columns: repeat(3, minmax(240px, 1fr)); */
/*************************************************************************
7: auto关键字表示由浏览器自己决定长度
*************************************************************************/
/* grid-template-columns: 240px auto 240px; */
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 300px);
margin: 0 auto;
width: 900px;
background-color: orange;
}
.grid-template-exmaple div {
width: 200px;
height: 200px;
background-color: purple;
}
</style>
<div class="grid-template-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
4.2 父元素/容器属性 gap 设置网格的宽度和高度(兼容性不好)
<style>
.grid-gap-exmaple {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
/* 原有的 grid-row-gap; grid-column-gap; grid-gap 属性分别被 row-gap, column-gap, gap 替代 */
/* row-gap: 150px;
column-gap: 150px; */
gap: 150px;
margin: 0 auto;
width: 900px;
background-color: orange;
}
.grid-gap-exmaple div {
width: 200px;
height: 200px;
background-color: purple;
}
</style>
<div class="grid-gap-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
4.3 父元素/容器属性 grid-template-areas 定义网格区域
<style>
.grid-template-areas-exmaple {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
grid-template-areas:
"header header header"
"main . main"
"footer footer footer";
margin: 0 auto;
width: 900px;
background-color: orange;
}
.grid-template-areas-exmaple div {
margin: 20px;
width: 200px;
height: 200px;
background-color: purple;
}
</style>
<div class="grid-template-areas-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
4.4 父元素/容器属性 justify-items; algin-items; place-items 设置网格内容的位置
<style>
.grid-place-items-exmaple {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
/* justify-items: center;
align-items: center; */
place-items: center;
margin: 0 auto;
width: 900px;
height: 900px;
background-color: orange;
}
.grid-place-items-exmaple div {
width: 200px;
height: 200px;
background-color: purple;
}
</style>
<div class="grid-place-items-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
4.5 父元素/容器属性 justify-content; algin-content; place-content 设置整个内容区域在容器里面的位置
<style>
.grid-place-content-exmaple {
display: grid;
grid-template-columns: repeat(3, 240px);
grid-template-rows: repeat(3, 240px);
/* justify-content: center;
align-content: center; */
place-content: center;
margin: 0 auto;
width: 900px;
background-color: orange;
}
.grid-place-content-exmaple div {
margin: 20px;
width: 200px;
height: 200px;
background-color: purple;
}
</style>
<div class="grid-place-content-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
4.6 子元素/项目属性 grid-row/column-start/end 通过指定项目的四个边框(具体的网格线)指定项目的位置
<style>
.grid-item-start-end-exmaple {
display: grid;
grid-template-columns: repeat(3, 240px);
grid-template-rows: repeat(3, 240px);
place-content: center;
margin: 0 auto;
width: 900px;
background-color: orange;
}
.grid-item-start-end-exmaple div {
margin: 20px;
width: 200px;
height: 200px;
background-color: purple;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210412232656603.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L213bF9sZWFybmluZw==,size_16,color_FFFFFF,t_70#pic_center)
.grid-item-start-end-exmaple div:first-child {
grid-row-start: 1;
grid-row-end: 2;
grid-column-start: 1;
grid-column-end: 3;
width: 440px;
}
.grid-item-start-end-exmaple div:nth-child(4) {
grid-row-start: span 2;
grid-column-start: span 2;
width: 440px;
height: 440px;
}
</style>
<div class="grid-item-start-end-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
4.7 子元素/项目属性 grid-area 通过指定项目的四个边框(具体的网格线)指定项目的位置
<style>
.grid-area-exmaple {
display: grid;
grid-template-columns: repeat(3, 240px);
grid-template-rows: repeat(3, 240px);
place-content: center;
margin: 0 auto;
width: 900px;
background-color: orange;
}
.grid-area-exmaple div {
margin: 20px;
width: 200px;
height: 200px;
background-color: purple;
}
.grid-area-exmaple div:first-child {
grid-area: 1 / 1 / 2 / 3;
width: 440px;
}
.grid-area-exmaple div:nth-child(4) {
grid-area: 2 / 2 / 4 / 4;
width: 440px;
height: 440px;
}
.grid-area-exmaple div:last-child {
grid-area: 5 / 1 / 6 / 4;
width: 680px;
height: 200px;
}
</style>
<div class="grid-area-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
4.8 子元素/项目属性 justify-self; align-self; place-self 设置单元格内容的位置
<style>
.grid-place-self-exmaple {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
margin: 0 auto;
width: 900px;
height: 900px;
background-color: orange;
}
.grid-place-self-exmaple div {
justify-self: end;
align-self: start;
/* place-self: center; */
width: 200px;
height: 200px;
background-color: purple;
}
</style>
<div class="grid-place-self-exmaple">
<div class="center-text">1</div>
<div class="center-text">2</div>
<div class="center-text">3</div>
<div class="center-text">4</div>
<div class="center-text">5</div>
<div class="center-text">6</div>
<div class="center-text">7</div>
<div class="center-text">8</div>
<div class="center-text">9</div>
</div>
05 源码
需要源码的同学可以在评论区留下邮箱地址,我这边会尽快发过去的。
06 相关文章
flex 布局