网格布局
CSS 网格布局,擅长于将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系。
可以按行、列来对齐元素,在布局上,网格比表格更加灵活。
特点
- 固定的位置和弹性的轨道的大小:单位可以用:像素、百分比、fr
- 网格项摆放
- 创建额外的轨道来包含内容
- 对齐控制
- 控制重叠内容
网格容器
在元素上声明 display: grid 或 display: inline-grid 来创建一个网格容器。
这个容器元素的所有直系子元素都会变成网格项目。
grid 属性介绍
grid 是一个 CSS 简写属性,可以用来设置以下属性:
- 显示网格属性 grid-template
- grid-template-rows
- grid-template-columns
- grid-template-areas
- 隐式网格属性 grid-auto
- grid-auto-rows
- grid-auto-columns
- grid-auto-flow
- 间距属性 grid-gap
- grid-row-gap
- grid-column-gap
网格轨道
grid-template-rows 和 grid-template-columns 属性 或 简写 grid 或 grid-template 属性,在显示网格中定义网格轨道。
基本示例
grid-template-columns 定义列轨道的大小。
如下,创建一个网格,包含三个 200像素宽的列轨道。
.container {
display: grid;
grid-template-columns: 200px 200px 200px;
}
fr 单位
轨道可以使用任何长度单位进行定义。fr 单位表示网格容器剩余空间的一部分。
如下,定义三个等宽的轨道,根据可用空间大小进行增减。
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
可以使用 repeat() 函数来重复轨道的定义。
如下,定义三个等宽的轨道。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
如下,定义不同尺寸的轨道。
.container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
}
多种尺寸单位可以混用。
如下,轨道1宽度100px,轨道二、三 根据剩余空间,分为2:1.
.container {
display: grid;
grid-template-columns: 100px 2fr 1fr;
}
隐式网格
通过 grid-template-columns 属性专门定义了列轨道,但网格也会自定创建行。这些行是隐式网络的一部分。
用 grid-auto-rows 属性来确保在隐式网格中创建的轨道是 200 像素高。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 200px;
}
轨道大小和minmax
通过 minmax() 函数,可以定义轨道的最小和最大尺寸。
如下,定义最小宽度为 200px,最大宽度为 300px;且自动创建的行高度最小100px,最大高度为自动,取决于最高单元格的空间。
.container {
display: grid;
grid-template-columns: repeat(3, minmax(200px, 300px));
grid-auto-rows: minmax(100px, auto);
}
跨轨道放置网格项目
使用 grid-column-start、grid-column-end、grid-row-start、grid-row-end 属性。
将前两个项目放置在三列轨道网格上。从左到右,第一个项目放置在第 1 列,并跨越到第 4 列,在我们的示例中,第 4 列是网格的最右边一行。它开始于第 1 行,结束于第 3 行,因此跨越了两条行轨。
第二个项目从网格列第 1 行开始,跨越一个轨道。这是默认设置,因此我不需要指定终止行。它还跨越了从第 3 行到第 5 行的两条行轨道。其他项目将放置在网格的空白处。
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column-start: 1;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
}
.box2 {
grid-column-start: 1;
grid-row-start: 3;
grid-row-end: 5;
}
网格线定位简写
列,可以使用 grid-column 一行写完。
行,可以使用 grid-row 一行写完。
斜线字符 / 前面的值为起始网格线,后面的值为终止网格线。
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
}
.box1 {
grid-column: 1 / 4;
grid-row: 1 / 3;
}
.box2 {
grid-column: 1;
grid-row: 3 / 5;
}
.wrapper {
display: grid;
grid-template-columns: repeat(3, 1fr);
column-gap: 10px;
row-gap: 1em;
}