grid 基础

2023-05-25  本文已影响0人  进击的阿群

概述

基本概念

image.png
<!-- grid结构 -->
<div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
</div>

网格线编号

image.png

容器属性

grid属性分为容器属性、项目属性2种;

display属性

表现为grid盒子,项目的float、inline-block、table-cell、vertical-align等会实现

image.png

grid-template-columns,grid-template-rows 属性

划分行列,定义宽高

/* 定义3*3的网格,行高列宽均为100px */
.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
}

repeat()

repeat 函数的作用:

image.png
/* 3*3的网格 */
.container {
    display: grid;
    grid-template-columns: repeat(3, 33.33%);
    grid-template-rows: repeat(3, 33.33%);
}
/* 系列值:1/4列宽100px,2/5列宽20px,3/6列宽80px */
.container {
    display: grid;
    grid-template-columns: repeat(2, 100px 20px 80px); /* 注意第2个参数无逗号 */
}
/* 列宽100px,一行内尽可能多地填充列 */
.container {
    display: grid;
    grid-template-columns: repeat(auto-fill, 100px);
}
image.png

fr 关键字

表示行/列的比例关系,比如 1fr 2fr 标签后者是前者2倍

/* 第一列150px,后两列分配剩余空间,第2列是第3列的一半 */
.container {
    display: grid;
    grid-template-columns: 150px 1fr 2fr;
}

minmax()

限定取值范围,接受参数最小值,最大值:

/* 第3列宽度最小100px,最大1fr */
.container {
    display: grid;
    grid-template-columns: 1fr 1fr minmax(100px, 1fr);
}

auto 关键字

自动宽度,类似 flex: 1

/* 定义4行高度自动的行 */
.container {
    grid-template-rows: repeat(4, auto);
}

网格线名称

grid-template-columnsgrid-template-rows 里可以指定网格线名称,方便引用:

/* 3*3网格,行列分别有4根线,名称可以有多个,如下r4 last-row */
.container {
    display: grid;
    grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
    grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4 last-row];
}

简单实现传统布局

通过简单的代码就能实现传统的分栏布局:

/* 两栏布局 */
.container {
    display: grid;
    grid-template-columns: 70% 30%;
}
/* 12栏等比布局 */
.container {
    display: grid;
    grid-template-columns: repeat(12 1fr);
}

row-gap,column-gap,gap 属性

/* 合并写法 */
.container {
    gap: 20px 20px; /* 等价于20px,因为不写第2个值的话默认与第1个值相同 */
}
/* 单独设置 */
.container {
    row-gap: 20px;
    column-gap: 20px;
}
image.png

grid-template-areas 属性

/* 将3*3的网格分为header区域、main区域、sidebar区域、footer区域 */
.container {
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-template-areas: 'header header header'
                         'main main sidebar'
                         'footer footer footer';
}
/* 不想利用的单元格用 .号 标明 */
.container {
    grid-template-areas: 'a . c'
                         'd . f'
                         'g . i';
}

grid-auto-flow 属性

默认项目会按行填充每个网格,可以用 grid-auto-flow 改变填充顺序:

/* 先列后行填充 */
.container {
    grid-auto-flow: column;
}
image.png

默认是填充不满就换行,如果希望尽可能利用空间,则使用 row densecolumn dense

grid-auto-flow: row dense;
image.png

justify-items,align-items,place-items 属性

.container {
    justify-items: start | end | center | stretch;
    align-items: start | end | center | stretch;
}
image.png

justify-content,align-content,place-content 属性

.container {
    justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
    align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
image.png image.png image.png image.png

grid-auto-columns,grid-auto-rows 属性

/* 指定新增网格的行高50px */
.container {
    display: grid;
    grid-template-columns: repeat(3, 100px);
    grid-template-rows: repeat(3, 100px);
    grid-auto-rows: 50px;
}
image.png

grid-template,grid 属性

项目属性

grid-column-start,grid-column-end,grid-row-start,grid-row-end 属性

项目可以设置4个边框依附的网格线,来指定位置:

/* 指定轴线编号 */
.item-1 {
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 2;
    grid-row-end: 4;
}
/* 指定网格线名称 */
.item-2 {
    grid-column-start: header-start;
    grid-row-end: header-end;
}
image.png
/* span 关键字,可以用来指定左右边框横跨的网格数量 */
.item-1 {
    grid-column-start: span 2; /* 距离右边框2个网格 */
}
image.png image.png

grid-column,grid-row 属性

.item-1 {
    grid-column: 1 / 3;
    grid-row: 1 / 2;
}
/* 等价于 */
.item-1 {
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 1;
    grid-row-end: 2;
}
/* 等价的span写法 */
.item-1 {
    grid-column: 1 / span 2;
    grid-row: 1 / span 1;
}
/* 斜杠后省略的话,则默认跨越1个网格 */
.item-1 {
    grid-column: 1 / span 2;
    grid-row: 1;
}

grid-area 属性

指定项目放在哪个区域:

/* 指定区域名称 */
.item-1 {
    grid-area: e;
}
/* 也可以指定4个边框网格线:<row-start> / <column-start> / <row-end> / <column-end> */
.item-1 {
    grid-area: 2 / 2 / 3 / 3;
}
image.png

justify-self,align-self,place-self 属性

.item {
    justify-self: start | end | center | stretch;
    align-self: start | end | center | stretch;
}
image.png
上一篇 下一篇

猜你喜欢

热点阅读