Grid 项目属性篇 | 每天学一点Grid

211 阅读4分钟

Grid 项目属性篇 | 每天学一点Grid

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

Grid 项目属性

Grid 和 flex 类似,布局的属性都是分为两类,一类定义在容器上,称为容器属性,一类定义在项目上,称为项目属性

本文我们先来看一下Grid 给我们提供的项目属性, grid-column-[ start | end ]、grid-row-[ start | end ]、grid-column、grid-row、grid-area、justify-self、align-self、place-self 属性。

1. grid-column-[ start | end ]、grid-row-[ start | end ] 属性

这几个属性,我们在前面讲解 grid-auto-flow 时,已经见过了,表示指定项目的四个边框,分别定位在哪根网格线。

这里我们来回顾一下:

.wrapper {
    width: 450px;
    height: 450px;
    background: #f3f3f3;
    text-align: center;
    display: grid;
    grid-template-columns: 150px 150px 150px;
    grid-template-rows: 150px 150px 150px;
}

.item {
    text-align: center;
    border: 1px solid #fff;
    color: #fff;
    font-weight: bold;
    line-height: 150px;
}

/* 指定第一个项目的起始位置为网格线 1,结果位置为网格线 3*/
.item:first-of-type {
    background: #ef342a;
    grid-column-start: 1;
    grid-column-end: 3;
}

/* 指定第二个项目的起始位置为网格线 1,结果位置为网格线 3*/
.item:nth-of-type(2) {
    background: #00a0a0;
    grid-column-start: 1;
    grid-column-end: 3;
}

效果如下:

通过指定项目的 grid-column-[ start | end ]、grid-row-[ start | end ] 属性,我们可以很轻松的制作出下面的布局效果。

仅仅只需要几行代码即可:

.item:first-of-type {
    background: #ef342a;
    /* 设置第一个项目的四个边框 */
    grid-row-start: 2;
    grid-row-end: 4;
    grid-column-start: 1;
    grid-column-end: 3;
}

这四个属性的值,除了指定为第几个网格线,还可以指定为网格线的名字。

例如:

.wrapper {
    width: 450px;
    height: 450px;
    background: #f3f3f3;
    text-align: center;
    display: grid;
    grid-template-columns: [col1] 150px [col2] 150px [col3] 150px [col4];
    grid-template-rows: [row1] 150px [row2] 150px [row3] 150px [row4];
}
.item:first-of-type {
    background: #ef342a;
    grid-row-start: row2;
    grid-row-end: row4;
    grid-column-start: col1;
    grid-column-end: col3;
}

效果同上。

这四个属性的值还可以使用 span 关键字,表示“跨越”,即左右边框(上下边框)之间跨越多少个网格。

例如:

.item:first-of-type {
    background: #ef342a;
    grid-row-start: span 2;
    grid-column-start: span 2;
}

效果如下:

2. grid-column、grid-row 属性

grid-column 属性是 grid-column-start 和 grid-column-end 的合并简写形式,grid-row 属性是 grid-row-start 属性和 grid-row-end 的合并简写形式。

例如:

grid-row-start: 2;
grid-row-end: 4;
grid-column-start: 1;
grid-column-end: 3;

/* 可以简写为 */

grid-row: 2/4;
grid-column: 1/3;

这两个属性之中,也可以使用 span 关键字,表示跨越多少个网格。

grid-column: 1 / 3;
grid-row: 1 / 3;

/* 可以简写为 */

grid-column: 1 / span 2;
grid-row: 1 / span 2;

表示该项目所占据的区域,包括第一行、第二行以及第一列和第二列。

  1. grid-area 属性

grid-area 属性用于指定项目放在哪一个区域。

例如:

.wrapper {
    width: 450px;
    height: 450px;
    background: #f3f3f3;
    text-align: center;
    display: grid;
    grid-template-columns: 150px 150px 150px;
    grid-template-rows: 150px 150px 150px;
    grid-template-areas: 'a b c'
                         'd e f'
                         'g h i';
}
.item:first-of-type {
    background: #ef342a;
    grid-area: e;   /* 指定该项目所在的区域为 e */
}

效果如下:

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

语法如下:

.item {
  grid-area: <row-start> / <column-start> / <row-end> / <column-end>;
}

例如,上面的代码可以改写为:

.item:first-of-type {
    background: #ef342a;
    grid-area: 2 / 2 / 3 / 3;
}

效果同上。

4. justify-self、align-self、place-self 属性

justify-self 属性设置单元格内容的水平位置(左中右),跟 justify-items 属性的用法完全一致,但只作用于单个项目。

align-self 属性设置单元格内容的垂直位置(上中下),跟 align-items 属性的用法完全一致,也是只作用于单个项目。

语法如下:

.item {
    justify-self: start | end | center | stretch;
    align-self: start | end | center | stretch;
}

这两个属性都可以取下面 4 个值:

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

具体示例如下:

.wrapper {
    width: 450px;
    height: 450px;
    background: #f3f3f3;
    text-align: center;
    display: grid;
    grid-template-columns: 150px 150px 150px;
    grid-template-rows: 150px 150px 150px;
}


.item {
    text-align: center;
    border: 1px solid #fff;
    color: #fff;
    font-weight: bold;
    line-height: 150px;
}

.item:first-of-type {
    background: #ef342a;
    justify-self: center;  /* 和 justify-items 属性作用相同,只不过是设置单个项目的对齐方式 */
}

效果如下:

place-self 属性是 align-self 属性和 justify-self 属性的合并简写形式。

语法如下:

place-self: <align-self> <justify-self>;

例如: place-self: center center;

如果省略第二个值,place-self 属性会认为这两个值相等。