Grid网格布局

一、布局知识

1.布局发展进程

布局发展阶段

2.网格布局简介

网格布局(grid)是最强大的 CSS 布局方案。
它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了

3.Grid与Flex比较

  • Flexbox是一维布局,只能在一条直线上放置内容区块
  • Grid是二维布局,根据设计需求将内容区块放置在任何地方

二、基本概念

1.容器和项目

采用网格布局的区域,称为"容器"(container)。容器内部采用网格定位的子元素,称为"项目"(item)
项目1
项目2
项目3

最外层的类名为warp的div为整个容器,三个儿子元素div为项目

注意:Grid 布局只对项目生效,对里面项目里子元素不起作用

2.行和列

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

3.单元格

行和列的交叉区域,称为"单元格"(cell)。

正常情况下,n行和m列会产生n x m个单元格。比如,3行3列会产生9个单元格。


单元格

上图每一个颜色的格子都为一格单元格

4.图形

网格布局图
  • 网格线(grid line)
    row line:行线
    column:列线
  • trank:网格轨道,或列线和列线之所形成的区域,用来摆放子元素
  • gap:网格间距,行线和行线,或列线和列线之间所形成的不可利用的区域,用来分隔元素
  • cell:网格单元格,由行线和列线所风格出来的区域,用来摆放子元素

三、容器属性

1.display属性

指定一个容器采用网格布局
  div {
    display: grid;
  }

2.grid-template-columns 属性,grid-template-rows 属性

  • grid-template-columns 属性定义每一列的列宽
  • grid-template-rows 属性定义每一行的行高

设置一个为3行3列,列宽和行高都是100px的网格布局

  .container {
    display: grid;
    grid-template-columns: 100px 100px 100px;  /* 设置网格为三列,每一列宽度为100px */
    grid-template-rows: 100px 100px 100px;  /* 设置网格为三行,每一行高度为100px */
  }  

除了使用绝对单位,也可以使用百分比设置行高和列宽

  .container {
    display: grid;
    grid-template-columns: 33.33% 33.33% 33.33%;    /* 设置网格为三列,每一列占比容器宽度的33.33% */
    grid-template-rows: 33.33% 33.33% 33.33%;     /* 设置网格为三行,每一行占比容器高度的33.33% */
  }
2.1 repeat()函数
  • 如果网格有很多,要写很多重复值的时候,此时用repeat()函数

    .container {
      display: grid;
      grid-template-columns: repeat(3, 33.33%);  /* 设置容器分成3列,每列占比总容器宽度的33.33%  */
      grid-template-rows: repeat(3, 33.33%);    /* 设置容器分成3行,每列占比总容器高度的33.33%  */
    }
    
  • repeat()重复某种模式也是可以的

    .container {
      display: grid;
      rid-template-columns: repeat(2, 100px 20px 80px)  /* 设置容器分成6列2组,每组3列,宽度分别为100px,20px,80px  */
    }
    
效果图
2.2 auto-fill 关键字
有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充
  .container {
    display: grid;
    grid-template-columns: repeat(auto-fill, 100px);    /* 设置容器的宽度为100px,然后自动填充,直到容器不能放置更多的列 */
  }
auto-fill效果图
2.3 fr 关键字
为了方便表示比例关系,网格布局提供了fr关键字(fraction 的缩写,意为"片段")。如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍
  .container {
    display: grid;
    grid-template-columns: 1fr 1fr;    /* 设置容器为2列,2列的占容器的宽度占比为1:1 */
    grid-template-rows: repeate(5,100px);
  }
fr关键字效果图
  • fr可以与绝对长度的单位结合使用,这时会非常方便

    .container {
      display: grid;
      grid-template-columns: 150px 1fr 2fr;    /* 设置容器为3列,第一列的宽度为150像素,第二列的宽度是第三列的一半 */
    }
    
