Grid网格布局详解:
Grid布局与Flex布局有着一定的相似性,Grid布局是将容器划分成行和列,产生单元格,可以看做是二维布局。
基本概念:
采用网格布局的区域,称为"容器"(container)。容器内部采用网格定位的子元素,称为"项目"(item)
<div>
<div><p>1</p></div>
<div><p>2</p></div>
<div><p>3</p></div>
</div>
上面代码中,最外层的<div>
元素就是容器,内层的三个<div>
元素就是项目。
注意:项目只能是容器的顶层子元素,不包含项目的子元素,比如上面代码的<p>
元素就不是项目。Grid 布局只对项目生效。
2 行和列:
容器里面的水平区域称为行,垂直区域称为列。
行和列交叉的区域,称之为单元格。
通常情况下 n 行 m 列 会产生 n * m 个单元格。
3 网格线 ,划分网格的线称之为网格线。 正常情况下 n 行有 n+1根水平网格线,m列有m+1根垂直网格线。
容器属性:
div{
display:grid;
}
指定一个容器采用网格布局。 默认情况下,容器元素都是块级元素,但也可以设成行内元素。
div{
display:inline-grid;
}
注意,设为网格布局以后,容器子元素(项目)的float
、display: inline-block
、display: table-cell
、vertical-align
和column-*
等设置都将失效。
4 容器指定了网格布局以后,接着就要划分行和列。
grid-template-columns属性定义每一列的列宽。
grid-template-rows属性定义每一行的行高。
eg:
.container {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
}
上述代码指定了一个三行三列的网格,列宽和行高都是100px。
除了使用px为单位,也可以指定百分比为单位。
eg:
.container {
display: grid;
grid-template-columns: 33.33% 33.33% 33.33%;
grid-template-rows: 33.33% 33.33% 33.33%;
}
(1) 属性一: repeat()
有时候重复写同样的值很麻烦,尤其当网格比较多时,这时可以使用repeat()函数,简化重复的值。
repeat()接收两个参数,第一个是参数重复的次数,第二个参数是要重复的值。
eg:
.container {
display: grid;
grid-template-columns: repeat(3, 33.33%);
grid-template-rows: repeat(3, 33.33%);
}
上述的示例如图所示。
repeat()重复某种模式也可以。 例: grid-template-columns:repeat(2, 100px,20px,80px).
上面代码定义了6列,第一列和第四列的宽度为100px
,第二列和第五列为20px
,第三列和第六列为80px。
(2)属性二: auto-fill()关键字:有时单元格的大小是固定的,但容器的大小不固定,为了能够使每一行或者每一列能够容纳更多的单元格,可以使用auto-fill关键字表示自动填充。
eg:
.container {
display: grid;
grid-template-columns: repeat(auto-fill, 100px);
}
表示每列宽度100px,自动填充,直到容器不能够放置更多的列。
(3) fr关键字:
如果两列的宽度分别为1fr 和 2 fr 表示后者是前者宽度的两倍。
eg:
.container {
display: grid;
grid-template-columns: 1fr 1fr;
}
// 上述表示两个宽度相同的列。
注:fr 可以和绝对长度的单位结合使用,十分便捷。
eg:
.container {
display: grid;
grid-template-columns: 150px 1fr 2fr;
}
上述表示第一列的宽度为150px,第三列的宽度是第二列的两倍。
(4) minmax()关键字:
该函数会产生一个长度范围,表示长度就在这个范围之中,接受两个参数,分别为最大值和最小值。
eg:
grid-template-columns: 1fr 1fr minmax(100px, 1fr);
上述代码中,minmax(100px,fr) 表示列宽不小于100px,不大于1fr。
(5)auto关键字:表示由浏览器自己决定长度。
grid-template-columns: 100px auto 100px;
上面代码中,第二列的宽度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width
,且这个值大于最大宽度。
(6) 网格线的名称:
在行和列属性设置时,可以使用方括号指定每一根网格线的名称,方便以后引用。
eg:
.container {
display: grid;
grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
}
上述中4 根垂直网格线的名称分别为: c1 c2 c3 c4. 4根水平网格线的名称为 r1 r2 r3 r4。
注:网格布局允许同一根线有多根名字。
布局实例:
1 传统的两栏式布局:
eg:
.wrapper {
display: grid;
grid-template-columns: 70% 30%;
}
// 左栏设置为70% 右栏设置为 30%。
2 传统的十二网格布局:
eg:
grid-template-columns: repeat(12, 1fr);
三: grid-row-gap 和 grid-column-gap 以及 grid-gap属性。
grid-row-gap 属性设置行与行的间隔(间距)。
grid-column-gap 属性设置列与列的间隔(间距)。
eg:
.container {
grid-row-gap: 20px; //行间距
grid-column-gap: 20px; // 列间距
}
grid-gap
属性是grid-column-gap
和grid-row-gap
的合并简写形式,语法如下:
grid-gap: <grid-row-gap> <grid-column-gap>;
上述等价于:
eg:
.container {
grid-gap: 20px 20px;
}
若省略第二个值,浏览器认为第二个值等于第一个值。
根据最新标准,上面三个属性名的grid-
前缀已经删除,grid-column-gap
和grid-row-gap
写成column-gap
和row-gap
,grid-gap
写成gap
。
详细的属性请参考:http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html