一. display: grid
<span>foo</span>
<div class="box">
<div class="item"><p>1</p></div>
<div class="item"><p>2</p></div>
<div class="item"><p>3</p></div>
</div>
<span>bar</span>
指定一个容器(box)采用网格布局。容器的直接子元素(item)为项目
.box {
display: grid;
}
也可以使用grid的同时将元素设置为行内元素
.box {
display: inline-grid;
}
二. grid-template-columns、grid-template-rows
容器指定了网格布局以后,接着就要划分行和列。
grid-template-columns
属性定义每一列的列宽。
grid-template-rows
属性定义每一行的行高。
它的值以及详细用法如下:
<div class="box">
<div class="item">
<p>1</p>
</div>
<div class="item">
<p>2</p>
</div>
<div class="item">
<p>3</p>
</div>
<div class="item">
<p>4</p>
</div>
<div class="item">
<p>5</p>
</div>
<div class="item">
<p>6</p>
</div>
<div class="item">
<p>7</p>
</div>
<div class="item">
<p>8</p>
</div>
<div class="item">
<p>9</p>
</div>
<div class="item">
<p>10</p>
</div>
<div class="item">
<p>11</p>
</div>
<div class="item">
<p>12</p>
</div>
<div class="item">
<p>13</p>
</div>
<div class="item">
<p>14</p>
</div>
<div class="item">
<p>15</p>
</div>
<div class="item">
<p>16</p>
</div>
<div class="item">
<p>17</p>
</div>
<div class="item">
<p>18</p>
</div>
<div class="item">
<p>19</p>
</div>
<div class="item">
<p>20</p>
</div>
<div class="item">
<p>21</p>
</div>
<div class="item">
<p>22</p>
</div>
<div class="item">
<p>23</p>
</div>
<div class="item">
<p>24</p>
</div>
</div>
.box {
display: grid;
/* 绝对单位 */
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px;
/* 百分比 */
grid-template-columns: 33.333% 33.333% 33.333%;
grid-template-rows: 100px;
/* repeat(重复的次数, 重复的值) */
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(1, 100px);
/* repeat(重复的次数, 重复的模式) */
grid-template-columns: repeat(3, 100px 120px);
grid-template-rows: repeat(2, 50px 100px);
/* auto-fill 关键字, 自动填充, 实现N个相同的正方形填满容器 */
height: 500px;
grid-template-columns: repeat(auto-fill, 100px);
grid-template-rows: repeat(auto-fill, 100px);
/* fr 关键字, 比例关系, 实现双飞翼布局 */
grid-template-columns: 200px 1fr;
grid-template-rows: 100px;
/* minmax(最小值, 最大值) */
grid-template-columns: 1fr 1fr minmax(100px, 1fr);
grid-template-rows: 100px;
/* auto 关键字 表示由浏览器自己决定长度。圣杯布局 */
grid-template-columns: 100px auto 100px;
grid-template-rows: 100px;
/* 网格线的名称 */
/* 上面代码指定网格布局为3行 x 3列,因此有4根垂直网格线和4根水平网格线。*/
/* 方括号里面依次是这八根线的名字。网格布局允许同一根线有多个名字,比如[fifth-line row-5]。 */
grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4 列4];
grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
}
.box > .item:nth-of-type(1) {
background-color: aqua;
}
.box > .item:nth-of-type(2) {
background-color: salmon;
}
.box > .item:nth-of-type(6) {
background-color: brown;
}
.box > .item:nth-of-type(9) {
background-color: blueviolet;
}
.box > .item:nth-of-type(16) {
background-color:tomato;
}
.box > .item:nth-of-type(19) {
background-color:yellowgreen;
}
三. grid-gap
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
.box {
background-color: #daa520;
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
/* 列间距 */
/* grid-column-gap: 12px; */
/* 行间距 */
/* grid-row-gap: 12px; */
/* 简写 grid-gap: <grid-row-gap> <grid-column-gap>; */
/* 根据最新标准,上面三个属性名的grid-前缀已经删除 */
/* grid-column-gap和grid-row-gap写成column-gap和row-gap,grid-gap写成gap */
grid-gap: 12px 24px;
}
.box .item {
background-color: #ccc;
}
四. grid-template-areas
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
.box {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
/* grid-template-areas属性用于定义区域。 */
/* grid-template-areas: 'tl tc tr''cl cc cr''bl bc br'; */
/* 多个单元格合并成一个区域的写法如下。 */
/* grid-template-areas: 'a a a''b b b''c c c'; */
/* 如果某些区域不需要利用,则使用"点"(.)表示。*/
grid-template-areas: 'a . c''d . f''g . i';
}
.box .item {
background-color: #ccc;
}
五. grid-auto-flow
<div class="box">
<div class="item item-1">1</div>
<div class="item item-2">2</div>
<div class="item item-3">3</div>
<div class="item item-4">4</div>
<div class="item item-5">5</div>
<div class="item item-6">6</div>
<div class="item item-7">7</div>
<div class="item item-8">8</div>
<div class="item item-9">9</div>
</div>
.box {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
/* 划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。*/
/* 默认的放置顺序是"先行后列",即先填满第一行,再开始放入第二行 */
/* grid-auto-flow: row; */
/* 这个顺序由grid-auto-flow属性决定,默认值是row,即"先行后列"。也可以将它设成column,变成"先列后行"。 */
/* grid-auto-flow: column; */
/* 某些项目(item-1 item-2)指定位置以后,剩下的项目怎么自动放置 */
/* 现在修改设置,设为row dense,表示"先行后列",并且尽可能紧密填满,尽量不出现空格。 */
/* grid-auto-flow: row dense; */
/* 如果将设置改为column dense,表示"先列后行",并且尽量填满空格。 */
grid-template-columns: repeat(4, 100px);
grid-auto-flow: column dense;
}
.item {
font-size: 4em;
text-align: center;
border: 1px solid #e5e4e9;
}
.item-1 {
background-color: #ef342a;
grid-column-start: 1;
grid-column-end: 3;
}
.item-2 {
background-color: #f68f26;
grid-column-start: 1;
grid-column-end: 3;
}
.item-3 {
background-color: #4ba946;
}
.item-4 {
background-color: #0376c2;
}
.item-5 {
background-color: #c077af;
}
.item-6 {
background-color: #f8d29d;
}
.item-7 {
background-color: #b5a87f;
}
.item-8 {
background-color: #d0e4a9;
}
.item-9 {
background-color: #4dc7ec;
}
六. place-items
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
<!-- --------水平垂直居中--------- -->
<div class="aaa">
<div class="bbb"></div>
</div>
<!-- --------水平垂直居中--------- -->
.box {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
/* justify-items属性设置单元格内容的水平位置(左中右) */
/* align-items属性设置单元格内容的垂直位置(上中下)。 */
/* 可选值: start | end | center | stretch(默认) */
justify-items: center;
align-items: center;
/* place-items属性是align-items属性和justify-items属性的合并简写形式。 */
place-items: start end;
/* 如果省略第二个值,则浏览器认为与第一个值相等。 */
place-items: center;
}
.box .item {
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
background-color: #ccc;
}
/* 水平垂直居中 */
.aaa {
width: 100px;
height: 100px;
display: grid;
place-items: center;
background-color: #999;
}
.bbb {
width: 50px;
height: 50px;
background-color: bisque;
}
七. place-content
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
.box {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
/* justify-content属性是整个内容区域在容器里面的水平位置(左中右) */
/* align-content属性是整个内容区域的垂直位置(上中下) */
/* 可选值 start | end | center | stretch | space-around | space-between | space-evenly */
justify-content: center;
height: 500px;
background-color: beige;
align-content: center;
/* space-around - 每个项目两侧的间隔相等, 所以,项目之间的间隔比项目与容器边框的间隔大一倍。 */
justify-content: space-around;
/* space-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔。 */
justify-content: space-evenly;
/* place-content属性是align-content属性和justify-content属性的合并简写形式。 */
/* 如果省略第二个值,浏览器就会假定第二个值等于第一个值。 */
place-content: end;
}
.box .item {
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
background-color: #ccc;
}
八. grid-auto-columns、grid-auto-rows
<div class="box">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">11</div>
<div class="item">12</div>
<div class="item">13</div>
</div>
.box {
display: grid;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
/* 有时候,一些项目的指定位置,在现有网格的外部。*/
/* 比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。 */
/* grid-auto-columns属性和grid-auto-rows属性用来设置,浏览器自动创建的多余网格的列宽和行高 */
/* 剩余项目的grid-auto-columns、grid-auto-rows与grid-auto-flow有关 */
grid-auto-flow: column;
grid-auto-columns: 200px 100px 100px;/* grid-auto-flow: row;时失效 */
grid-auto-rows: 200px 100px 100px; /* grid-auto-flow: column;时失效 */
}
.box .item {
background-color: #ccc;
}