Web前端入门第 37 问:多图细说 CSS grid 网格布局(二)子元素相关属性
学习本文之前,建议先学习上一篇了解父元素的相关属性。
前文对 grid 网格布局中父元素容器相关的 CSS 属性做了详细介绍,本篇将继续学习子元素相关的 CSS 属性。
网格布局的一大波样式属性,父元素占据了大半江山,子元素嘛相对就少了一些~~
本文中的中的示例基础代码:
<div class="box">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
<div class="item">D</div>
</div>
<style>
.box {
margin: 20px 0;
width: 400px;
height: 280px;
border: 2px solid #ff4757;
display: grid;
}
.box .item {
border: 2px solid rgba(0,255,0,1);
}
</style>
子元素相关的 CSS 属性
grid-column-start 控制子元素列从哪根线开始。
grid-column-end 控制子元素列在哪条网格线结束。
grid-column 简写属性 grid-column-start 、 grid-column-end。
grid-row-start 控制子元素行从哪根线开始。
grid-row-end 控制子元素行在哪条网格线结束。
grid-row 简写属性 grid-row-start 、 grid-row-end。
grid-area 指定子元素属于哪个命名区域或简写位置。
justify-self 覆盖容器的 justify-items,控制单个子元素的行对齐。
align-self 覆盖容器的 align-items,控制单个子元素的列对齐。
order 调整子元素的显示顺序(类似 Flexbox)。
z-index 控制子元素的层叠顺序。
设置子元素列的开始位置和结束位置
grid-column-start 用于设置子元素列的开始位置,从哪条网格线开始
grid-column-end 用于设置子元素列的结束位置,在哪条网格线结束
以 grid-column-start 为例:
grid-column-start: auto; /* 默认值,自动分配 */
grid-column-start: 4; /* 从第 4 根线开始 */
grid-column-start: span 2; /* 定义跨两列 */
grid-column-start: some-grid-area; /* 从命名区域 some-grid-area 开始 */
grid-column-start: span some-grid-area; /* 未知的渲染方式 */
grid-column-start: span some-grid-area 3; /* 未知的渲染方式 */
使用数字和关键字 span 示例:
.box {
/* 设置网格五行五列 */
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(5, 1fr);
}
.box .item:nth-child(1) {
/* 第一个子元素从第 4 根线开始 */
grid-column-start: B;
}
.box .item:nth-child(2) {
/* 第二个子元素跨两列 */
grid-column-start: span 2;
}
注意看右侧网格线,由于第二个子元素要占用两列,网格放不下了,所以从第二行开始。显示效果:

使用命名区域设置子元素开始位置:
.box {
grid-template-areas:
"A1 A1 F2 G3 G3"
"A1 A1 F2 B4 B4"
"C5 C5 C5 C5 C5"
"D6 D6 D6 D6 D6"
"E7 E7 E7 E7 E7";
}
.box .item:nth-child(1) {
grid-column-start: F2; /* 从 F2 开始 */
}
.box .item:nth-child(2) {
grid-column-start: span G3; /* 无效 */
}
.box .item:nth-child(3) {
grid-column-start: span D6 4; /* 无效 */
}
重点:不知道是我姿势不对,还是 MDN 文档有问题, grid-column-start: span G3; 和 grid-column-start: span D6 4; 两种写法浏览器解析了,没报无效值,但是实际没啥效果~~头大....

不过 MDN 上找到这么一个例子:
.box {
grid-template-columns: repeat(6, [col1-start] 1fr [col2-start] 3fr);
}
.item:nth-child(1) {
grid-column: col1-start / col2-start 2;
}
.item:nth-child(2) {
grid-row: 2;
grid-column: col1-start 2 / span 2 col1-start;
}
实际使用是正常可以显示的,那么 grid-column-start: span D6 4; 这种写法应该是用于重复的命名行线,而不是命名区域。
同时设置列起始和结束位置:
grid-column-end 与 grid-column-start 写法一样。
使用数字比较好理解:
.box {
/* 设置网格五行五列 */
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(5, 1fr);
}
.box .item:nth-child(1) {
/* 从第 2 根线开始,结束在第 4 根线结束 */
grid-column-start: 2;
grid-column-end: 4;
}
.box .item:nth-child(2) {
/* 从第 2 根线开始,横跨四列 */
grid-column-start: 2;
grid-column-end: span 4;
}
显示效果:

