grid 基础

概述

  • grid布局是二维,flex是沿轴线的一维布局,grid更强大(强大在对于换行元素,能让他们对齐);

  • flex关注内容,不限制宽度,而grid关注布局,限制宽高再去塞内容,所以更适合二维布局,而非单行排列;

  • 由于是二维,所以html结构无需嵌套,拉平就行

基本概念

  • grid布局的元素盒子叫 容器,内部顶级子元素叫 项目

  • 容器内水平区域叫 ,垂直区域叫

  • 划分行与列的叫 网格线

  • 行列交叉区域叫 单元格 (网格);

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等会实现

  • display: grid;

  • display: inline-grid;

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 函数的作用:

  • 简化重复值;

  • 一系列值的模式;

  • auto-fill:不指定具体行/列数,尽可能多填充;

  • auto-fit:不指定具体行/列数,项目不够时会占满空网格,而 auto-fill 是尽可能多列,所以不会占满

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 属性

  • 旧标准是有 grid-前缀的,比如 grid-row-gap

  • 指定行/列间距,gap是他们的简写 <row-gap> <column-gap>

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

grid-template-areas 属性

  • 用来定义网格的区域,指定各个单元格从属的区域;

  • 不想划分进区域的单元格使用 . 标明;

  • 指定区域后,区域的行列始末位置网格线会自动命名 *-start/*-end,比如 header 区域,则起始的水平/垂直网格线名称是 header-start,结束是 header-end;【水平和垂直网格线可以同名吗?】

  • 反之亦然,如果指定*-start *-end 网格线,则会自动创建 * 区域;

/* 将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 属性

  • justify-items:设置单元格内容的水平位置

  • align-items:设置单元格内容的垂直位置

  • place-items: 二者简写形式,<align-items> <justify-items>(第2个值省略时默认与第1个值相同)

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

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

  • grid容器内部的网格不一定占满grid宽高,所以以上属性可以用来指定整个网格在容器中的位置。

  • 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 属性

  • 单元格可以指定在网格外,比如3*3网格,指定其中某单元格在第4行,浏览器会自动生成多余的网格;

  • 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-template:是 grid-template-columns grid-template-rows grid-template-areas 的简写;

  • grid:是 grid-template-rows grid-template-columns grid-template-areas grid-auto-rows grid-auto-columns grid-auto-flow 这6者的简写

项目属性

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

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

  • grid-column-start: 左边框的垂直网格线

  • grid-column-end:右边框的垂直网格线

  • grid-row-start:上边框的水平网格线

  • grid-row-end:下边框的水平网格线

  • 若发生项目重叠,则可以使用 z-index 指定叠放顺序

  • span 关键字的作用是忽略编号,仅关注宽高,位置按默认的来;优点是代码更简洁

/* 指定轴线编号 */
.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 属性

  • grid-column:grid-column-start 和 grid-column-end 的简写形式;

  • grid-row:grid-row-start 和 grid-row-end 的简写形式

.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 属性

  • 和容器的 justify-items 一样,设置内容对齐位置,只不过仅作用于项目本身;

  • place-self:<align-self> <justify-selft> 的简写形式,省略第2个值则默认两者相同

.item {
    justify-self: start | end | center | stretch;
    align-self: start | end | center | stretch;
}
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容