网格布局(Grid)是最强大的 CSS 布局方案,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。
基本概念h1
学习 Grid 布局之前,需要了解一些基本概念。
容器和项目h2
采用网格布局的区域,称为”容器”(container)。容器内部采用网格定位的子元素,称为”项目”(item)。
例如:
<div> <div><p>1</p></div> <div><p>2</p></div> <div><p>3</p></div></div>上面代码中,最外层的<div>元素就是容器,内层的三个<div>元素就是项目。
注意:项目只能是容器的顶层子元素,不包含项目的子元素,比如上面代码的
<p>元素就不是项目。Grid 布局只对项目生效。
网格线h2
划分网格的线,称为”网格线”(grid line)。水平网格线划分出行,垂直网格线划分出列。
正常情况下,n行有n + 1根水平网格线,m列有m + 1根垂直网格线,比如三行就有四根水平网格线。
属性h1
如果要应用Grid布局,只需要添加display: grid;即可。
注意,设为网格布局以后,容器子元素(项目)的
float、display: inline-block、display: table-cell、vertical-align和column-*等设置都将失效。
定义行和列h2
容器指定了网格布局以后,接着就要划分行和列。grid-template-columns属性定义每一列的列宽,grid-template-rows属性定义每一行的行高。
.container { display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px;} /* 指定了一个三行三列的网格,列宽和行高都是100px 也可以使用百分比 */repeat()h3
采用复写的方法
.container { display: grid; grid-template-columns: repeat(3, 33.33%); /* 采用复写的方法 */ grid-template-rows: repeat(3, 33.33%);}auto-fillh3
有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。
.container { display: grid; grid-template-columns: repeat(auto-fill, 100px); /* 表示自动填充 */}fr关键字h3
为了方便表示比例关系,网格布局提供了fr关键字(fraction 的缩写,意为”片段”)。如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍。
fr可以与绝对长度的单位结合使用,这时会非常方便。
.container { display: grid; grid-template-columns: 150px 1fr 2fr;}minmax()h3
minmax()函数产生一个长度范围,表示长度就在这个范围之中。布局中很关键的因素。
.container { display: grid; grid-template-columns: 1fr 1fr minmax(100px, 1fr);}表示列宽不小于100px,不大于1fr == 200px。
定义间距h2
grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)。
除此之外还有合并写法,grid-gap: <grid-row-gap> <grid-column-gap>;
最新标准,上面三个属性名的
grid-前缀已经删除,grid-column-gap和grid-row-gap写成column-gap和row-gap,grid-gap写成gap。
设置单元格内容的对齐方式h2
justify-items属性设置单元格内容的水平位置(左中右),align-items属性设置单元格内容的垂直位置(上中下)。
.container { justify-items: start | end | center | stretch; align-items: start | end | center | stretch;}设置内容在容器里面的位置h2
justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-content属性是整个内容区域的垂直位置(上中下)。
.container { justify-content: start | end | center | stretch | space-around | space-between | space-evenly; align-content: start | end | center | stretch | space-around | space-between | space-evenly;}