【CSS in Depth 2 精译_032】5.4 Grid 网格布局的显式网格与隐式网格(上)

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

  • 第一章 层叠、优先级与继承(已完结)
    • 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 配合(下)
    • 5.3 两种替代语法(已完结)
      • 5.3.1 命名网格线
      • 5.3.2 命名网格区域
    • 5.4 显式网格与隐式网格 (上)✔️
      • 5.4.1 添加变化(中)
      • 5.4.2 让网格元素填满网格轨道(下)
    • 5.5 子网格

文章目录

    • 5.4 显式网格与隐式网格 Explicit and implicit grid

《CSS in Depth》新版封面

《CSS in Depth》新版封面

译者按
本小节篇幅较长且知识点密集,故分为上、中、下三部分进行发表,旨在拆分核心知识点并加深理解。本篇为上篇,介绍显式与隐式网格的核心概念;中篇即第 5.4.1 小节,主要介绍图片放大效果的实现;下篇即第 5.4.2 小节,主要是一些细节处理与相关注意事项。滚动更新中,敬请关注!

5.4 显式网格与隐式网格 Explicit and implicit grid

在某些场景下,您可能并不知道该把元素放在网格的哪个具体位置上。遇到网格元素特别多的情况,挨个去指定元素的确切位置未免太过麻烦;更有甚者,遇到页面元素是从数据库动态获取的话,其数量就更无法预判了。针对这些实际情况,改用一种宽松的方式去定义网格、再让布局算法去处理网格元素的定位问题,不失为一种更合理的变通方案。

这就需要用到 隐式网格(implicit grid。前面用形如 grid-template-* 的属性定义出的网格轨道,其实是 显式网格(explicit grid。但有些网格元素仍然可以放到显式轨道的外面,此时会自动创建隐式轨道,让扩展后的网格包含这些元素。

在如图 5.11 所示的网格中,显式轨道在两个方向上都只定义了一个。当把网格元素放在横竖第二个轨道上时(即 2 号和 3 号网格线之间),网格就会添加其他轨道将其包含在内。

图 5.11 若网格元素置于定义的显式网格轨道外,则会创建隐式轨道将该元素包含在内

图 5.11 若网格元素置于定义的显式网格轨道外,则会创建隐式轨道将该元素包含在内

隐式网格轨道的默认大小为 auto,即根据网格元素内容进行自动延展;若要对所有隐式网格手动设置大小,则需要指定网格容器上的 grid-auto-columnsgrid-auto-rows 属性(如 grid-auto-columns: 1fr)。

注意

引用网格线时,隐式网格轨道不会改变负数值的含义。负的网格线编号仍然是从显式网格的右下方开始的。

本节将实现一个新页面布局来演示隐式网格的用法。该页面是一个摄影作品墙,如图 5.12 所示。该布局需要对列设置网格轨道,而网格行则是隐式创建的。这样页面就不会关注图片的固定数量,从而适应任意数量的网格元素。只要照片需要换行显示,就会隐式地新增一行:

图 5.12 使用隐式网格行对一组照片进行网格布局

图 5.12 使用隐式网格行对一组照片进行网格布局

这个布局的独特之处在于,无论是换用 Flexbox 布局还是浮动布局,都很难实现同样的页面效果。这个示例充分体现了网格布局的强大。

要实现这样的布局效果,需要一个新页面。创建一个空白页面,然后关联到另一个新的空白样式表。根据代码清单 5.8 所示的 HTML 标记更新空白页:

代码清单 5.8 摄影作品墙的 HTML 标记

<!doctype html>
<head><link href="styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="portfolio"><figure class="featured"><!-- 每个<figure>都是一个网格元素 --><img src="images/monkey.jpg" alt="monkey" /><figcaption>Monkey</figcaption></figure><figure><!-- 图片和标题封装在<figure>元素内部 --><img src="images/eagle.jpg" alt="eagle" /><figcaption>Eagle</figcaption></figure><figure class="featured"><!-- 用样式类 featured 标记较大的图片 --><img src="images/bird.jpg" alt="bird" /><figcaption>Bird</figcaption></figure><figure><img src="images/bear.jpg" alt="bear" /><figcaption>Bear</figcaption></figure><figure class="featured"><!-- 用样式类 featured 标记较大的图片 --><img src="images/swan.jpg" alt="swan" /><figcaption>Swan</figcaption></figure><figure><img src="images/elephants.jpg" alt="elephants" /><figcaption>Elephants</figcaption></figure><figure><img src="images/owl.jpg" alt="owl" /><figcaption>Owl</figcaption></figure>
</div>
</body>
</html>

这段 HTML 标记包含一个类名为 portfolio 的元素(作网格容器),以及一系列 figure 元素(即网格元素)。每个 figure 又包含一张照片和一个标题。其中部分元素带有样式类 featured,表示该元素后续会放大展示。

接下来,我会分几个阶段来演示上述布局的实现过程。首先,创建网格轨道,让图片以基础网格布局的形式进行展示(如图 5.13 所示)。之后,考虑放大带 featured 样式类的图片,并添加一些样式细节来完成最终布局。

图 5.13 图片在基础网格中从左至右排布

图 5.13 图片在基础网格中从左至右排布

上述布局的样式代码如下代码清单 5.9 所示。该代码使用 grid-auto-rows 给所有的隐式网格行设置了 1fr 的大小,每一行都具有相同的高度。该布局还引入了两个新概念:auto-fillminmax() 函数,稍后会进一步介绍。先将这段代码更新到新建的样式表中:

代码清单 5.9 用了隐式网格行的网格样式

body {background-color: #709b90;font-family: Helvetica, Arial, sans-serif;
}.portfolio {display: grid;grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));  /* 将最小列宽设置为 200px 并自动填充网格 */grid-auto-rows: 1fr;  /* 将隐式水平网格轨道的大小设为 1fr */grid-gap: 1em;
}.portfolio > figure {margin: 0;  /* 覆盖掉浏览器默认的外边距样式 */
}.portfolio img {max-inline-size: 100%;
}.portfolio figcaption {padding: 0.3em 0.8em;background-color: rgb(0 0 0 / 0.5);  /* 半透明黑色 */color: #fff;text-align: right;
}

有时,网格轨道的尺寸不是固定的,但却要求限制在一个特定范围内。此时就要用到 minmax() 函数。它接受两个参数,分别是最小值和最大值。浏览器将确保网格轨道的尺寸介于两者之间。(如果最大尺寸小于最小尺寸,则忽略该最大尺寸)通过设置 minmax(200px, 1fr),所有网格轨道的宽度都至少为 200px

repeat() 函数中的关键字 auto-fill 是一个特殊的属性值。这样设置后,只要网格还装得下,浏览器就会在指定的范围内(即 minmax() 的值)尽可能多地生成网格轨道。

auto-fillminmax(200px, 1fr) 配合,则表示网格会在可用的空间内尽可能多地产生网格列,并确保所有的列宽均不少于 200px。由于任何轨道宽度都不能大于 1fr(即指定的最大值),因此所有网格轨道都是等宽的。

在如图 5.13 所示的页面中,浏览器视口可以容纳四个宽 200px 的列,因此一行有四个网格轨道。如果视口变宽,就能放下更多轨道;一旦收窄,产生的轨道数也会相应减少。

注意

如果设置了 auto-fill,而网格元素又不足以填满该行所有的网格轨道,就会出现一些空的网格轨道。如果不希望这样,可以换用关键字 auto-fitauto-fit 会让不为空的轨道延展开来,直到填满可用空间。有关这两个关键字的区别,请参阅:https://gridbyexample.com/examples/example37/

auto-fillauto-fit 究竟选谁,得看网格填充时的具体需求:是希望轨道尺寸固定但数量不固定(即 auto-fill),还是希望数量固定但尺寸不固定(即 auto-fit)。



关于《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 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148975.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【PGCCC】 复合索引和部分索引,竟然能让查询速度提升 275 倍!

索引对于加速数据库查询和提高 PostgreSQL 应用程序的性能至关重要。但是&#xff0c;并非所有索引都以相同的方式发挥作用。复合索引和部分索引是两种常见类型&#xff0c;每种类型都有不同的用途和对性能的影响。本文我们将深入探讨复合索引和部分索引是什么、它们如何运作以…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核&#xff0c;可能是版本问题&#xff0c;一直报错&#xff0c;无法成功编译。然后换成NXP官方Linux内核6.6版本&#xff0c;初始编译虽然也报各种错&#xff0c;但都是缺少库或相关工具&#xff0c;全部安装后就可以成功编译出镜像了&#…

运营商二要素接口如何用PHP实现调用

一、什么是手机二要素&#xff1f; 运营商二要素又称手机二要素&#xff0c;运营商二要素核验&#xff0c;手机二要素核验&#xff0c;即传入姓名、手机号码&#xff0c;校验此两项是否一致。实时核验&#xff0c;返回校验结果&#xff01; 二、手机二要素适用哪些场景&#…

【逐行注释】MATLAB的程序,对比EKF(扩展卡尔曼滤波)和PF(粒子滤波)的滤波效果,附下载链接

文章目录 总述部分源代码运行结果扩展性 总述 本代码使用 M A T L A B MATLAB MATLAB实现了扩展卡尔曼滤波&#xff08; E K F EKF EKF&#xff09;和粒子滤波&#xff08; P F PF PF&#xff09;在状态估计中的对比分析。 主要功能包括&#xff1a; 参数设置&#xff1a;初始…

