网格(grid)布局

204 阅读6分钟

grid布局

概念

将一个盒子划分成多个单元格,指定内容放在指定的单元格中,实现一种比较整齐的布局方式。例如:9宫格## 容器属性

声明网格布局


display: grid/inline-grid;

grid可以将元素转为块元素,inline-grid可以将元素转为行内元素。### 划分行和列

划分行


grid-template-rows: 值;

取值说明:

可以是多个值,每个值之间使用空格隔开,值的个数表示要划分多少行。

每个值都是具体的长度值。

例:


grid-template-rows: 100px 200px 200px 100px;

4个值,表示要划分4行,这4行的高度分别为100px、200px、200px、100px。

划分列


grid-template-columns: 值;

划分列的取值跟划分行的取值是一样的:值的个数表示要划分的列的个数,每个值都表示列的宽度。

划分行和列,取值中的每个值还可以使用百分比来表示,例:


grid-template-rows: 10% 20% 30% 20% 20%;

表示划分5个行,高度分别为父标签的指定百分比。 划分行和列还可以使用分数来描述:


grid-template-columns: 1fr 3fr 1fr;

代表共分3列,将容器分为5份,其中第一列占据1份,第二列占据3份,第三份占据1份。

设置单元格行或列的最大值和最小值:


grid-template-columns: minmax(最小值, 最大值);

当剩余距离小于最小值,且小于最大值,则使用最小值作为单元格的宽或高;

当剩余距离大于最小值,且小于最大值,则使用剩余距离作为单元格的宽或高

当剩余距离大于最大值,且大于最小值,则使用最大值作为单元格的宽或高; auto可以代替具体的值,表示自动填充,占据剩余所有的距离


grid-template-columns:30px auto 20px;

表示第一列30px,第三列20px,剩余的所有距离都属于第二列。

设置单元格之间的间距

设置行间距


grid-row-gap: 20px;

表示,行和行之间的间距为20px。

设置列间距


grid-column-gap: 30px;

表示,列和列之间的间距为30px。

设置间距的复合写法


grid-gap: 20px 50px;

第一个值表示行间距,第二个值表示列间距。

规划子元素排列的方向


grid-auto-flow: column | row;

column表示纵向排列,row表示横向排列,默认使用row

内容在单元格内的对齐方式

水平对齐方式


justify-items: start | end | center | stretch;

如果项目没有设置宽和高,默认使用stretch,如果项目设置了宽和高,默认使用start,因为设置了宽和高以后,stretch将不生效。

start:居左

end:居右

center:居中

stretch:拉伸

垂直对齐方式


align-items: start | end | center | stretch;

如果项目没有设置宽和高,默认使用stretch,如果项目设置了宽和高,默认使用start,因为设置了宽和高以后,stretch将不生效。

start:居上

end:居下

center:居中

stretch:拉伸

复合写法


place-item:垂直对齐方式 水平对齐方式;

网格在容器中的对齐方式

水平对齐方式


justify-content:start | end | center | stretch | space-around | space-between | space-evenly;

垂直对齐方式


align-content: start | end | center | stretch | space-around | space-between | space-evenly;

复合写法


place-content:  垂直对齐方式 水平对齐方式

start - 对齐容器的起始边框。end - 对齐容器的结束边框。center - 容器内部居中。stretch - 项目大小没有指定时,拉伸占据整个网格容器。space-around - 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍。space-between - 项目与项目的间隔相等,项目与容器边框之间没有间隔。pace-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔。

指定网格线名称


grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];

指定网格布局为3行x3列,因此有4根垂直网格线和4根水平网格线。方括号里面依次是这八根线的名字。默认以1234来命名。

项目属性

指定网格线合并单元格:


grid-column-start: 开始的纵向网格线名称;
grid-column-end: 结束的纵向网格线名称;
grid-row-start: 开始的横向网格线名称;
grid-row-end: 结束的横向网格线名称;

grid-column-start属性:左边框所在的垂直网格线 grid-column-end属性:右边框所在的垂直网格线 grid-row-start属性:上边框所在的水平网格线 grid-row-end属性:下边框所在的水平网格线

复合写法:


grid-column: grid-column-start网格线名称的值 / grid-column-end的值;
grid-row: grid-row-start的值 / grid-row-end的值;

设置网格区域分配项目

正常情况下,是一个项目占据一个单元格。如果在某些特殊情况下,我们需要让一个项目,占据多个单元格,就需要设置网格区域来分配项目了。 网格是3*3的九宫格,但只放3张图片,且每张图片需求的大小不同。

设置网格区域分配项目时,需要容器的属性跟项目的属性配合使用:

  1. 给每个单元格命名,且通过名称将多个单元格进行合并

    容器属性:

    
    /* 将容器划分为9宫格 */
    display: grid;
    grid-template-rows: repeat(3, 100px);
    grid-template-columns: repeat(3, 100px);
    /* 给每个单元格命名 */
    grid-template-areas: "a a c" 
                         "d e f" 
                         "g h i";
    

    注意:相同的名称可以进行合并,但单元格合并后必须是一个长方形或正方形。

  2. 给项目设置要占据的区域名称

    项目属性:

    
    grid-area:区域名称;
    

    指定当前项目要占据的区域名称,区域名称不需要加引号。相当于将单元格进行了合并,指定某个元素占据合并后单元格,所以最后一个元素没有单元格可占,被挤出了网格外。

如果指定的合并单元格不能组成长方形或正方形,将出现混乱:如果某些单元格不放内容,则可以使用.来描述区域名称,表示无用区域: