【CSS in Depth 2 精译_028】第五章 网格布局 + 5.1 构建基础网格

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局(已完结)
    • 4.1 Flexbox 布局原理
    • 4.2 弹性子元素的大小
    • 4.3 弹性布局的方向
    • 4.4 对齐、间距等细节处
    • 4.5 本章小结
  • 第五章 网格布局 ✔️
    • 5.1 构建基础网格 ✔️
    • 5.2 网格结构剖析
      • 5.2.1 网格线的编号
      • 5.2.2 网格与 Flexbox 配合

《CSS in Depth》新版封面

《CSS in Depth》新版封面

第五章 网格布局

本章概要

  • 使用网格构建页面布局
  • 理解网格布局选项
  • 使用网格线和具名网格区域放置子元素
  • 显式与隐式网格
  • 结合 Flexbox 和网格购买连贯的网页布局

上一章介绍的 Flexbox 彻底颠覆了传统的网页布局方式,但也只能算作 CSS 布局全貌的一部分。它还有一个大哥:一个被称作 网格布局模块(Grid Layout Module,即 grid 网格) 的新规范。这两个规范共同提供了一套功能齐全的布局引擎。

本章将重点演示网格布局的用法,先概括介绍网格布局的工作原理,然后结合几个示例带您感受一下网格布局所具备的能力。它既可以轻松拿捏基础网格的构建,也具备足够强悍的实力搞定各种复杂布局,但后者必须掌握额外的新属性和关键字。本章将步步为营详细介绍,助您攻克这些知识点。

CSS 网格先是定义了一个由不同的行与列所构成的二维布局,然后再将页面元素分别放置到对应的网格中。一些元素可能只占据一个网格单元,另一些元素则可能跨越多列或多行。网格的尺寸大小既可以精确定义,也可以根据自身内容自动计算。元素既可以选择精确放置到网格某个位置,又可以在网格内自动定位,自行填充划分好的区域。一套网格系统就足以构建出如图 5.1 所示的复杂布局。

图 5.1 基础网格布局中的盒子

图 5.1 基础网格布局中的盒子

5.1 构建基础网格

网格的用途极其广泛,本章将通过几个示例来展示其强大功能。先来构建一个最基础的网格布局,分三列布局如图 5.2 所示的六个方框。页面对应的 HTML 标记详见代码清单 5.1。

图 5.2 包含三列两行的简单网格效果图

图 5.2 包含三列两行的简单网格效果图

与上一章类似,新建一个页面并关联一个新的样式表,页面内容如下。在这段代码中,各方框分别从字母 af 进行编号,这样它们在网格中的位置就一目了然了。

代码清单 5.1 包含六个子元素的页面 HTML 标记

<div class="grid"><!-- 网格容器 -->
  <!-- 容器内的子元素变为网格元素 -->
  <div class="a">a</div>
  <div class="b">b</div>
  <div class="c">c</div>
  <div class="d">d</div>
  <div class="e">e</div>
  <div class="f">f</div>
</div>

跟 Flexbox 类似,网格布局也是作用在包含两个层级的 DOM 结构中。设置了 display: grid 的元素将成为一个 网格容器(grid container),其子元素则变为 网格元素(grid items)

接下来,要用一些新的属性来定义网格的具体细节。按照如下代码更新样式表:

代码清单 5.2 基础网格布局

.grid {
  display: grid;  /* 将元素设为网格容器 */
  grid-template-columns: 1fr 1fr 1fr;  /* 定义三个等宽列 */
  grid-template-rows: 1fr 1fr;  /* 定义两个等高行 */
  gap: 0.5em;  /* 设置各网格单元格之间的间距 */
}
 
.grid > * {
  background-color: darkgray;
  color: white;
  padding: 2em;
  border-radius: 0.5em;
}

该样式分三列渲染了六个大小相同的方框(如图 5.2 所示)。这当中有好几个新的知识点,下面将详细介绍。

首先,display: grid 定义了一个网格容器,使该容器呈现出块级元素的行为特征,100% 占满可用宽度。另外也可以使用 inline-grid(没写到示例中),这样元素就会在行内流动,且宽度只能够包裹子元素,但 inline-grid 用得并不多。

接下来是新属性:grid-template-columnsgrid-template-rows。这两个属性定义了网格每行每列的大小。本例使用了一种新单位 fr,代表每一列(或每一行)的 分数单位(fraction unit。这个单位的作用跟 Flexbox 中的 flex-grow 属性极为相似。声明 grid-template-columns: 1fr 1fr 1fr 则设置了三个大小相同的三个等宽列。

属性值不一定非得用分数单位 fr,像 pxem 或百分数这样的单位也可以使用;也可以混搭组合使用。例如,grid-template-columns: 300px 1fr 就定义了一个固定宽度为 300px 的首列,以及一个紧跟其后的第二列,后者会填满剩余的可用空间。此外,2fr 对应的列宽是 1fr 的两倍。

和 Flexbox 布局一样,gap 属性则定义了每个网格单元之间的间距。也可以用两个值分别指定垂直及水平方向的间距(例如:gap: 0.5em 1em)。

注意

网格规范首次定稿时,gap 属性曾被命名为 grid-gap,因此早期的一些网格案例用的是 grid-gap,其工作方式相同。后来添加了更为通用的 gap 属性,并同步更新了 Flexbox 予以支持。

可以试着改改这些属性值,看看它们会对最终布局产生什么影响。试试再加一列,或者改改宽度,又或者添加或删除网格元素……本章后续布局也会继续这样试验,这是掌握新东西最好的方法。



关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版第 2 版
读者评分原版:4.7(亚马逊);中文版:9.3(豆瓣)原版:5.0(亚马逊);中文版:暂无,待出版
出版时间原版:2018 年 3 月;中文版:2020 年 4 月原版:2024 年 7 月;中文版:暂无,待出版
原价原版:$44.99;中文版:¥139.00原版:$59.99;中文版:暂无,待出版
现价原版:$36.49;中文版:¥52.54 起步原版:$52.09;中文版:暂无,待出版
原版国内预订起步价 ¥461.00起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安冬的码畜日常

您的鼓励是我持续优质内容的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值