本文已参与「新人创作礼」活动,一起开启掘金创作之路。 今天看开源项目的时候,发现一些很特别的样式。于是百度了一下。原来叫网格布局。这个在以往的项目里没有使用过,所以不知道。于是趁着现在好奇和兴趣学习了一下。边学变回想以到前遇到的一个问题,那是使用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;
}
}
}
这个奇怪的样式原来是实现了瀑布屏。效果
图一
图二
设置的属性是 display: grid;
-
设置列数量
下面这个是设置三列
grid-template-columns: auto auto auto;下面这个是设置六列
grid-template-columns: auto auto auto auto auto auto; -
设置行高属性
下面这个是设置第一行高度是100px,第二行高度是300px
grid-template-rows: 100px 300px; -
网格单位fr
下面这个同样是创建三列
grid-template-columns: 1fr 1fr 1fr; -
网格间距 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
-
网格线
从上往下数表示行的网格线用line1,line2,line3表示。
从左往右数表示列的网格线用line1,line2,line3表示。
网格线跨度位置
下面这个表示列的网格线 从第一条开始,到第三条结束。
grid-column-start: 1; grid-column-end: 3;下面这个表示行的网格线从第一条开始,到第五条结束。
grid-row-start: 1; grid-row-end: 5; -
grid 属性
下面这个是设置表示设置三列且第一行高度是160px
grid: 160px / auto auto auto;下面这个表示第一列宽度是20px ,第一行高度是150px
grid: 150px / 20px auto auto; -
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> -
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>
-
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…
- grid-column 属性
下面这个表示充第一网格线开始,到第五网格线结束。
grid-column: 1 / 5;
语法
grid-column: grid-column-start / grid-column-end;
如果有跨越则在第二个数子前加span
grid-column: 2 / span 3;
-
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; /*连着跨越*/
- grid-column-start 属性
grid-column-start 属性定义了网格元素从哪一列开始。
语法
grid-column-start: auto|span n|column-line;
| 值 | 描述 |
|---|---|
| auto | 默认值,网格元素按流设置。 |
| span n | 指定网格元素将跨越的列数。 |
| column-line | 指定从哪个列上开始显示网格元素。 |
- grid-row 属性
grid-row 属性定义了网格元素行的开始和结束位置。
注意: grid-row 是 grid-row-start 和 grid-row-end 属性的简写属性。
我们可以参考行号来设置网格元素,也可以使用关键字 "span" 来定义元素将跨越的行数。
语法
grid-row: grid-row-start / grid-row-end;
- grid-template 属性
grid-template 属性用于网格布局,设置网格中行、列与分区。
grid-template 是以下属性的简写形式:
语法
grid-template: none|grid-template-rows / grid-template-columns|grid-template-areas|initial|inherit;
- 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 |
-
网格属性
属性 描述 column-gap 指定列之间的间隙 gap row-gap 和 column-gap 的简写属性 grid grid-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-column grid-column-start 和 grid-column-end 的简写属性 grid-column-end 指定网格元素列的结束位置 grid-column-gap 指定网格元素的间距大小 grid-column-start 指定网格元素列的开始位置 grid-gap grid-row-gap 和 grid-column-gap 的简写属性 grid-row grid-row-start 和 grid-row-end 的简写属性 grid-row-end 指定网格元素行的结束位置 grid-row-gap 指定网格元素的行间距 grid-row-start 指定网格元素行的开始位置 grid-template grid-template-rows, grid-template-columns 和 grid-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>