Grid布局

一、啥是Grid呢

网格布局(Grid)是最强大的 CSS 布局方案

二、Grid和Flex

flex用来做一维布局,在一条轴线上来控制。

grid是二维布局,通过行和列来控制

三、Grid的基本概念

1.容器和项目

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

  <div class="container">
    <div class="item">
      <p></p>
    </div>
    <div class="item">
      <p></p>
    </div>
    <div class="item">
      <p></p>
    </div>
  </div>

此时给container设置display:grid;container就是项目,item就是子项,p标签并不是,只有他的亲儿子才是子项。

2.行和列

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

3.网格线

划分网格的线,称为"网格线"(grid line)。水平网格线划分出行,垂直网格线划分出列。

上图是一个 4 x 4 的网格,共有5根水平网格线和5根垂直网格线。

四、容器属性

1.display-grid

设为网格布局以后,容器子元素(项目)的float、display: inline-block、display: table-cell、vertical-align和column-*等设置都将失效。

2.grid-template-columns/grid-template-rows

用来设置行和列


上如图是一个三行三列每行都是100px效果~


上图可以按百分比填充~


fr单位相当于flex的份数,上图就是将网格行和列分为6份,第一个占1/6,第二个2/6,第三个3/6

repeat() 使用repeat()函数,简化重复的值
第一个参数是需要重复的次数,第二个参数就是要重复的值啦

上述的代码等同于:

  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;


上述代码等同于:

  display: grid;
  grid-template-columns: 1fr 2fr 1fr 2fr;

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

minmax()函数

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

//表示最小值为100px,最大值为1fr
grid-template-columns: 1fr 1fr minmax(100px, 1fr);

上述代码表示:当宽度大于100px时,由内容撑开

auto

超简单的左右固定,中间自适应...

3.column-gap/ row-gap/gap


grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)。

gap

gap属性是column-gap和row-gap的合并简写形式
如果行和列间距相等,就只用写一个值,否则前面写行,后面写列

4.grid-template-areas

  //表示每一个item都有自己的一座小房子
	grid-template-areas: 'a b c''d e f''g h i';
  //表示第一列的item都住在a小区,第二行的都住在b小区,第三行在c小区
  grid-template-areas: 'a a a''b b b''c c c';
  //表示第一行的第一个在a小区,第三个在c小区,中间的买不起房,孤立他不带他玩
  grid-template-areas: 'a . b''c . d''g . i';

5.grid-auto-flow

划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是"先行后列",即先填满第一行,再开始放入第二行

默认是row,按水平方向排列,column是按照垂直方向排列


当默认先行后列排列,1,2盒子横跨两行时,就会出现后面的装不下就掉下去的情况

row dense


设为row dense,表示"先行后列",并且尽可能紧密填满,尽量不出现空格

6.justify-items/align-items/place-items

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

start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。
stretch:拉伸,占满单元格的整个宽度(默认值)。


由于默认值是拉伸,设置别的之后,宽高默认由内容撑开
上述写法可以简写称为

place-items:center

7.justify-content/align-content/place-content

justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-content属性是整个内容区域的垂直位置(上中下)。

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


place-content就是两种属性的简写啦

8.grid-auto-rows

当设置了3*3的网格,多出来的item可以通过该属性单独设置

五、项目属性

1.grid-column-start/grid-column-end/grid-row-start/grid-row-end/grid-area

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


盒子4从第一列网格线开始到第三列网格线结束,盒子五从第三列网格线开始,第二行网格线开始,第四行网格线结束


grid-area是简写,前两个值分别是行和列的开始网格线,后两个值分别是行和列的结束网格线

2.justify-self/align-self/place-self

就是单独控制自己咯

源码

<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./css/gird.css">
</head>

<body>
  <div class="box">
    <div class="items1">1</div>
    <div class="items2">2</div>
    <div class="items3">3</div>
    <div class="items4">4</div>
    <div class="items5">5</div>
    <div class="items6">6</div>
    <div class="items7">7</div>
    <div class="items8">8</div>
    <div class="items9">9</div>
  </div>

</body>

</html>
.box {
   400px;
  height: 600px;
  border: 2px solid #095;
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr 1fr;
  grid-template-areas: 'a b c''d e f''g h i';
  // grid-template-areas: 'a a a''b b b''c c c';
  // grid-template-areas: 'a . b''c . d''g . i';


  .items1 {
    background-color: #FFDEAD;
  }

  .items2 {
    background-color: #BF3EFF;
  }

  .items3 {
    background-color: #B3EE3A;
  }

  .items4 {
    background-color: #A52A2A;
    grid-area: 1~'/'1~'/'3~'/'3;
  }

  .items5 {
    background-color: #A0522D;
  }

  .items6 {
    background-color: #0A0A0A;
  }

  .items7 {
    background-color: #00FA9A;
  }

  .items8 {
    background-color: #FFBBFF;
  }

  .items9 {
    background-color: #BBFFFF;
  }

}
原文地址:https://www.cnblogs.com/xiaoaitongxue/p/12796899.html