# Grid vs Flex
Grid 布局是 css 最强大的布局方案。
Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。
Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。 Grid 布局远比 Flex 布局强大。
# 网格线(grid line)
水平网格线划分出行,垂直网格线划分出列。
n 行有 n + 1 根水平网格线,m 列有 m + 1 根垂直网格线,比如三行就有四根水平网格线。
# 容器属性
# display
指定一个容器采用网格布局
子元素的float、display: inline-block、display: table-cell、vertical-align和column-*等设置都将失效
/*块级元素*/
div {
display:grid
}
/*行内元素*/
div {
display: inline-grid;
}
# grid-template-columns 属性,grid-template-rows 属性
grid-template-columns属性定义每一列的列宽,grid-template-rows属性定义每一行的行高。
/*指定了一个三行三列的网格,列宽和行高都是100px*/
.container {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
}
/*也可以使用百分比*/
.container {
display: grid;
grid-template-columns: 33.33% 33.33% 33.33%;
grid-template-rows: 33.33% 33.33% 33.33%;
}
# repeat
重复写同样的值非常麻烦,尤其网格很多时。这时,可以使用repeat()函数
repeat()接受两个参数,第一个参数是重复的次数(上例是3),第二个参数是所要重复的值。
/*指定了一个三行三列的网格,列宽和行高都是100px*/
.container {
display: grid;
grid-template-columns: repeat(3,100px);
grid-template-rows: repeat(3,100px);
}
repeat()重复某种模式也是可以的。
grid-template-columns: repeat(2, 100px 20px 80px);
# auto-fill 关键字
单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充
# fr关键字
网格布局提供了fr关键字(fraction 的缩写,意为"片段")。如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍。
.container {
display: grid;
grid-template-columns: 1fr 1fr;
}
fr可以与绝对长度的单位结合使用,这时会非常方便
.container {
display: grid;
grid-template-columns: 150px 1fr 2fr;
}
# minmax()
minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值。
// minmax(100px, 1fr)表示列宽不小于100px,不大于1fr。
// grid-template-columns: 1fr 1fr minmax(100px, 1fr);
# auto 关键字
auto关键字表示由浏览器自己决定长度。
// grid-template-columns: 100px auto 100px;
上面代码中,第二列的宽度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width,且这个值大于最大宽度。
# 网格线的名称
grid-template-columns属性和grid-template-rows属性里面,还可以使用方括号,指定每一根网格线的名字,方便以后的引用
.container {
display: grid;
grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
}
# 布局实例
grid-template-columns属性对于网页布局非常有用。两栏式布局只需要一行代码。
.wrapper {
display: grid;
grid-template-columns: 70% 30%;
}
传统的十二网格布局,写起来也很容易。grid-template-columns: repeat(12, 1fr);
# grid-row-gap 属性,grid-column-gap 属性,grid-gap 属性
根据最新标准,上面三个属性名的grid-前缀已经删除,grid-column-gap和grid-row-gap写成column-gap和row-gap,grid-gap写成gap。
grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)。
.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>;
如果grid-gap省略了第二个值,浏览器认为第二个值等于第一个值。
← flex css尝试-画电风扇 →