fr关键字效果图
2.4 minmax() 函数
minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值
  .container {
    display: grid;
    grid-template-columns: 1fr 1fr minmax(100px, 1fr);  /* 设置容器为3列,第一列和第二列的占比相同,第三列的宽度不小于100px,不大于1fr */
  }
2.5 auto 关键字
auto关键字表示由浏览器自己决定长度
grid-template-columns: 100px auto 100px;
  • 上面代码中,第二列的宽度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width,且这个值大于最大宽度
2.6 网格线的名称
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];
}
  • 方括号里面依次表示每根线的名字,网格布局允许同一根线有多个名字,比如[fifth-line row-5]

3.grid-row-gap 属性,grid-column-gap 属性,grid-gap 属性

3.1 grid-row-gap 属性,grid-column-gap 属性
grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)
.container {
  grid-row-gap: 20px;    /* 设置行间距为20px  */
  grid-column-gap: 20px;     /* 设置列间距为20px  */
}
间距效果图
3.2 grid-gap属性
grid-gap属性是grid-column-gap和grid-row-gap的合并简写形式
  • 语法1

    .container {
      /* grid-gap:  ;  */
      grid-gap: 20px 20px;  /* 设置行间距和列间距为分别20px */
    }
    
  • 语法2:如果grid-gap省略了第二个值,浏览器认为第二个值等于第一个值

    .container {
      grid-gap: 20px;    /* 也表示设置行间距和列间距为分别20px */
    }
    

4.grid-template-areas 属性

网格布局允许指定"区域"(area),一个区域由单个或多个单元格组成。grid-template-areas属性用于定义区域
.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
  grid-template-areas: 'a b c'
                       'd e f'
                       'g h i';
}

上面代码先划分出9个单元格,然后将其定名为a到i的九个区域,分别对应这九个单元格
多个单元格合并如下

grid-template-areas: 'a a a'
                     'b b b'
                     'c c c';

上面代码将9个单元格分成a、b、c三个区域。

5.grid-auto-flow 属性

划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。这个顺序由grid-auto-flow属性决定,默认值是row,即"先行后列"。也可以将它设成column,变成"先列后行"
grid-auto-flow: column;
按列排顺序

6.justify-items 属性,align-items 属性,place-items 属性

6.1 justify-items 属性
justify-items属性设置单元格内容的水平位置(左中右),align-items属性设置单元格内容的垂直位置(上中下)
  • 语法

    .container {
      justify-items: start | end | center | stretch;
      align-items: start | end | center | stretch;
    }
    
两个两个属性的写法完全相同,都可以取下面这些值
  • start:对齐单元格的起始边缘。
  • end:对齐单元格的结束边缘。
  • center:单元格内部居中。
  • stretch:拉伸,占满单元格的整个宽度(默认值)。
  .container {
    justify-items: start;    /* 设置水平方向对齐方式为左对齐 */
  }
左对齐
.container {
  align-items: start;     /* 设置垂直方向对齐方式为上对齐 */
}
上对齐
6.2 place-items属性
place-items属性是align-items属性和justify-items属性的合并简写形式。
.container {
  /* place-items:  ; */
  place-items: start end;    /* 设置水平方向为左对齐,垂直方向为下对齐 */
}
  • 如果省略第二个值,则浏览器认为与第一个值相等

7.justify-content 属性,align-content 属性,place-content 属性

7.1 justify-content 属性,align-content 属性
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;  
}
这两个属性的写法完全相同,都可以取下面这些值。(下面的图都以justify-content属性为例,align-content属性的图完全一样,只是将水平方向改成垂直方向。)
  • start - 对齐容器的起始边框


    start效果图
  • end - 对齐容器的结束边框


    end右对齐效果图
  • center - 容器内部居中


    center居中对齐效果图
  • stretch - 项目大小没有指定时,拉伸占据整个网格容器


    stretch拉升占满整个容器效果图
  • pace-around - 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍


    pace-around效果图
  • space-between - 项目与项目的间隔相等,项目与容器边框之间没有间隔


    space-between效果图
  • space-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔


    space-evenly效果图