【apt-file命令详解:Linux下的包管理利器】

文章目录 前言一、apt-file命令简介二、安装apt-file三、apt-file命令的基本用法四、高级技巧五、总结 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&#xff01;&#x1f60a; &a…

基于SSM的“银发在线教育云平台”的设计与实现(源码+数据库+文档)

基于SSM的“银发在线教育云平台”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 首页页面图 健身养生详情页面 在线课堂界面 …

Intellij IDEA 通过数据库表生成带注解的Java实体类(lombok版)

前言&#xff1a;因为今天在写实体类的时候&#xff0c;发现表中的字段太多&#xff0c;而且又要加注解怕写错漏写&#xff0c;现在市面上也有许多插件&#xff0c;但是有些达不到代码简洁&#xff0c;需要修改。后来还是选择了采用groovy写了一个脚本编写&#xff0c;本来idea…

gitlab使用小结

GitLab 是一个基于 Git 的代码托管平台&#xff0c;提供了丰富的功能来管理代码仓库、CI/CD、项目管理等。以下是一些常用的 GitLab 命令和示例&#xff0c;帮助你更好地使用 GitLab。 1、 克隆仓库 克隆一个远程仓库到本地&#xff1a; git clone gitgitlab.example.com:us…

深圳mes制造系统的主要功能

深圳MES系统的主要功能包括以下几个方面&#xff1a; 生产计划管理&#xff1a;MES系统可以帮助企业制定生产计划&#xff0c;包括订单管理、生产排程、生产任务分配等&#xff0c;实现生产资源的合理配置和生产计划的优化。 生产过程控制&#xff1a;MES系统可以监控生产过程中…

SpringBoot技术栈的网上超市开发实践

2 系统开发技术 这部分内容主要介绍本系统使用的技术&#xff0c;包括使用的工具&#xff0c;编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今&#xff0c;已经超过25年了&#xff0c;依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

局域网远程命令重启电脑

只要知道远程服务器的管理员密码和IP地址&#xff0c;在局域网中的任意一台机器上打开“命令提示符”窗口&#xff0c;运行以下命令&#xff1a; 1、获取远程服务器的管理员权限 net use IP地址 "管理员密码" /user:administrator 2、使用shutdown命令远程重启服务器…

32中的外部中断

一、理解中断 关于32的中断 中断就是给cpu一个信号&#xff0c;cpu收到这个对应的信号再进行指挥 最常用的就是按键 key1按下是咩意思key2呢这样 中断信号线CPU要和对应的元器件连接 二、中断代码 代码编写 所有的0脚对应中断寄存器0&#xff0c;以此类推 引脚为n …

Unity :单例模式 + MonoBehaviour 是什么体验?

单例模式 与 MonoBehaviour的冲突点 单例模式 MonoBehaviour 保持单例的快速解决方案 就是自己创建一个空对象&#xff0c;然后把脚本挂在上去就行了&#xff0c;之后你就别自己挂载该脚本就行了 一般写法 public class AgentMoNo : MonoBehaviour {private static AgentM…

Python编码系列—Python观察者模式:实现事件驱动架构的利器

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

ComfyUI新版本提升效率小技巧(建议收藏)

原文链接&#xff1a;建议收藏&#xff01;ComfyUI提升效率的小技巧&#xff0c;肯定有你不知道的 (chinaz.com) 本篇带来ComfyUI非常实用的9个小技巧&#xff0c;可以提升我们的ComfyUI工作效率&#xff0c;建议大家收藏起来哈 新版中文搜节点 点击设置 comfy→搜索框框架…

PHP判断微信或QQ访问

PHP判断微信或QQ访问 若是微信或者QQ打开&#xff0c;提示图会覆盖网页&#xff0c;但网页功能仍在运行&#xff01; <meta name"viewport" content"initial-scale1, maximum-scale1, user-scalableno, widthdevice-width"><style> .top-gui…

OpenCV目标检测(1)模板匹配函数matchTemplate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个模板与重叠的图像区域进行比较。 该函数在图像中滑动&#xff0c;使用指定的方法将大小为 w h w \times h wh的重叠块与模板 templ 进行…

基于python+django+vue的旅游景点数据分析系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

【Canvas与诗词】铁马冰河入梦来

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金红圈铁马冰河入梦来</title><style type"text/css&q…

【linux经典工具】strace-就十分钟你也能成为性能调优专家

strace 是什么 strace是一款功能强大的 Linux 进程监控和诊断工具。主要作用就是&#xff1a;用于调试程序、解决问题、拦截和记录系统调用以及跟踪正在运行的进程。它能输出了程序如何与系统交互的过程&#xff0c;尤其是在无法获取源代码的情况下&#xff08;那些开源工具、…