使用命名区域设置时候又出幺蛾子了,感觉命名区域设置就不能带上 span 关键字~~
.box {
grid-template-areas:
"A1 A1 F2 G3 G4"
"A1 A1 F2 B4 B4"
"C5 C5 C5 C5 C5"
"D6 D6 D6 D6 D6"
"E7 E7 E7 E7 E7";
}
.box .item:nth-child(1) {
/* 从 F2 开始,在 G3 结束 */
grid-column-start: F2;
grid-column-end: G3;
}
.box .item:nth-child(2) {
/* 嘿~不好意思,无效,span 只能跟数字,其他值都无效,还会导致网格多一列 */
grid-column-start: F2;
grid-column-end: span G3;
}
.box .item:nth-child(3) {
/* 也不是说此方法无效,它在表格后面多绘制了 10 列,无语了.... */
grid-column-start: F2;
grid-column-end: span G3 10;
}
看效果:

grid-column-end: span G3 10; 这种写法你说他无效吧,它在网格后面多绘制了 10 列,你说有效吧,又没办法理解浏览器的绘制方式。
按照 MDN 的说法,还支持 grid-column-end: 10 G3 span; 这种写法,实际效果与上面一样,还是给网格多绘制了 10 列。
但如果使用 grid-template-columns: repeat(5, 1fr); 控制了网格列数,那么就不会多绘制那么多列了,但也无法理解他的绘制方式。
可能跟上面一样,用于重复的命名行线,而不是命名区域。
设置子元素行的开始位置和结束位置
grid-row-start 用于设置子元素行的开始位置,从哪条网格线开始
grid-row-end 用于设置子元素行的结束位置,在哪条网格线结束
设置行的两个属性与设置列的属性一样,使用 命名区域 有 span 关键字时设置行起始和结束位置还是会出幺蛾子,就不再一一演示。
看能理解的示例:
.box {
grid-template-areas:
"A1 A1 F2 G3 G4"
"A1 A1 F2 B4 B4"
"C5 C5 C5 C5 C5"
"D6 D6 D6 D6 D6"
"E7 E7 E7 E7 E7";
}
.box .item:nth-child(1) {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 3;
}
.box .item:nth-child(2) {
grid-column-start: 2;
grid-column-end: span 2;
grid-row-start: 2;
grid-row-end: span 2;
}
.box .item:nth-child(3) {
grid-column-start: F2;
grid-column-end: G3;
grid-row-start: G3;
grid-row-end: B4;
}
显示效果:

行列的简写属性
使用 grid-column 和 grid-row 可简写列和行的开始结束位置。毕竟一次写四个属性太麻烦了,只写两个就省了一半。
.box {
grid-template-areas:
"A1 A1 F2 G3 G4"
"A1 A1 F2 B4 B4"
"C5 C5 C5 C5 C5"
"D6 D6 D6 D6 D6"
"E7 E7 E7 E7 E7";
}
.box .item:nth-child(1) {
grid-column: 1 / 3;
grid-row: 1 / 3;
}
.box .item:nth-child(2) {
grid-column: 2 / span 2;
grid-row: 3 / span 2;
}
.box .item:nth-child(3) {
grid-column: span 3 / 2; /* 表示此单元格跨 3 列,在第二根网格线结束 */
grid-row: 3 / span 2; /* 表示此单元格行从第三根网格线开始,跨 2 行 */
}
.box .item:nth-child(4) {
grid-column: F2 / G3;
grid-row: G3 / B4;
}
显示效果:

