Grid学习总结

46 阅读5分钟

Grid布局是css布局方案之一,Grid将容器划分成“行”和”列“,产生单元格,然后指定“项目所在”的单元格,可以看作是二维布局。Grid布局比Flex布局强大,Flex布局是轴线布局,只能指定“项目”针对轴线的位置,可以看作是一维布局

一、基本概念

1,容器(container): 有容器属性

2,项目(items):有项目属性,项目只能是容器的顶层子元素,不包含项目的子元素

3,(row):水平区域

4,(column):垂直区域

5,间距(gap):单元格之间的间距

6,区域(area):单元格所占据的区域

7,网格线(grid line):划分网格的线,水平网格线划分出行,垂直网格线划分出列。n行就有n+1根水平网格线,m列就有m+1跟垂直网格线

二、API

Grid布局的属性分为两类。一类定义在容器上面,称为容器属性;另一类定义在项目上面,称为项目属性。

三、实例代码

基础代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>grid练习</title>
  <style>
    .containerBase{
      width: 300px;
      border: 2px solid #ddd;
    }
    .itemBase{
      font-size: 60px;
      color: #111111;
      text-align: center;
    }
    .container{}
    .item{}
  </style>
</head>
<body>
  <div class="containerBase container">
    <div class="itemBase item1">1</div>
    <div class="itemBase item2">2</div>
    <div class="itemBase item3">3</div>
    <div class="itemBase item4">4</div>
    <div class="itemBase item5">5</div>
    <div class="itemBase item6">6</div>
    <div class="itemBase item7">7</div>
    <div class="itemBase item8">8</div>
    <div class="itemBase item9">9</div>
  </div>
  <script>
    const colors = ['#EF3429','#F68F25','#4BA846','#0576C2','#C077AF','#F8D29D','#B4A87F', '#D0E4A8','#4DC7EC'];
    let items = document.getElementsByClassName('itemBase');
    for(let k in items){
      if (items[k].style) {
        items[k].style.backgroundColor = colors[k];
      }
    }
  </script>
</body>
</html>

3.1 容器属性

1,设置网格的列宽和行高。

.container{
   display: grid;
   grid-template-columns: 33.33% 33.33% 33.33%;
   grid-template-rows: 100px 100px 100px;
}

用于设置网格列宽和行高的函数及关键字,如下列表:

注意:仅适用于设置grid-template-rows、grid-template-columns、grid-auto-rows和grid-auto-columns。

2,指定网格区域和定义网格线名称。

(1)指定网格区域: grid-template-areas

将9宫格各个区域定义如下:

.container{
      display: grid;
      grid-template-areas: "a b c" 
                           "d e f"
                           "g h i";
}

若某些区域不需要利用,可以使用”点“(.)表示:

.container{
      display: grid;
      grid-template-areas: "a . c"
                           "d . f" 
                           "g . i";
}      

多个单元格合并成一个区域的写法:

.container{
      display: grid;
      grid-template-areas: "a a a"
                           "b b b"
                           "c c c";
}

(2)定义网格线名称

划分网格的线,称为网格线。正常情况下,n行就有n+1根水平网格线,m列就有m+1根垂直网格线。在grid-template-rowsgrid-template-columns的属性中,使用方括号来指定每一根网格线的名字,方便以后的引用。

.container{
    grid-template-rows: [r1] 1fr [r2] 1fr [r3] 1fr [r4];
    grid-template-columns: [c1] 100px [c2] 50px [c3] 1fr [c4];
 }

3,设置网格间距;

grid-row-gap(row-gap):设置行与行之间的间距;

grid-column-gap(column-gap):设置列与列之间的间距;

grid-gap(gap):行间距和列间距的合并简写形式;

最新标准统一使用row-gap,column-gap,gap。【grid-】前缀已经删除。

.container{
    display:grid;
    gap:20px 10px; // 行间距20px, 列间距10px
}

4,设置容器中单元格的放置顺序

grid-auto-flow的默认值是row,先行后列 ,column是先列后行。

.container{
    display: grid;
    grid-auto-flow: column;  // 先列后行
}

grid-auto-flow属性除了设置成row和column,还可以设置成row dense和column dense。这两这个值主要用于某些项目指定位置后,剩下的项目怎么自动放置。

.container{
   display: grid;
   grid-template-rows: repeat(3,1fr);
   grid-template-columns: [c1] 120px [c2] 120px [c3] 1fr [c4];
   gap: 3px;
   grid-auto-flow: row dense;
}
.item1{
   grid-column-start: c1;
   grid-column-end: c3;
}
.item2{
   grid-column-start: c1;
   grid-column-end: c3;
}

5,设置内容位置

(1)设置整个内容区域在容器里的位置

justify-content:整个内容区域在容器里面的水平位置(start | center | end | stretch | space-between | space-around | space-evenly)

align-content:整个内容区域在容器里面的垂直位置(start | center | end | stretch | space-between | space-around | space-evenly)

place-content

(2)设置单元格内容在单元格中的位置

justify-items:单元格内容在单元中的水平位置(start | center | end | stretch)

align-items:单元格内容在单元格中的垂直位置(start | center | end | stretch)

place-items:

6,grid-auto-columns和grid-auto-rows的使用
如果网格只要三行三列,但是某一个项目指定在第4列,这时,浏览器会自动生成多余的网格,以便放置项目。

.container{
   display: grid;
   grid-template-rows: repeat(3,80px);
   grid-template-columns: [c1] 50px [c2] 50px [c3] 100px [c4];
   grid-auto-rows:minmax(20px, 1fr);
}
.item8{
   grid-row:4 / 5;
   grid-column: c2 / c3;
}
.item9{
   grid-row:5 / 6;
   grid-column: 5 / 6;
}

3.2 项目属性

1,通过网格线指定项目的位置

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

合并简写形式:

grid-column: / ;
grid-row: / ;

.container{
   display: grid;
   grid-template-rows: repeat(3,50px);
   grid-template-columns: [c1] 50px [c2] 50px [c3] 100px [c4];
   grid-auto-rows:minmax(20px, 1fr);
}
.item1{
   grid-row: 1 / span 2;
   grid-column: c1 / span 2 ;
}

span关键字,表示跨越多少个网格。

我们发现项目之间若发生了重叠,可以使用z-index属性指定项目的重叠顺序。

.container{
   display: grid;
   grid-template-rows: repeat(3,50px);
   grid-template-columns: [c1] 50px [c2] 50px [c3] 100px [c4];
   grid-auto-rows:minmax(20px, 1fr);
}
.item1{
  grid-row: 1 / span 2;
  grid-column: c1 / span 2 ;
}
.item4{
  z-index: 10;
}
.item7{
  z-index: 8;
}

2,通过grid-area属性指定项目放在哪一个区域。

.container{
   display: grid;
   grid-template-rows: repeat(3,70px);
   grid-template-columns: [c1] 50px [c2] 50px [c3] 100px [c4];
   grid-auto-rows: minmax(20px, 1fr);
   grid-template-areas: 'a b c'
                        'd e f'
                        'g h i';
}
.item4{
    grid-area: a;
}

grid-area属性还可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式,直接指定项目的位置。

.item4{
    grid-area: 1 / 1 / 3 / 3;
}

3,设置单个项目下的单元格内容的位置

  • justify-self:设置单元格内容的水平位置(start | center | end | stretch);
  • align-self:设置单元格内容的垂直位置(start | center | end | stretch);
  • place-self: ;

justify-item和align-items是设置容器中所有项目单元格内容的位置,而justify-self和align-self仅设置指定项目的单元格内容的位置。