网格布局学习

215 阅读8分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 今天看开源项目的时候,发现一些很特别的样式。于是百度了一下。原来叫网格布局。这个在以往的项目里没有使用过,所以不知道。于是趁着现在好奇和兴趣学习了一下。边学变回想以到前遇到的一个问题,那是使用flex(弹性布局)。 发现使用这个网格布局可以轻轻松松解决。真的太好了。于是有了下面这个记录。

奇怪的样式

	.waterfall-last {
			grid-template-columns: repeat(7, 1fr);
			.waterfall-last-item {
				&:nth-of-type(9n + 9) {
					grid-column: auto / span 2;
				}
				&:nth-of-type(9n + 8) {
					grid-column: auto / span 2;
				}
				&:nth-of-type(9n + 7) {
					grid-column: auto / span 3;
				}
				&:nth-of-type(9n + 6) {
					grid-column: auto / span 2;
				}
				&:nth-of-type(9n + 5) {
					grid-column: auto / span 3;
				}
				&:nth-of-type(9n + 4) {
					grid-column: auto / span 2;
				}
				&:nth-of-type(9n + 3) {
					grid-column: auto / span 3;
				}
				&:nth-of-type(9n + 2) {
					grid-column: auto / span 2;
				}
				&:nth-of-type(9n + 1) {
					grid-column: auto / span 2;
				}
			}
		}

这个奇怪的样式原来是实现了瀑布屏。效果

图一

image.png

图二

image.png

设置的属性是 display: grid;

  1. 设置列数量

    下面这个是设置三列

     grid-template-columns: auto auto auto;
    

    下面这个是设置六列

     grid-template-columns: auto auto auto auto auto auto; 
    
  2. 设置行高属性

    下面这个是设置第一行高度是100px,第二行高度是300px

     grid-template-rows: 100px 300px;
    
  3. 网格单位fr

    下面这个同样是创建三列

      grid-template-columns: 1fr 1fr 1fr;
    
  4. 网格间距 grid-gap 行和列的间距都是10px。 简写用 gap 。间隙或间距

      grid-gap: 10px;
    

    gap: 10px;
    

    表示行与行的间距是50px,列与列的间距是100px

    grid-gap: 50px 100px;
    

    gap: 50px 100px;
    

    如果单独使用列则用 grid-column-gap或 column-gap

    如果单独使用行则用 grid-row-gap或 row-gap

  5. 网格线

    从上往下数表示行的网格线用line1,line2,line3表示。

    从左往右数表示列的网格线用line1,line2,line3表示。

    网格线跨度位置

    下面这个表示列的网格线 从第一条开始,到第三条结束。

    grid-column-start: 1;
    grid-column-end: 3;
    

    下面这个表示行的网格线从第一条开始,到第五条结束。

    grid-row-start: 1;
    grid-row-end: 5;
    
  6. grid 属性

    下面这个是设置表示设置三列且第一行高度是160px

    grid: 160px / auto auto auto;
    

    下面这个表示第一列宽度是20px ,第一行高度是150px

    grid: 150px / 20px auto auto;
    

    参考链接:www.runoob.com/cssref/css-…

  7. grid-template-areas 表示占的位置

    grid-template-areas 属性用于设置网格布局。

    grid-area 属性可以对网格元素进行命名。

    命名的网格元素可以通过容器的 grid-template-areas 属性来引用。

    每行由单引号内 ' ' 定义,以空格分隔。

    . 号表示没有名称的网格项。

    表示item1的命名是 myArea,而myArea格式表示的它跨域的列数

    .item1 {
      grid-area: myArea;
    }
    
    .grid-container {
      display: grid;
      grid-template-areas: 'myArea myArea myArea myArea myArea';
      grid-gap: 10px;
      background-color: #2196F3;
      padding: 10px;
    }
    
    .grid-container > div {
      background-color: rgba(255, 255, 255, 0.8);
      text-align: center;
      padding: 20px 0;
      font-size: 30px;
    }
    
    <div class="grid-container">
      <div class="item1">1</div>
      <div class="item2">2</div>
      <div class="item3">3</div>  
      <div class="item4">4</div>
      <div class="item5">5</div>
      <div class="item6">6</div>
    </div>
    
  8. grid-area 属性

    下面这个属性表示从第二行开始和第一列开始,横跨两行,三列

    grid-area: 2 / 1 / span 2 / span 3;
    

    参考链接:www.runoob.com/try/try.php…

    语法:都是网格线值1,2,3,4,5……表示 可以用坐标来帮助理解或者对角斜线理解

    grid-area: grid-row-start / grid-column-start / grid-row-end / grid-column-end | itemname;
    
    grid-row-start指定在哪一行开始显示网格元素。
    grid-column-start指定在哪一列开始显示网格元素。
    grid-row-end指定哪一行停止显示网格元素,或跨越多少行。
    grid-column-end指定哪一列停止显示网格元素,或跨越多少列。
    itemname指定网格元素名称