设置位置时,可使用负数,表示倒数,比如:grid-column: -1 / span 2; 表示从倒数第一根网格线开始,跨 2 列。
使用命名行线
虽然个人觉得这种用法有点难理解,但浏览器是支持这种写法的,可以不用,但不能不会,对不~
.box {
grid-template:
[header-left] "head head" 30px [header-right]
[main-left] "nav main" 1fr [main-right]
[footer-left] "nav foot" 30px [footer-right]
/ 120px 1fr;
}
.box .item:nth-child(1) {
grid-row: header-left / footer-left;
}
显示效果:

使用 grid-area 插旗
前文介绍过 grid-template-areas 用于划分地盘,子元素就使用 grid-area 来插旗,指定子元素在哪块地盘。
看看经典的管理系统结构:
.box {
grid-template-areas:
"header header header"
"left main right"
"footer footer footer";
grid-template-columns: 10% 1fr 10%;
grid-template-rows: 30px 1fr 40px;
}
.box .item:nth-child(1) {
grid-area: header;
}
.box .item:nth-child(2) {
grid-area: left;
}
.box .item:nth-child(3) {
grid-area: main;
}
.box .item:nth-child(4) {
grid-area: right;
}
.box .item:nth-child(5) {
grid-area: footer;
}
显示效果:

覆盖父元素的对齐方式
justify-self 和 align-self 可用于覆盖父元素设置的对齐方式(justify-items / align-items)。某个子元素想要特立独行的时候,就可以派上用场了。
.box {
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
align-items: center;
justify-items: center;
}
.box .item {
width: 40px;
height: 40px;
}
.box .item:nth-child(2) {
align-self: flex-start;
}
.box .item:nth-child(3) {
justify-self: flex-end;
}
显示效果:

调整子元素顺序
接上例中的代码,直接添加 order 属性可调整子元素顺序。
排序规则:越小值则越靠前,默认值为 0。
.box .item:nth-child(1) {
order: 3; /* 第一个子元素排第三位 */
}
.box .item:nth-child(2) {
order: 2; /* 第二个子元素排第二位 */
}
.box .item:nth-child(3) {
order: 1; /* 第三个子元素排第一位 */
}
.box .item:nth-child(4) {
order: 4; /* 第四个子元素排第四位 */
}
.box .item:nth-child(5) {
order: 5; /* 第五个子元素排第五位 */
}
显示效果:

控制子元素的层叠顺序
当网格布局中两个子元素叠在一起显示时候,这会可拿出 z-index 属性控制子元素层叠顺序,想谁在上面谁就在上面。
规则:谁的 z-index 值大谁就在上面。
.box .item:nth-child(1) {
grid-column: 1 / span 2;
grid-row: 1 / span 2;
background-color: red;
}
.box .item:nth-child(2) {
grid-column: 2 / span 2;
grid-row: 1 / span 2;
background-color: yellow;
}
/* 控制第二个 box 中的第一个子元素在上面 */
.box:nth-child(2) .item:nth-child(1) {
z-index: 2;
}
以上代码由于 grid-row 值相同,所以两个子元素会叠在一起,然后使用 z-index 控制了第二个盒子的第一个子元素。
显示效果:

总结
网格布局这一壶终于喝完了,它包含的内容太多太广了,要熟练使用还需要多加练习才行,后续文章还会更新弹性盒子与网格布局的对比,以及它俩的应用场景,敬请期待。
2023 版本的 CSS 规范还提出了子网格 Subgrid 概念,如需了解更多请参阅后文中的参考资料链接。
参考资料:
https://developer.mozilla.org/en-US/docs/Web/CSS/grid
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout/Subgrid
Web前端入门第 37 问:多图细说 CSS grid 网格布局(二)子元素相关属性的更多相关文章
- Android零基础入门第32节:新推出的GridLayout网格布局
原文:Android零基础入门第32节:新推出的GridLayout网格布局 本期主要学习的是网格布局是Android 4.0新增的布局,和前面所学的TableLayout表格布局 有点类似,不过他有 ...
- Android零基础入门第37节:初识ListView
原文:Android零基础入门第37节:初识ListView 之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录.电话列表.信息列表等.那么从本节开始来详细学习列 ...
- Android零基础入门第71节:CardView简单实现卡片式布局
还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- Web前端开发最佳实践(9):CSS代码太太乱,重复代码太多?你需要精简CSS代码
前言 提高网站整体加载速度的一个重要手段就是提高代码文件的网络传输速度.之前提到过,所有的代码文件都应该是经过压缩了的,这可提高网络传输速度,提高性能.除了压缩代码之外,精简代码也是一种减小代码文件大 ...
- web前端开发常用的10个高端CSS UI开源框架
web前端开发常用的10个高端CSS UI开源框架 随着人们对体验的极致追求,web页面设计也面临着新的挑战,不仅需要更人性化的设计理念,还需要设计出更酷炫的页面.作为web前端开发人员,运用开源 ...
- Android零基础入门第30节:两分钟掌握FrameLayout帧布局
原文:Android零基础入门第30节:两分钟掌握FrameLayout帧布局 前面学习了线性布局.相对布局.表格布局,那么本期来学习第四种布局--FrameLayout帧布局. 一.认识FrameL ...
- web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】
http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...
- 《Web前端开发修炼之道》-读书笔记CSS部分
如何组织CSS-分层 应用 css 的能力分两部分:一部分是css的API,重点是如何用css控制页面内元素的样式:另一部分是css框架,重点是如何对 css 进行组织.如何组织 css 可以有多种角 ...
- Web前端开发基础 第一天(Html和CSS)
学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户 ...
随机推荐
- 创新突破!天翼云荣膺CCF HPC China 2024高性能计算创新大奖
近日,第20届CCF全国高性能计算学术年会(CCF HPC China 2024)在武汉隆重召开.CCF HPC China是全球高性能计算领域三大标志性盛会之一,本届大会以"华章廿载 新质 ...
- [SDOI2015] 序列统计 题解
乘法并不容易用 FFT 或 NTT 维护,考虑在模意义下化乘为加. 化乘为加主要有两种方法:\(\log\) 和 \(\gamma\)(指标),由于在取模意义下,所以使用后者. 那剩下的部分就是快速幂 ...
- Arduino LED流水灯·基础实验
Arduino初学IO控制,流水灯实验是很好的学习对象.分两个进程学习. 一.假流水灯,即基础效果实现 二.真流水灯,即采用PWM模拟真实流水渐变效果 我们设立5盏灯,正极分别连接数字口(Digita ...
- Log4j2 中三种常见 File 类 Appender 对比与选择
在 Log4j2 中,若不考虑 Rolling(支持滚动和压缩)类文件 Appender,则包含以下三种文件 Appender:FileAppender.RandomAccessFileAppende ...
- 『Python底层原理』--Python字典的实现机制
在Python中,字典(dict)是一种极为强大且常用的内置数据结构,它以键值对的形式存储数据,并提供了高效的查找.插入和删除操作. 接下来,我们将深入探究 Python 字典背后的实现机制,特别是其 ...
- go、thinkphp8、webman数据读取并发测试、性能测试
前期准备:本地搭建程序运行所需环境,分别编写go,thinkphp8和webman程序,确保程序运行正常,新建mysql的student表,模拟存储学生信息,共计3646条数据,分别使用go语言.th ...
- C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑层 案例
要在C#中搭建基于ISqlSugarClient的三层架构框架,你需要定义数据访问层(DAL).业务逻辑层(BLL)和表现层(UI).下面是一个完整的例子,涉及数据库仓储.业务逻辑层,以及依赖注入.这 ...
- netcore后台服务慎用BackgroundService
在 .NET Core 开发中,BackgroundService 是一个非常方便的后台任务运行方式,但它并不适用于所有场景. BackgroundService 一时爽,并发火葬场. Backgro ...
- 李沐动手学深度学习V2-chapter_linear-networks
李沐动手学深度学习V2 文章内容说明 本文主要是自己学习过程中的随手笔记,需要自取 课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=3 ...
- Fermat
[KPCTF 2024]ez_fermat from Crypto.Util.number import * p = getPrime(1024) q = getPrime(813) n = p * ...