网格是由一系列水平及垂直的线构成的一种布局模式,元素可以被放到行和列中。
如上图所示,网格内容包括:
- 行 : 网格中的水平线
- 列: 网格中的垂直线
- 沟槽:行与行、列与列之间的间隙
网格容器(Grid Container)
定义网格
若只设置样式不会更改, 但是调试模式下会在容器上出现grid标识和线。
使用grid-template-rows
和grid-template-columns
设置网格的行或者列。设置方式如下(可混合使用):
- 长度
- 百分比
- fr单位
.container {
display: grid;
}
长度或者百分比
使用长度或者百分比设置网格的行和列。
.container {
display: grid;
/* 使用长度 200px */
grid-template-columns: 200px 200px 200px;
/* 使用百分比 33% */
grid-template-columns: 33% 33% 33%;
}
fr单位
使用fr设置网格的行和列,fr单位是一个长度单位,表示了可用空间的一个比例。
.container {
display: grid;
/* 三列:平分可用空间 */
grid-template-columns: 1fr 1fr 1fr;
}
重复构建行/列
可以使用repeat
来重复构建具有某些宽度配置的某些列。
.container {
display: grid;
/* 设置三列: 1fr 1fr 1fr */
grid-template-columns: repeat(3, 1fr);
}
混合使用
几种设置方式可以混合使用
.container {
display: grid;
/* 设置四列: 200px 1fr 1fr 1fr */
grid-template-columns: 200px repeat(2,1fr) 1fr;
}
网格间隙
网格间隙是元素之间的间距。
- 使用
column-gap
属性来定义列间隙 - 使用
row-gap
来定义行间隙 - 使用
gap
可以同时设定两者
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
row-gap: 20px;
column-gap: 10px;
gap: 20px;
}
隐式网格
当有内容被放到网格外时才会生成的网格,大小根据内容自动调整。
- 默认参数是
auto
- 使用
grid-auto-rows
设置行大小,grid-auto-columns
设置列大小 - 使用
grid-template-columns
和grid-template-rows
定义的是显式网格
.wrapper-implicit {
display: grid;
gap: 10px;
/* 显式设置的 3列1行:每行100px, 每列1fr */
grid-template-columns: repeat(3,1fr);
grid-template-rows: 100px;
/*隐式设置 网格的大小150 */
grid-auto-rows: 150px;
}
可使用 minmax()
函数为一个行/列的尺寸设置了取值范围。
.wrapper {
display: grid;
gap: 10px;
grid-template-columns: repeat(3,1fr);
/*隐式设置 网格的大小最小50px,最大自己填充 */
grid-auto-rows: minmax(50px, auto);
}
grid-auto-flow
设置网格的自动流动方向。
- 默认是
row
,通过依次填充每行来放置项目,并根据需要添加新行 - 设置为
column
,通过依次填充每列来放置项目,并根据需要添加新列 - 设置
dense
, 在网格中更早地填充孔,填充前面的空白
.wrapper-flow {
display: grid;
gap: 10px;
grid-template-columns: 150px 1fr 1fr;
grid-template-rows: 100px;
grid-auto-flow: row dense;
}
网格项(Grid Cell)
网格项是网格布局中最小的单位。
网格线
网格线是在使用网格布局的时候用来定义的轨道的。
- 第一条线的起始点与文档书写模式相关
- 可以根据网格线的编号进行网格项定位
- 网格线可以被命名
.wrapper {
display: grid;
gap: 10px;
/*grid-template-columns: repeat(3,1fr);*/
grid-template-columns:[col1-start] 1fr [col2-start]1fr [col3-start]1fr;
grid-auto-rows: minmax(50px, auto);
}
定位网格
网格项通过网格线来定位。通过以下属性来指定从那条线开始到哪条线结束。
grid-column-start
定义列开始位置grid-column-end
定义列结束位置grid-row-start
定义行开始位置grid-row-end
定义行结束位置grid-column
列位置简写属性 start/endgrid-row
行位置简写属性 start/end
grid-column-start
grid-column-start是用来标明网格开始的列的位置。
- 可以使用编号、命名和span跨度使用
- 不给定值则使用automatic
.lines-item1 {
/* 从编号1的线开始*/
grid-column-start: 1;
/* 从col1-start的线开始*/
grid-column-start: col1-start;
/* 从grid-column-end的线跨度 2*/
grid-column-start: span 2;
/* 从grid-column-end的线跨度到 col2-start*/
grid-column-start: span col2-start;
grid-column-end: col2-start;
grid-row-start: 1;
grid-row-end: 2;
}
grid-column-end
grid-column-end 是用来标明网格结束的列的位置。
- 可以使用编号、命名和span跨度使用
- 不给定值则使用automatic
.lines-item1 {
grid-column-start: 1;
/* 到编号2的线结束*/
grid-column-end: 2;
/* 到col3-start的线结束*/
grid-column-end: col3-start;
/* 从grid-column-start的线跨度3个网格 */
grid-column-end: span 3;
/* 从grid-column-start的线跨度到 col3-start*/
grid-column-end: span col3-start;
grid-row-start: 1;
grid-row-end: 2;
}
grid-column
grid-column 是 grid-column-start 和 grid-column-end 的简写属性。写法为:grid-column-start/grid-column-end。
.lines-item1 {
grid-column: 1 / 2;
grid-row-start: 1;
grid-row-end: 2;
}
grid-row-start
grid-row-start是用来标明网格开始的行的位置。
- 可以使用编号、命名和span跨度使用
- 不给定值则使用automatic
.lines-item1 {
grid-column: 1 / 2;
/* 从编号1的线开始*/
grid-row-start: 1;
/* 从col1-start的线开始*/
grid-row-start: col1-start;
/* 从grid-row-end的线跨度 2*/
grid-row-start: span 2;
/* 从grid-row-end的线跨度到 col2-start*/
grid-row-start: span col2-start;
grid-row-end: 2;
}
grid-row-end
grid-row-end 是用来标明网格结束的行的位置。
- 可以使用编号、命名和span跨度使用
- 不给定值则使用automatic
.lines-item1 {
grid-column-start: 1;
grid-column-end: 2;
grid-row-start: 1;
/* 到编号2的线结束*/
grid-row-end: 2;
/* 到col3-start的线结束*/
grid-row-end: col3-start;
/* 从grid-row-start的线跨度3个网格 */
grid-row-end: span 3;
/* 从grid-row-start的线跨度到 col3-start*/
grid-row-end: span col3-start;
}
grid-row
grid-row 是 grid-row-start 和 grid-row-end 的简写属性。写法为:grid-row-start/grid-row-end。
.lines-item1 {
grid-column: 1 / 2;
grid-row: 1/2;
}
网格区域(Grid areas)
项可以按行或按列跨越一个或多个单元格,这将创建一个网格区域。
- 给每个网格项设置
grid-area
- 在容器中根据设置
grid-areas
, 填充网格项 - 对应的位置没有网格项的时候使用
.
替代
.wrapper-areas {
background-color: var(--bg-color);
display: grid;
gap: 10px;
grid-template-columns: 150px 1fr 1fr;
grid-template-rows: 1fr 1fr;
grid-template-areas:
"item1 . item2"
"item3 item4 item5";
}
.areas-item1 {
grid-area: item1;
}
.areas-item2 {
grid-area: item2;
}
.areas-item3 {
grid-area: item3;
}
.areas-item4 {
grid-area: item4;
}
.areas-item5 {
grid-area: item5;
}
网格嵌套( Nesting grids) )
网格可以嵌套另一个网格。
.wrapper-nest {
background-color: var(--bg-color);
display: grid;
gap: 10px;
grid-template-columns: 150px 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr;
}
.nest-item1 {
grid-column: 1 / 5;
/*嵌套的网格,网格项设置 display: grid;*/
display: grid;
}