grid布局
网格容器
display: iniline-griddisplay: grid
显式网格
grid-template-columns用来定义容器中列的宽度grid-template-rows用来定义容器中行的高度
.container {
  width: 300px;
  height: 300px;
  background-color: pink;
  
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
  
  > div:nth-child(odd) {
    background: skyblue;
  }
  
  > div:nth-child(even) {
    background: orange;
  } 
}
这样网格容器中前三列的宽度为 100px,前三行的高度为 100px。

另外,这两个属性的取值可以是 <length>、fr单位 和 auto。
如果某一列或者行的宽度为 auto,那么它会占用容器剩余空间位置。
.container {
  grid-template-columns: 50px 50px auto;
  grid-template-rows: 50px 50px auto;
}

fr 单位实际上就是表示一种比例。
grid-template-columns: 1fr 1fr 1fr;
表示网格容器中的三列宽度比例 1:1:1 平分整个容器宽度。
fr 是根据与其他长度值结合时的剩余空间计算的。
grid-template-columns: 3rem 25% 1fr 2fr;
第三列的宽度计算值等于 (容器宽度 - 3rem - 容器宽度 * 0.25) / 3。
第四列第宽度计算值等于 2 * (容器宽度 - 3rem - 容器宽度 * 0.25) / 3。
合并单元格效果
grid-template-areas用于给网格容器区域命名grid-area给网格子项引用网格区域名称(注意这是网格子项的属性)
<div class="container">
  <div>1</div>
  <div>2</div>
  <div>3</div>
</div> 
.container {
  width: 300px;
  height: 300px;
  background-color: pink;
  
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-template-areas: 
  "a1 a1 a2"
  "a1 a1 a2"
  "a3 a3 a3";
  
  > div:nth-child(1) {
    grid-area: a1;
    background-color: skyblue;
  }
  > div:nth-child(2) {
    grid-area: a2;
    background-color: orange;
  }
  > div:nth-child(3) {
    grid-area: a3;
    background-color: gold;
  }
}
这样第一个网格子项占的就是 4 * 4 的空间,第二个网格子项占的是 1 * 2 的空间,第三个网格子项占的是 2 * 1 的空间。

我们可以通过子项的 grid-area 控制其在对应的网格容器区域中。
> div:nth-child(1) {
  grid-area: a2;
}
当继续添加上面的样式到 .container 尾部时,网格中的第一个子项就处于 a2 的网格空间了。

此时第一个子项和第二个子项发生了重叠,第二个子项目覆盖了第一个子项目。调整第一个子项的 z-index 它就出现了。
> div:nth-child(1) {
  grid-area: a2;
  z-index: 1;
}

grid-template 简写属性
该属性是下面三个属性的简写形式:
grid-template-columnsgrid-template-rowsgrid-template-areas
grid-template: 
  "a1 a1 a2" 1fr
  "a1 a1 a2" 1fr
  "a3 a3 a3" 1fr
  / 1fr 1fr 1fr;
等价于:
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
grid-template-areas: 
"a1 a1 a2"
"a1 a1 a2"
"a3 a3 a3";
网格间隙
row-gap设置容器中子项与子项之间行间距column-gap设置容器中子项与子项之间的列间距gap上面两个属性的简写
当给 .container 添加上该属性时:
.container {
  row-gap: 20px;
  column-gap: 20px;
}

子项与子项之间就会出现 20px 的间隙了。需要注意如果网格大小是固定单位 px,那么间隙就可能导致子项目溢出容器。