​ 每行由单引号内 ' ' 定义,以空格分隔。

​ .号表示没有名称的网格项。

​ 要定义两行,请在另一组单引号内 ' ' 定义第二行的列。 跨越 2 行 2 列:

.grid-container {
  display: grid;
  grid-template-areas: 'myArea myArea . . .' 'myArea myArea . . .';
  grid-gap: 10px;
  background-color: #2196F3;
  padding: 10px;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> 
<title>菜鸟教程(runoob.com)</title>
<style>
.grid-container {
  display: grid;
  grid-template-columns: auto auto auto auto auto auto;
  grid-gap: 10px;
  background-color: #2196F3;
  padding: 10px;
}

.grid-container > div {
  background-color: rgba(255, 255, 255, 0.8);
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
}

.item8 {
  grid-area: 2 / 1 / span 2 / span 3;
}
</style>
</head>
<body>

<h1>grid-area 属性</h1>

<p>使用<em>grid-area</em> 属性指定网格元素的位置。</p>

<p>语法格式:</p>
<p>grid-row-start / grid-column-start / span rowNum / span columnNum.</p>

<p>以下实例设置 "item8" 从第 2 行开始和第 1 列开始, 横跨 2 行 3 列。</p>

<div class="grid-container">
  <div class="item1">1</div>
  <div class="item2">2</div>
  <div class="item3">3</div>  
  <div class="item4">4</div>
  <div class="item5">5</div>
  <div class="item6">6</div>
  <div class="item7">7</div>
  <div class="item8">8</div>  
  <div class="item9">9</div>
  <div class="item10">10</div>
  <div class="item11">11</div>
  <div class="item12">12</div>
  <div class="item13">13</div>
  <div class="item14">14</div>
  <div class="item15">15</div>
</div>

</body>
</html>
  1. grid-auto-flow 属性

    用来设置容器属性,语法

    grid-auto-flow: row|column|dense|row dense|column dense;
    
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    <style>
    .grid-container {
      display: grid;
      grid-template-columns: auto auto auto;
      grid-template-rows: auto auto;
      grid-gap: 10px;
      background-color: #2196F3;
      padding: 10px;
    }
    
    .grid-container > div {
      background-color: rgba(255, 255, 255, 0.8);
      text-align: center;
      padding: 20px 0;
      font-size: 30px;
    }
    </style>
    </head>
    <body>
    
    <h1>grid-auto-flow 属性</h1>
    
    <p><em>grid-auto-flow</em> 属性指定自动布局算法怎样运作。</p>
    <p>以下网格布局有两行两列。</p>
    
    <h2>grid-auto-flow: column</h2>
    <p>逐列填充来排列元素:</p>
    <div class="grid-container" style="grid-auto-flow: column;">
      <div class="item1">1</div>
      <div class="item2">2</div>
      <div class="item3">3</div>
      <div class="item4">4</div>
    </div>
    
    <h2>grid-auto-flow: row</h2>
    <p>逐行填充来排列元素:</p>
    <div class="grid-container" style="grid-auto-flow: row;">
      <div class="item1">1</div>
      <div class="item2">2</div>
      <div class="item3">3</div>
      <div class="item4">4</div>
    </div>
    
    </body>
    </html>
    
    描述
    row默认值。 通过填充每一行来放置网格元素,在必要时增加新列。
    column通过填充每一列来放置网格元素,在必要时增加新列。
    dense该关键字指定自动布局算法使用一种"稠密"堆积算法,如果后面出现了稍小的元素,则会试图去填充网格中前面留下的空白。这样做会填上稍大元素留下的空白,但同时也可能导致原来出现的次序被打乱。
    row dense按行来填充网格中前面留下的空白
    column dense按列来填充网格中前面留下的空白

​ 其他列子:www.runoob.com/try/try.php…

  1. grid-column 属性

下面这个表示充第一网格线开始,到第五网格线结束。

 grid-column: 1 / 5;

语法

grid-column: grid-column-start / grid-column-end;

如果有跨越则在第二个数子前加span

  grid-column: 2 / span 3;
  1. grid-column-end 属性

    grid-column-end 属性定义了网格元素跨越多少列,或者在哪一列结束

语法

grid-column-end: auto|span n|column-line;
描述
auto默认值,网格元素跨越一列。
span n指定网格元素将跨越的列数。
column-line指定从哪个列上开始显示网格元素。从网格线开始,前面是空着的
  grid-column-end: 4; /* 前面空着*/
 grid-column-end: span 3; /*连着跨越*/
  1. grid-column-start 属性

grid-column-start 属性定义了网格元素从哪一列开始。

语法

grid-column-start: auto|span n|column-line;
描述
auto默认值,网格元素按流设置。
span n指定网格元素将跨越的列数。
column-line指定从哪个列上开始显示网格元素。
  1. grid-row 属性

grid-row 属性定义了网格元素行的开始和结束位置。

注意: grid-row 是 grid-row-start 和 grid-row-end 属性的简写属性。

我们可以参考行号来设置网格元素,也可以使用关键字 "span" 来定义元素将跨越的行数。

语法

grid-row: grid-row-start / grid-row-end;
  1. grid-template 属性

grid-template 属性用于网格布局,设置网格中行、列与分区。

grid-template 是以下属性的简写形式:

语法

grid-template: none|grid-template-rows / grid-template-columns|grid-template-areas|initial|inherit;
  1. grid-template-rows 属性

grid-template-rows 属性用于设置网格布局中的行数及高度。

这些值是一个以空格分隔的列表,其中每个值指定相应行的高度。

语法

grid-template-rows: none|auto|max-content|min-content|length|initial|inherit;
描述
none默认值,不指定行的大小。
auto行的大小由容器的大小和行中网格元素内容的大小决定。
max-content每行的大小设置为该行中最大网格元素的大小。
min-content每行的大小设置为该行中最小网格元素的大小。
length长度值,可以是 px 为单位的数值或百分比 %。 0 是默认值。 了解更多长度单位
initial将此属性设置为默认值。 阅读关于 initial
inherit从父元素继承该属性。 阅读关于 inherit
  1. 网格属性

    属性描述
    column-gap指定列之间的间隙
    gaprow-gapcolumn-gap 的简写属性
    gridgrid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 以及 grid-auto-flow 的简写属性
    grid-area指定网格元素的名称,或者也可以是 grid-row-start, grid-column-start, grid-row-end, 和 grid-column-end 的简写属性
    grid-auto-columns指的默认的列尺寸
    grid-auto-flow指定自动布局算法怎样运作,精确指定在网格中被自动布局的元素怎样排列。
    grid-auto-rows指的默认的行尺寸
    grid-columngrid-column-startgrid-column-end 的简写属性
    grid-column-end指定网格元素列的结束位置
    grid-column-gap指定网格元素的间距大小
    grid-column-start指定网格元素列的开始位置
    grid-gapgrid-row-gapgrid-column-gap 的简写属性
    grid-rowgrid-row-startgrid-row-end 的简写属性
    grid-row-end指定网格元素行的结束位置
    grid-row-gap指定网格元素的行间距
    grid-row-start指定网格元素行的开始位置
    grid-templategrid-template-rows, grid-template-columnsgrid-areas 的简写属性
    grid-template-areas指定如何显示行和列,使用命名的网格元素
    grid-template-columns指定列的大小,以及网格布局中设置列的数量
    grid-template-rows指定网格布局中行的大小
    row-gap指定两个行之间的间距
    延伸学习
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"> 
<title>网格布局</title>
<!--参考 https://blog.csdn.net/m0_71102594/article/details/124956160 -->
<style>
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /*表示重复三列*/
  grid-gap: 10px;  /*间距10px*/
  grid-auto-rows: minmax(100px, auto); /*最小高度是100,最大的自动*/
}
.one {
  grid-column: 1 / 3; /*表示列网格线第一个到第三个也就是跨两个区域*/
  grid-row: 1;/*表示第一行*/
 
}
.two {
  grid-column: 2 / 4;/*表示列网格线第二个到第四个也就是跨两个区域*/
  grid-row: 1 / 3; /*表示列行网格线到第三个线,跨两行*/
}
.three {
  grid-row: 2 / 5;/*表示行网格线第二个到第五个也就是跨三个区域*/
  grid-column: 1; /*表示第一个区域*/
}
.four {
  grid-column: 3;/*表示是第三列*/
  grid-row: 3;/*表示第三行*/
}
.five {
  /*grid-column: 2;表示第二列*/
  /*grid-row: 4;表示第四行*/
   /*可以替代上面分开写法*/
  grid-area:4/2/4/3;
}
.six {
  /* grid-column: 3;/*表示第三列*/
  /* grid-row: 4;表示第四行; */ 
  /*可以替代上面分开写法*/
  grid-area:4/3/4/4;
}
/**重合部分的背景颜色会加深**/
.wrapper>div {
    border: 2px solid rgb(233,171,88);
    border-radius: 5px;
    /* background-color: rgba(233,171,88,.5); */
    background: pink;
    opacity:0.5;
    padding: 1em;
    color: #d9480f;
}
</style>
</head>
<body>

<h1>网格布局</h1>

<div class="wrapper">
    <div class="one center" >One</div>
    <div class="two">Two</div>
    <div class="three">Three</div>
    <div class="four">Four</div>
    <div class="five">Five</div>
    <div class="six">Six</div>
  </div>

</body>
</html>

developer.mozilla.org/zh-CN/docs/…