网格布局

549 阅读2分钟

一、引言

在日常布局当中,我们使用flex布局居多,可以快速形成自己想要的布局,但当我们想实现如下的布局时

使用flex布局就显得苍白无力,我们可能需要设置多个display:flex,这个时候网格布局就大大节省了我们的效率。

二、基础用法

     .main {
            width: 300px;
            height: 300px;
            background: skyblue;
            display: grid;
            grid-template-columns: 1fr 0.6fr 1fr;
            grid-template-rows: 100px 100px 100px;
      }

单位:fr 类似flex布局中的flex-grow

三、父项属性

网格合并

  • 父项:grid-template-areas
  • 子项:grid-area

代码简写方式:

grid-template-columns: 1fr 1fr 1fr;					
grid-template-rows: 1fr 1fr 1fr;
grid-template-areas:									
  'a1 a1 a2'
  'a1 a1 a2'
  'a3 a3 a3';

相当于:

grid-template:
  'a1 a1 a2' 1fr
  'a1 a1 a2' 1fr
  'a3 a3 a3' 1fr
  /1fr 1fr 1fr;

完整代码:

.main {
        width: 300px;
        height: 300px;
        background: skyblue;
        display: grid;
        /* grid-template-columns: 100px 100px 100px;
        grid-template-rows: 100px 100px 100px; */

        grid-template-columns: 1fr 1fr 1fr;
        grid-template-rows: 1fr 1fr 1fr;
        grid-template-areas:
          'a1 a1 a2'
          'a1 a1 a2'
          'a3 a3 a3';
      }
      .main div {
        background: pink;
        border: 1px solid black;
        box-sizing: border-box;
      }
      .main div:nth-of-type(1) {
        grid-area: a1;
      }
      .main div:nth-of-type(2) {
        grid-area: a2;
      }
      .main div:nth-of-type(3) {
        grid-area: a3;
      }

效果图:

网格间距及简写

这些写法也可以给弹性布局使用

image.png

row-gap: 20px;
column-gap: 30px;

row-gap: 行之间间隙

column-gap:列之间间隙

简写:gap:行间隙 列间隙

gap: 20px 30px;

网格对齐方式及简写

  • justify-itemsalign-itemsplace-items(垂直,水平) 默认值stretch,指定了子项在网格中的对齐方式 类似于flex布局的值
  • justify-contentalign-contentplace-content(垂直,水平) 默认值stretch,指定了所有的网格在grid容器中对齐方式(容器大于单元格)

子项属性

基于线的元素位置

  .main div:nth-of-type(1) {
        background: pink;
        grid-column-start: 3; // 或者加上span 234指占多少列/行 但是就没有了指定位置的特性
        grid-column-end: 2;
        grid-row-start: 2;
        grid-row-end: 3;
}

表示该单元格从第二列线到第三列线,以及第二行线到第三行线

image.png

repeat()

auto-fill可选值,指定可重复的数值

.main {
        height: 400px;
        background: pink;
        display: grid;
        grid-template-columns: 150px repeat(2, 100px);
        grid-template-rows: 100px;
      }
      .main div {
        background: skyblue;
      }

auto-fill:自动根据元素大小进行计算可以repeat多少值

minmax()

设置最大值和最小值的范围

.main {
        height: 400px;
        background: pink;
        display: grid;
        grid-template-columns: 100px minmax(100px, 1fr) 100px;
        grid-template-rows: 100px;
      }
      .main div {
        background: skyblue;
        border: 1px solid black;
      }