Grid 布局 -- 简述

16 阅读6分钟

一、基本概念

1、容器和元素:外层的叫容器,内层的叫做元素。

2、行和列:容器里面的水平区域称为"行"(row),垂直区域称为"列"(column)。

3、单元格:行和列交叉形成的区域。n行和m列会产生n x m个单元格。3行3列会产生9个单元格

4、网格线:n行有n + 1根水平网格线,m列有m + 1根垂直网格线,如三行就有四根水平网格线

二、容器属性

1、display 属性

div { 
    display: grid; // 指定一个容器采用网格布局(容器是块级元素) 
    display: inline-grid; // 指定一个容器采用网格布局(容器是行级元素) 
}

2、grid-template-columns,grid-template-rows

  • grid-template-columns属性定义每一列的列宽。
  • grid-template-rows属性定义每一行的行高。
.container { 
    display: grid; 
    grid-template-columns: 33.33% 33.33% 33.33%; 
    grid-template-rows: repeat(3,100px); 
} 
// 上述代码就是定义容器是3\*3的表格区域。

1)、repeat(3,10px):

接受两个参数,第一个参数是重复的次数,第二个参数是所要重复的值。

grid-template-columns: repeat(2, 100px 20px 80px);

2)、auto-fill 关键字:

有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。

grid-template-columns: repeat(auto-fill, 100px); // 每列宽度100px,然后自动填充到容器放不下更多的列。

3)、fr 关键字:

比例关系,宽度分别为1fr和2fr,就表示后者是前者的两倍。

grid-template-columns: 1fr 1fr; // 表示两个相同宽度的列

4)、minmax():

minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值。

grid-template-columns: 1fr 1fr minmax(100px, 1fr); // 表示列宽不小于100排序,不大于1fr

5)、auto 关键字:

auto关键字表示由浏览器自己决定长度。

grid-template-columns: 100px auto 100px;

6)、网格线的名称:

rid-template-columns属性和grid-template-rows属性里面,还可以使用方括号,指定每一根网格线的名字,方便以后的引用。

grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];

7)、布局实例:

.wrapper { 
    display: grid; 
    grid-template-columns: 70% 30%; //左边栏设为70%,右边栏设为30%。 
}

3、grid-row-gap,grid-column-gap,grid-gap

  • grid-row-gap属性设置行与行的间隔(行间距)。
  • grid-column-gap属性设置列与列的间隔(列间距)。
  • grid-gap属性是grid-column-gap和grid-row-gap的合并简写形式。
.container { 
    grid-row-gap: 20px; 
    grid-column-gap: 20px; 
 }
 .container { 
     grid-gap: 20px 20px; 
 }
 // 行间隔和列间隔均为20px

4、grid-template-areas

  • grid-template-areas属性用于定义区域。
.container { 
    display: grid; 
    grid-template-columns: 100px 100px 100px; 
    grid-template-rows: 100px 100px 100px; 
    grid-template-areas: "header header header" "main main sidebar" "footer footer footer"; 
} 
// 顶部是页眉区域header,底部是页脚区域footer,中间部分则为main和sidebar。

5、grid-auto-flow

  • 决定子元素摆放顺序,默认值是row,即"先行后列"。也可以将它设成column,变成"先列后行"。
grid-auto-flow: column dense; // "先列后行",并且尽量填满空格。

6、justify-items,align-items,place-items

  • justify-items属性设置单元格内容的水平位置(左中右)。
  • align-items属性设置单元格内容的垂直位置(上中下)。
  • place-items属性是align-items属性和justify-items属性的合并简写形式。
.container { 
    justify-items: start | end | center | stretch; 
    align-items: start | end | center | stretch; 
} 
// start:对齐单元格的起始边缘。 
// end:对齐单元格的结束边缘。 
// center:单元格内部居中。 
// stretch:拉伸,占满单元格的整个宽度(默认值)。

7、justify-content,align-content,place-content

  • justify-content属性是整个内容区域在容器里面的水平位置(左中右)。
  • align-content属性是整个内容区域的垂直位置(上中下)。
  • place-content属性是align-content属性和justify-content属性的合并简写形式。
justify-content: start | end | center | stretch | space-around | space-between | space-evenly; 

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

8、grid-auto-columns,grid-auto-rows

有时候,一些项目的指定位置,在现有网格的外部。比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。

grid-auto-columns属性和grid-auto-rows属性用来设置,浏览器自动创建的多余网格的列宽和行高。它们的写法与grid-template-columns和grid-template-rows完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。

image.png

.container { 
    display: grid; 
    grid-template-columns: 100px 100px 100px; 
    grid-template-rows: 100px 100px 100px; 
    grid-auto-rows: 50px; 
} 
// 上面代码指定新增的行高统一为50px

9、grid-template,grid

grid-template属性是grid-template-columns、grid-template-rows和grid-template-areas这三个属性的合并简写形式。

grid属性是grid-template-rows、grid-template-columns、grid-template-areas、 grid-auto-rows、grid-auto-columns、grid-auto-flow这六个属性的合并简写形式。

三、项目属性

1、grid-column-start,grid-column-end,grid-row-start,grid-row-end

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

image.png

.item-1 { 
    grid-column-start: 1; 
    grid-column-end: 3; 
    grid-row-start: 2; 
    grid-row-end: 4; 
} 
// 如右图,红色区域根据四个值确定位置以及大小

2、grid-column 属性,grid-row 属性

  • grid-column属性:grid-column-start和grid-column-end的合并简写形式。
  • grid-row属性:grid-row-start属性和grid-row-end的合并简写形式。
.item-1 { 
    grid-column:1 / 3; 
    grid-row:2 / 4; 
} 
// 如上图效果一致

3、grid-area 属性

  • grid-area属性指定项目放在哪一个区域。
  • grid-area属性还可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式,直接指定项目的位置。
.item-1 { 
    grid-area: 2 / 1 / 4 / 3; // 上、右、下、左 
} // 如上图效果一致

4、justify-self 属性,align-self 属性,place-self 属性

  • justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。
  • align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目。
  • place-self属性是align-self属性和justify-self属性的合并简写形式。
.item { 
    justify-self: start | end | center | stretch; align-self: start | end | center | stretch; 
} 
// start:对齐单元格的起始边缘。 
// end:对齐单元格的结束边缘。 
// center:单元格内部居中。 
// stretch:拉伸,占满单元格的整个宽度(默认值)