9 HTML-Grid网格布局
概述
Grid 布局即网格布局,目前css布局方案中,网格布局可以算得上是最强大的布局方案了。它可以将网页 分为一个个网格,然后利用这些网格组合做出各种各样的布局。比较擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系,目前唯一一种 CSS 二维布局。在兼容性方面,截至目前,几乎所有的浏览器都对 CSS Grid 提供了原生的支持。
flex和Grid布局有实质区别,flex是一维布局,Grid是二维布局,也就是说flex布局一次只能处理一个维度上的元素。Grid是将容器划分为行和列。
Grid布局的属性
- 容器(container):具有容器属性
- 项目(items):有项目属性
- 行
- 列
- 间距(gap):单元格之间的距离
- 区域(area):自己划分每个单元格占据的区域
- 内容
容器和项目
Grid和flex类似,定于在容器上,称为容器属性,定义在项目上,称为项目属性
声明display:grid
则容器是一个块元素,display:inline-grid
则容器为行内元素
注意:设置为网格布局后,子元素的float、display:inline-block、display:table-cell、vertical-aligin等都会失效
网格线
网格线是Grid布局规范中最重要的概念之一。网格线是用来在水平和垂直方向分割网格的线。水平方向的网格线是从左向右;垂直方向是从上往下。网格线的编号都是从 1 开始的。

容器属性
grid-template-columns和grid-template-rows属性
1 | .box { |
repeat()
有时候,重复写同样的值非常麻烦,尤其网格很多时。这时,可以使用 repeat() 函数,简化重复的 值。该函数接受两个参数,第一个参数是重复的次数,第二个参数是所要重复的值。
1 | .box { |
auto-fill
有的时候,父容器的尺寸是不确定的,我们需要把子元素往父容器中逐个填充,这个时候我们可以利用 auto-fill。也就是在不确定容器尺寸时的时候使用
1 | box { |
案例:
1 | <head> |
fr
fr 是单词fraction的缩写,表示分数
Grid 布局还引入了一个另外的长度单位来帮助我们创建灵活的网格轨道。 fr 单位代表网格容器中可 用空间的一等份。 grid-template-columns: 200px 1fr 2fr 表示第一个列宽设置为 200px,后面剩 余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3
1 | .box { |
minmax()
我们有时候想给网格元素一个最小和最大的尺寸, minmax() 函数产生一个长度范围,表示长度就在这 个范围之中都可以应用到网格项目中。它接受两个参数,分别为最小值和最大值。grid-templatecolumns: 1fr 1fr minmax(300px, 2fr)
的意思是,第三个列宽最少也是要 300px,但是最大不能大于第一第二列宽的两倍。
auto
auto 关键字表示由浏览器自己决定长度。通过 auto 关键字,我们可以轻易实现三列或者两列布局。 grid-template-columns: 100px auto 100px 表示第一第三列为 100px,中间由浏览器决定长度。
row-gap
row-gap属性设置行与行的间隔(行间距)
row-gap: 10px
表示行间距是 10px
column-gap
column-gap属性设置列与列的间隔
column-gap: 20px
表示列间距是 20px
- gap属性是column-gap和row-gap的合并简写形式:
gap: 10px 20px
grid-auto-flow
划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是”先行后列”,即 先填满第一行,再开始放入第二行 这个顺序由 grid-auto-flow 属性决定,默认值是 row ,即”先行后列”。也可以将它设成 column ,变 成”先列后行”。
1 | grid-auto-flow: column; |
justify-items
justify-items 属性设置单元格内容的水平位置(左中右)
1 | .container { |
align-items
align-items 属性设置单元格内容的垂直位置(上中下)
1 | .container { |
start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。
stretch:拉伸,占满单元格的整个宽度(默认值)
- place-items 属性是 align-items 属性和 justify-items 属性的合并简写形式
place-items: start end;
justify-content
justify-content 指定了网格元素的水平分布方式。此属性仅在网格总宽度小于grid容器宽度时候有效 果。例如,我们网格设定的都是固定的宽度值,结果还有剩余空间。
1 | justify-content: stretch | start | end | center | space-between | space-around | space-evenly; |
stretch:默认值。拉伸,宽度填满grid容器,拉伸效果需要网格目标尺寸设为auto时候才有效,如果定死了宽度,则无法拉伸。
start:默认值。逻辑CSS属性值,与文档流方向相关。默认表现为左对齐。
end:逻辑CSS属性值,与文档流方向相关。默认表现为右对齐。
center:表现为居中对齐。
space-between:表现为两端对齐。
between是中间的意思,意思是多余的空白间距只在元素中间区域 分配。
space-around:around是环绕的意思,意思是每个flex子项两侧都环绕互不干扰的等宽的空白间距,最 终视觉上边缘两侧的空白只有中间空白宽度一半。
space-evenly:evenly是匀称、平等的意思。也就是视觉上,每个子项两侧空白间距完全相等。
align-content属性
align-content 属性是整个内容区域的垂直位置(上中下) align-content 可以看成和 justify-content 是相似且对立的属性, justify-content 指明水平方向 grid子项的分布方式,而 align-content 则是指明垂直方向每一行grid元素的分布方式。如果所有grid 子项只有一行,则 align-content 属性是没有任何效果的。 语法如下:
1 | align-content: stretch | start | end | center | space-between | space-around | space-evenly; |
stretch:默认值。每一行flex子元素都等比例拉伸。例如,如果共两行flex子元素,则每一行拉伸高度是 50%。
start:逻辑CSS属性值,与文档流方向相关。默认表现为顶部堆砌。
end:逻辑CSS属性值,与文档流方向相关。默认表现为底部堆放。
center:表现为整体垂直居中对齐。
space-between:表现为上下两行两端对齐。剩下每一行元素等分剩余空间。
space-around:每一行元素上下都享有独立不重叠的空白空间。
space-evenly:每一行元素都完全上下等分。
- place-content 是align-content 和 justify-content属性的缩写。
1 | .container { |
grid-auto-columns 和grid-auto-rows
grid-auto-columns 属性和 grid-auto-rows 属性用来设置,浏览器自动创建的多余网格的列宽和行高。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。
1 | .container { |
项目属性
grid-column/row-start/end
表示grid子项所占据的区域的起始和终止位置,包括水平方向和垂直方向
grid-column-start 属性:左边框所在的垂直网格线
grid-column-end 属性:右边框所在的垂直网格线
grid-row-start 属性:上边框所在的水平网格线
grid-row-end 属性:下边框所在的水平网格线
1 | .item-1 { |
这四个属性的值还可以使用 span 关键字,表示”跨越”,即左右边框(上下边框)之间跨越多少个网格
1 | .item-1 { |
项目的左边框距离右边框跨越2个网格 使用这四个属性,如果产生了项目的重叠,则使用 z-index 属性指定项目的重叠顺序
grid-column/row
grid-column 属性是 grid-column-start 和 grid-column-end 的合并简写形式, grid-row 属性是 grid-row-start 属性和 grid-row-end 的合并简写形式。
1 | .item { |
1 | .item-1 { |
这两个属性之中,也可以使用 span 关键字,表示跨越多少个网格
1 | .item-1 { |
justify/align-self
justify-self 属性设置单元格内容的水平位置(左中右),跟 justify-items 属性的用法完全一致, 但只作用于单个项目。
align-self 属性设置单元格内容的垂直位置(上中下),跟 align-items 属性的用法完全一致,也是 只作用于单个项目。
.item { justify-self: start | end | center | stretch; align-self: start | end | center | stretch; }
1 | start:对齐单元格的起始边缘。 |
- place-self属性 place-self 属性是 align-self 属性和 justify-self 属性的合并简写形式
grid-template-areas
可以使用 grid-area 属性命名网格项目,然后在 grid-template-areas 属性中引用该名称
1 | .container { |
1 | .container { |
1 | .container { |
9 HTML-Grid网格布局