7.2 place-items 属性
place-content属性是align-content属性和justify-content属性的合并简写形式
.container {
  /* place-content:   */
  place-content: space-around space-evenly;
}
  • 如果省略第二个值,浏览器就会假定第二个值等于第一个值

8.grid-auto-columns 属性,grid-auto-rows 属性

  • 有时候,一些项目的指定位置,在现有网格的外部。比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。
  • grid-auto-columns属性和grid-auto-rows属性用来设置,浏览器自动创建的多余网格的列宽和行高。它们的写法与grid-template-columns和grid-template-rows完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。
  • 示例

定义一个3行3列的grid网格布局,其中有两个元素在网格布局之外,8号项目指定在第4行,9号项目指定在第5行

  .container {
    display: grid;
    /* 设置容器为一个3行3列,行高与列宽都为100px的布局 */
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-auto-rows: 50px;     /* 为多出来的8号项目和9号项目自动创建两个行,并设置行高为50px */
  }
  • grid-auto-rows: 50px; 表示为多出来的8号项目和9号项目自动创建两个行,并设置行高为50px


    效果图

9.grid-template 属性,grid 属性

9.1 grid-template 属性

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

9.2 grid 属性

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 属性

1.1 项目的位置是可以指定的,具体方法就是指定项目的四个边框,分别定位在哪根网格线(合并单元格)
  • grid-column-start属性:左边框所在的垂直网格线
  • grid-column-end属性:右边框所在的垂直网格线
  • grid-row-start属性:上边框所在的水平网格线
  • grid-row-end属性:下边框所在的水平网格线

例如

.item-1 {  
    /* 将元素的位置放到第1根列线开始,第3跟列线结束 */
    grid-column-start: 1;
    grid-column-end: 3;
    /* 将元素的位置放到第2根行线开始,第4跟行线结束 */
    grid-row-start: 2;
    grid-row-end: 4;
}
效果图
1.2 除了指定为第几个网格线,还可以指定为网格线的名字
.item-1 {
  /* 定位第一根列线和最后一根列线的名字 */
  grid-column-start: header-start;
  grid-column-end: header-end;
}
1.3 用span关键字,表示"跨越",即左右边框(上下边框)之间跨越多少个网格
.item-1 {
  /* 表示项目的左边框距离右边框跨越2个网格 */
  grid-column-start: span 2;
   /* 表示项目的右边框距离左边框跨越2个网格,效果与上面效果一样 */
  /* grid-column-end: span 2; */
}
效果图

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:起始网格线 / 结束网格线  */
      grid-column: 1 / 3;  /* 第一根列线到第三根列线 */
      grid-row: 1 / 3;  /* 第一根行线到第三根行线 */
    }
    
效果图

3.grid-area 属性

grid-area属性指定项目放在哪一个区域
  .item-1 {
     /* 将1号项目放到e区域 */
    grid-area: e;
  }
效果图
grid-area属性还可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式,直接指定项目的位置
  • 语法

    .item {
        grid-area:  /  /  / ;
    }
    
  • 例子

    .item-1 {
      grid-area: 1 / 1 / 3 / 3;
    }
    
效果图

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

4.1 justify-self 属性,align-self 属性
justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目
align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目
  • 取值
    start:对齐单元格的起始边缘
    end:对齐单元格的结束边缘
    center:单元格内部居中
    stretch:拉伸,占满单元格的整个宽度(默认值)

  • 语法

    .item {
      justify-self: start | end | center | stretch;
      align-self: start | end | center | stretch;
    }
    
  • 例子

    .item-a  {
      /* 将项目置于单元格的起始边缘 */
      justify-self: start;
    }
    
效果图
4.2 place-self 属性
place-self属性是align-self属性和justify-self属性的合并简写形式
  • 语法

    .item-a  {
      /* place-self:  ; */
      /* 将项目设置垂直方向单元格内部居中,以及水平方向单元格内部居中 */
      place-self: center center;
    }

你可能感兴趣的:(Grid网格布局)