CSS学习笔记:grid布局
参考资料:https://www.bilibili.com/video/BV1Bk4y197xm
一、Grid布局简介
从某种程度上说,grid布局是flex布局的升级版,主要用于元素在平面上的布局,例如我当前博客皮肤主页上每个随笔卡片的排布:

bilibili首页上图片链接的排版:

可以看出,grid布局往往用于在平面上排列元素,而且可以达到不错的效果。
这也是grid布局和flex布局的主要差异,即:
- flex布局一般用于一个维度排布元素项(item),例如横向或纵向一个方向排布
- grid布局主要用于在整个平面上(二维)对元素项进行排布,例如单子商城的各个商品项,文章管理系统的各个文章,使用grid布局可以达到非常好的浏览效果。
二、Grid布局的一些概念
和flex布局类似,grid布局也涉及容器元素和子元素,我们可能需要在两种元素内都设置相应的css属性才能得到希望的结果。
grid布局中的基本概念如下图所示:

要启用grid布局,和flex布局一样,只需要修改容器元素的displaycss属性为grid即可,如:
.grid-container {
display: grid;
}
三、 容器元素属性
1. grid-template-*
1.1 网格行和列的设置
首先是grid-template-columns,它可以用于设置当前排列元素有多少列以及每列的宽度,例如设置:
.grid-container {
display: grid;
grid-template-columns: 100px 100px 100px;
...
}
这样设置代表排列元素为三列,每列的宽度为100px,效果如下:

同理,我们也可以设置排列元素的行数以及每一行的高度:
.grid-container {
...
grid-template-rows: 100px 100px 100px 100px;
}

调试工具下的效果:

1.2 repeat的使用
像刚才那样设置元素的行列可能会遇到一种麻烦的情况,例如如果列数有10列,那么我们则需要写10次列的宽度,此时我们就可以使用repeat写法进行简化,即:
.grid-container {
grid-template-columns: repeat(3, 100px); /* => 100px 100px 100px */
}
第一个参数是数量,第二个参数是大小。
此外,repeat里的第一个参数也可以设置为auto-fill,这样子元素就会根据父元素的宽度大小进行自适应排列了,例如:
- 容器宽度为600px

- 容器宽度为400px

1.3 使用fr
fr可以方便地表示比例关系,和flex布局中给子元素设置flex属性表示自己的占比类似。
例如在这里希望容器分成三列,并且每列等分容器的宽度,那么我们可以这样写:
.grid-container {
grid-template-columns: repeat(3, 1fr);
}
这代表着每行的每个元素都占据一份的剩余空间,因此可以实现三等分的效果:

我们也可以自定义比例,例如:
.grid-container {
grid-template-columns: 1fr 2fr 3fr;
}

可以看出,各列的宽度变成了1:2:3。
1.4 auto关键字
例子如下:
.grid-container {
grid-template-columns: 100px auto 100px;
}
此时代表左右两列各占用100px宽度,而中间则自动填充满,这样既是我们前面使用flex布局所得到的三栏布局:

2. row-gap, column-gap
显而易见,这两个属性都是用于设置子元素之间间距的大小的
- row-gap设置行间距
- column-gap设置列间距
例如设置行间距:
.grid-container {
...
row-gap: 20px;
}

列间距是类似的,这里不赘述了。
此外还可以直接使用gap来简化两个间距的设置:
.grid-container {
...
gap: 20px;
}

3. grid-auto-flow
这个属性主要用于设置元素是以行优先还是列优先进行排列的,默认为行优先,因此我们进行这样的修改:
.grid-container {
grid-auto-flow: column;
}
效果如下:

dense关键字
例如一些这种情况:

这里1号和2号元素的宽度都比较大,2号元素无法放在1号元素的右边,因此1号元素右边就出现了一个空位,而此时我们希望3号元素能够向上占据这个空位进行紧密的排列,此时我们就可以在grid-auto-flow属性后添加dense关键字:
.grid-container {
grid-auto-flow: row dense;
}

可以看到,此时完成了我们紧密排列的需求。
4. items对齐
4.1 justify-items
这个属性用于设置子元素元素在网格内的水平方向上的对齐。

这个属性即用于设置子元素在规定的网格中是以什么样的方式进行对齐的,具体效果如上图所示,其默认值为stretch(拉伸),这也就是为什么我们看到子元素占满了各自的网格。
4.2 align-items
同理,这个属性用于设置子元素元素在网格内的垂直方向上的对齐,这里不展开了。
4.3 place-items
这个属性是上面两个属性的简写,即:
.grid-container {
place-items: center center; /* => justify-items:center; align-items: center; */
}
5. content对齐

这里的“整个内容区域”指的是前面红色概念图中的红色方框区域,并不是值整个容器,例如原来的例子中的content为下图绿色边框包围的最外围区域:

因此,这个属性是用于设置content关于整个容器的对齐关系的。
因而我们可以设置整个部分垂直居中和水平居中:
.grid-container {
...
justify-content: center;
align-content: center;
}

其他的对齐方式和flex中展现的类似,在此不再赘述。
6. grid-auto-columns/grid-auto-rows
这两个属性分别用于设置多出来的项目的宽和高:

7. 定义区域
使用方式如下案例所示:
.grid-container {
grid-template-areas:
'a b b'
'a c d'
'a e f';
}
这里区域的命名可以是任意的英文单词,上面代码所对应的实际区域为:

这里只是定义区域,在子元素属性上进行相应的设置可以使该子元素占据某个区域。
四、item(子元素)属性
1. grid-column,grid-row

简写:
.item {
grid-column: 1 / 3;
/*
=> grid-column-start: 1;
grid-column-end: 3;
*/
}
另一种写法:使用span
.item {
grid-column-start: span 2;
}
代码的效果和上面相同。
2. grid-area
如上所述,使用这个属性可以使某个子元素占据在容器元素属性中定义的区域:
.item-1 {
grid-area: a;
}

可以看到,1号元素占据了a区域。
此外,grid-area还可以用于简写上面的item位置设置:

3. 定义单个子元素在网格的对齐方式

CSS学习笔记:grid布局的更多相关文章
- CSS 学习笔记 - Flex 布局
传统布局方式的局限性 传统的网页布局方式,采用 display + position + float 的方式来实现.这种方式,无法实现一些复杂的布局,并且在实现某些布局时,会有一些局限性. 比如,最常 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- css学习笔记四
广州天气变冷了,css学习笔记还是要总结. 总结: 1:几米页面静态页面主要是一列结构头部banner图,mainbody部分放文字内容和图书图片,底部是页面的版权信息 2:腾讯软件中心静态页面制作( ...
- CSS学习笔记10 相对定位,绝对定位与固定定位
文档流中的元素的位置由元素在 (X)HTML 中的位置决定,这就是最原始的普通流,前面讲到的浮动CSS学习笔记08 浮动可以改变元素在文档流中的位置,除了这个我们还可以通过使用CSS的position ...
- CSS学习笔记08 浮动
从CSS学习笔记05 display属性一文中,我们知道div是块元素,会独占一行,即使div的宽度很小,像下面这样 应用display属性的inline属性可以让div与div共享一行,除了这种方法 ...
- CSS学习笔记09 简单理解BFC
引子 在讲BFC之前,先来看看一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- 图文详解前端CSS中的Grid布局,你真的可以5分钟掌握
前言 网站的布局是一个网站设计的根本,CSS的Grid布局已经成为了未来网站布局的基本方式. 今天这篇文章我们通过图文,一起看看如何自己实现Grid布局方式. CSS 第一个Grid布局 首先我们看看 ...
- 2022-07-10 第五小组 pan小堂 css学习笔记
css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...
- HTML+CSS学习笔记 (7) - CSS样式基本知识
HTML+CSS学习笔记 (7) - CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌 ...
- HTML+CSS学习笔记 (6) - 开始学习CSS
HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...
随机推荐
- struct结构体大小的计算(内存对齐)
本次实验环境 环境1:Win10, QT 5.12 一. 背景 当普通的类型无法满足我们的需求的时候,就需要用到结构体了.结构体可衍生出结构体数组,结构体还可以嵌套结构体,这下子数据类型就丰富多彩了, ...
- openGauss X ShardingSphere,分布式方案的另一种最佳实践
Apache ShardingSphere 持续助力于 openGauss 分布式数据库能力的构建.openGauss 数据库自 2020 年 6 月开源以来,受到了业界的广泛关注,现已吸引众多伙伴. ...
- appium操作安卓应用所需要的数据准备
操作系统.系统版本如下所示: desired_caps={} desired_caps["platformName"]="Android" desired_ca ...
- (课内)信安数基RSA-level3-5
emmmm感觉其实自己对这个的理解完全不够,原理只能写出这么个东西(悲) 代码完全是 攻击方式中(1)(2)内容的实现. lambda是一种可以理解为匿名函数的写法:写在这里看起来很酷炫(bushi) ...
- F1西班牙大奖赛-加泰罗尼亚赛道地图及简介
背景 银石双赛结束,第二轮三连赛的最后一场将转战西班牙,第50届F1西班牙大奖赛将于本周末(正赛2020-08-15)在加泰罗尼亚赛道上演. 作为近年来F1承办季前测试的赛道,所有人都对这里再熟悉不过 ...
- Go语言核心36讲(Go语言进阶技术七)--学习笔记
13 | 结构体及其方法的使用法门 我们都知道,结构体类型表示的是实实在在的数据结构.一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型. 前导内容:结构体类型基础知识 当然了,结 ...
- 解决git clone慢问题
解决git clone慢 关于Git克隆或是上传代码龟速的问题真是让人很恼火,这里对于网上的两种解决方案进行摘录. 利用码云克隆github项目 亲测有效 进入码云,新建一个仓库: 在创建的最后选择导 ...
- 洛谷 P5665 [CSP-S2019] 划分
链接: P5665 题意: 给出 \(n\) 个整数 \(a_i\) ,你需要找到一些分界点 \(1 \leq k_1 \lt k_2 \lt \cdots \lt k_p \lt n\),使得 \( ...
- Java并发:ReadWriteLock 读写锁
读写锁在同一时刻可以允许多个线程访问,但是在写线程访问,所有的读线程和其他写线程均被阻塞. 读写锁不像 ReentrantLock 那些排它锁只允许在同一时刻只允许一个线程进行访问,读写锁可以允许多个 ...
- Spring源码解读(二):Spring AOP
一.AOP介绍 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP).OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面.方面实现了诸如跨越多种类型和对象的事务 ...