网格布局
概述
grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。
项目和容器
- 如下代码,container则是容器,item则是项目
vue
<template>
<div class="container">
<div class="item" v-for="i in 9">{{ i }}</div>
</div>
</template>
<style scoped lang="less">
.container {
display: grid; // grid | subgrid |inline-grid
}
</style>
<template>
<div class="container">
<div class="item" v-for="i in 9">{{ i }}</div>
</div>
</template>
<style scoped lang="less">
.container {
display: grid; // grid | subgrid |inline-grid
}
</style>
- grid | subgrid |inline-grid
- grid:定义一个块级的网格容器
- inline-grid:定义一个内联的网格容器
- subgrid:定义一个继承其父级网格容器的行和列的大小的网格容器,它是其父级网格容器的一个子项,不同目前仅有 Firefox 支持,所以目前不建议使用
行和列
- 定义容器行和列 grid-template-columns 属性定义每一列的列宽,grid-template-rows 属性定义每一行的行高。可写成百分比也可以写成像素单位;
css
.container{
display: grid;
grid-template-columns: 100px 100px 100px; /* 列宽 */
grid-template-rows: 100px 100px 100px;
}
.container{
display: grid;
grid-template-columns: 100px 100px 100px; /* 列宽 */
grid-template-rows: 100px 100px 100px;
}
1
2
3
4
5
6
7
8
9
- 也可以使用其他宽度单位
css
.container{
display: grid;
grid-template-columns: 33% 200px calc(100% / 4); /* 列宽 */
}
.container{
display: grid;
grid-template-columns: 33% 200px calc(100% / 4); /* 列宽 */
}
1
2
3
4
5
6
7
8
9
- 重复函数 CSS 3 也提供了一个 repeat() 函数,上面的代码可以写成这样;
css
.container {
width: 600px;
height: 600px;
display: grid;
grid-template-columns: repeat(3, calc(100% / 3)); /* 列宽 */
grid-template-rows: repeat(3, 200px); /* 行高 */
}
.container {
width: 600px;
height: 600px;
display: grid;
grid-template-columns: repeat(3, calc(100% / 3)); /* 列宽 */
grid-template-rows: repeat(3, 200px); /* 行高 */
}
1
2
3
4
5
6
7
8
9
repeat() 可以接受两个参数,前面一个是重复次数,后面一个是重复的内容
css
.container{
grid-template-columns: repeat(2, calc(100% / 3) 20% 100px);
}
.container{
grid-template-columns: repeat(2, calc(100% / 3) 20% 100px);
}
1
2
3
4
5
6
7
8
9
- 自动填充 有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用 auto-fill 关键字表示自动填充:
css
.container{
grid-template-columns: repeat(auto-fill, 100px 200px);
}
.container{
grid-template-columns: repeat(auto-fill, 100px 200px);
}
1
2
3
4
5
6
7
8
9
- 比例填充 为了方便表示比例关系,网格布局提供了 fr 关键字(fraction 的缩写,意为"片段")。如果两列的宽度分别为 1fr 和 2fr,就表示后者是前者的两倍:
css
.container{
grid-template-columns: 100px 1fr 2fr 3fr;
}
.container{
grid-template-columns: 100px 1fr 2fr 3fr;
}
1
2
3
4
5
6
7
8
9
- 长度范围 minmax() 函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值:
css
.container{
/* 表示三等分,均分容器网格宽度不会小于100px */
grid-template-columns: repeat(3, minmax(100px, calc(100% / 3)));
}
.container{
/* 表示三等分,均分容器网格宽度不会小于100px */
grid-template-columns: repeat(3, minmax(100px, calc(100% / 3)));
}
1
2
3
4
5
6
7
8
9
- 自动长度
css
.container{
grid-template-columns: repeat(3, auto);
}
.container{
grid-template-columns: repeat(3, auto);
}
1
2
3
4
5
6
7
8
9
css
.container{
grid-template-columns: 100px auto 100px;
}
.container{
grid-template-columns: 100px auto 100px;
}
1
2
3
4
5
6
7
8
9
栗子都是以列(宽)为例,行(高)同理;
网格线的名称
grid-template-columns 属性和 grid-template-rows 属性里面,还可以使用方括号,指定每一根网格线的名字,方便以后的引用:
css
.container{
grid-template-columns: [c1] auto [c2] 150px [c3] 150px [c4];
}
.container{
grid-template-columns: [c1] auto [c2] 150px [c3] 150px [c4];
}
1
2
3
4
5
6
7
8
9
定义容器区域
css
.container{
grid-template-areas: 'a b c'
'd e f'
'g h i';
}
.container{
grid-template-areas: 'a b c'
'd e f'
'g h i';
}
a
b
c
d
e
定义行列间距
默认的网格,项目之间是没有间距的,为了让项目看起来更分明,我们可以通过定义行列的间距,来分割开各个项目。 CSS 3 提供了三个和网格间距有关的属性:
- row-gap:定义行间距
- column-gap:定义列间距
- gap:简写属性,定义行列间距