【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

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

  • 【第十章 CSS 容器查询】 ✔️
    • 10.1 容器查询的一个简单示例
      • 10.1.1 容器尺寸查询的用法
    • 10.2 深入理解容器 ✔️
      • 10.2.1 容器的类型 ✔️
      • 10.2.2 容器的名称 ✔️
      • 10.2.3 容器与模块化 CSS ✔️
    • 10.3 与容器相关的单位
    • 10.4 容器样式查询的用法
    • 10.5 本章小结

文章目录

  • 10.2 深入理解容器 A closer look at containers
    • 10.2.1 容器的类型 Container types
      • 10.2.1.1 inline-size 容器类型 The inline-size container type
      • 10.2.1.2 size 容器类型 The size container type
    • 10.2.2 容器的名称 Container names
    • 10.2.3 容器与模块化 CSS(Containers and modular CSS)

《CSS in Depth》新版封面

《CSS in Depth》新版封面

译者按
本篇将深入探讨容器查询中的核心概念——容器。通过对容器的分类、命名及其在模块化 CSS 中的应用,帮助您打通容器查询的“任督二脉”。第一次接触容器查询时,我也有过作者提到的提问:如果容器查询真的可以实现,那怎么避免页面渲染出现死循环呢?真到实现它的时候,才发现还需要很多前提条件,比如引入 containment 的概念(MDN 译作【局限】,个人感觉稍欠准确,因此在文中给出术语原文)。相信学完本节,您一定会对 CSS 容器有更深刻的理解。

10.2 深入理解容器 A closer look at containers

上一节定义容器时,我们给容器指定了一个名称和对应的容器类型。本节我们将深入考察这些属性的行为模式,并了解它们的具体用途。虽然前面的示例并不难,但在使用容器时,也需要了解一些特定的限制;深入理解容器类型带来的影响尤为重要。

10.2.1 容器的类型 Container types

十多年来,浏览器厂商一直认为这个功能永远无法实现,主要是因为他们担心会产生无限循环。假设有这样一个场景,需要查询一个高度小于 300px 的容器;当符合查询条件时,其中一个元素的字号会放大至 2em,这反过来又将增加该元素的高度,从而撑大所在容器的高度,最终导致容器查询条件匹配失败——进而字号回落到原始大小,然后查询条件再次触发,循环往复,永无休止。

而在容器查询的设计过程中,决不允许出现这样的无限循环。为此,CSS 引入了 局限(containment 的概念。它为部分隔离 DOM 子节点和页面其余部分提供了一种有效途径。

在容器查询的上下文或语境中,这就意味着不能使用容器查询来改变被查容器的尺寸大小,并且该尺寸的设置也只能通过不依赖于其子元素的方式来予以明确。

该限制的具体表现取决于容器类型的具体取值。属性 container-type 的合法值有三个:normalinline-size 以及 size;其初始值为 normal,表示该元素并非查询容器,因此也无法对其进行容器查询。

注意

也可以通过 contain 属性(property)直接设置元素的局限。但这往往并不常用,因为指定 container-type 属性就能同步设置所需的局限。有关局限的更多设置,详见 MDN 在线文档 https://mng.bz/WEg4。

10.2.1.1 inline-size 容器类型 The inline-size container type

令容器类型的值为 inline-size,正如在之前的示例中演示的那样,可以仅凭行内尺寸(即元素宽度)来实现容器查询。设为 inline-size 的容器也无法使用基于高度的容器查询。在大多数实际应用中,inline-size 往往就是开发者需要的容器类型。容器的高度仍然会根据其内容的高度正常确定,您也可以根据可用空间的宽度调整样式,但容器中的任何内容都无法改变容器的行内尺寸。而这也正是 inline-size 起到的作用。

在常规文档流(normal document flow)中,块级元素的宽度将自动填满所有可用的空间。这就为容器查询提供了一个已知的宽度。在某些情况下,或许需要添加额外的样式声明来明确指定宽度,例如当容器为一个弹性元素时这一点尤为重要:务必确保弹性元素设置了 flex-basisflex-grow 属性的值,否则容器宽度将为零,导致后续容器查询无法进行。

10.2.1.2 size 容器类型 The size container type

container-type 的值为 size,则容器将在行内方向(inline direction)与块级方向(block direction)上实现全尺寸局限(full-size containment)。换句话说,浏览器将无法通过子元素来确定其容器的高度;相反,子元素会根据容器的高度进行查询。

容器类型指定为 size 后,容器的高度就需要以某种方式显式地定义,例如直接设置 heightmin-height 属性;或者通过容器外部的样式声明来定义其高度大小,比如网格布局或 Flexbox 布局;再或者,如果容器用到了绝对定位或固定定位,也可以利用 inset 属性来指定容器高度。而当上述方法都无法确定容器高度时,容器高度将为零,基于该高度的容器查询也将无法正常工作。

一般来说,在大多数情况下,容器类型都应该设为 inline-size。而当容器为网格布局或 Flexbox 的一部分、并且高度可以明确确定时,如果想针对高度做容器查询,则可以将容器类型设为 size。但大多数响应式设计都是基于行内尺寸实现的,因此通常也不需要这样设置。

10.2.2 容器的名称 Container names

指定容器名称后,就可以针对具体的容器实现容器查询。为此 CSS 提供了很大的自由度,既可以为某容器指定一个唯一的名称,同时也可以为多个容器复用相同的名称。

其中一个好的做法是使用一个通用名称,例如指定为 layout,并将其应用到页面上的大多数(或者所有)容器。在大多数情况下,它们多半就是您要查询的目标容器,因为您大概率希望模块能根据现有宽度做出响应。容器查询将沿 DOM 树向上查找,并选中指定名称的最近的祖先级容器(如图 10.4 所示)。

图 10.4 容器查询将选中所有匹配名称中距离最近的容器

【图 10.4 容器查询将选中所有匹配名称中距离最近的容器】

遇到需要不同容器的特殊情况时,也可以指定不同的名称,甚至可以对同一容器指定多个容器名称。例如 container: layout sidebar / inline-size 就将名称 layoutsidebar 同时指定给该容器,这样一来,带有这两个名称中任意一个的 @container 查询都将与该容器成功匹配。

容器查询还会绕过所有名称匹配失败的容器,如图 10.5 所示。通常情况下,我们要匹配的都是距离最近的容器;当需要对某个特定容器做出响应时,就可以使用此类技术。

图 10.5 容器查询忽略了名称匹配失败的容器

【图 10.5 容器查询忽略了名称匹配失败的容器】

为容器添加名称不是必需操作,您也可以利用 container-type: inline-size 来建立一个不带名称的容器,并在容器查询时省略名称(如 @container (min-width: 450px));此时浏览器将查找 DOM 树,直至找到第一个容器。

注意

使用简写属性 container 时必须指定容器名称。而定义一个不带名称的容器只能通过 container-type 属性实现。

虽然可以在容器查询中省略容器名称(例如写作 @container (width > 400px) 完全有效),但我还是强烈建议您养成为所有容器命名的习惯。对于不带名称的容器查询,浏览器会从当前元素开始,向上遍历 DOM 树中第一个匹配到的容器,无论该容器是否命名。

10.2.3 容器与模块化 CSS(Containers and modular CSS)

在为网站构建模块化 CSS 的过程中,开发人员应当采取某种策略来确保容器能以可预测的方式进行定义,以便后续对模块进行有效的查询。每当一个模块存在某个包裹元素、并且可能包含其他模块时,我更倾向于将该包裹元素视为容器。

例如在媒体模块中,media__body 用于装填内容,同时也可能包含其他模块。因此在这种情况下,我通常会将 media__body 定义为一个容器,这样就能对放置其中的任何内容作出适当响应。

根据如下代码清单 10.4 所示的示例代码,同步更新您的本地示例页面。该代码片段对容器进行了定义,同时还对媒体模块的正文部分(media body)设置了一个 flex-grow 属性值,以确保其具有确定的宽度。

代码清单 10.4 将媒体模块中的正文部分设置为容器

@layer modules {
  .media {
    padding: 1.5rem;
    background-color: #eee;
    border-radius: 5px;
  }

  .media__image {
    margin-inline: auto;
  }

  .media__body {
    container: layout / inline-size;
    flex-grow: 1;
  }
}

这样,该模块就可以放置后期可能需要嵌入其中的其他模块了,甚至可以在一个模块内嵌套多个媒体模块,它们会根据情况分别做出响应——尽管没有什么实用价值,但看到这些模块的实际效果也挺有意思的。采用这种方法时,还需要确保任何布局样式也能定义容器,就像对 .l-page 设置布局时那样(详见 10.1 小节代码清单 10.3)。

这种方法的另一个替代方案,是通过各自带有的容器来定义模块。例如,用 <div class="media-container"> 来包裹媒体模块,并指定 container-type: inline-size 来设计样式。但我不太喜欢给众多模块添加额外的 HTML 标记,因此这种方法用得也不多。

在使用模块时,容器查询的表现向来优于媒体查询。只要能在整个页面中始终如一地定义好容器,往往就能将它们用于所有模块。



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

目前已完结的章节(可进入本专栏查看详情,连载期间完全免费):

  • 第一章 层叠、优先级与继承(已完结)
    • 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.6 对齐相关的属性
    • 5.7 本章小结
  • 第六章 定位与堆叠上下文(已完结)
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下)
    • 6.4 堆叠上下文与 z-index
      • 6.4.1 理解渲染过程与堆叠顺序(上)
      • 6.4.2 用 z-index 控制堆叠顺序(上)
      • 6.4.3 深入理解堆叠上下文(下)
    • 6.5 粘性定位
    • 6.6 本章小结
  • 第七章 响应式设计(已完结)
    • 7.1 移动端优先设计原则(上篇)
      • 7.1.1 创建移动端菜单(下篇)
      • 7.1.2 给视口添加 meta 标签(下篇)
    • 7.2 媒体查询(上篇)
      • 7.2.1 深入理解媒体查询的类型(上篇)
      • 7.2.2 页面断点的添加(中篇)
      • 7.2.3 响应式列的添加(下篇)
    • 7.3 流式布局
    • 7.4 响应式图片
    • 7.5 本章小结
  • 第八章 层叠图层及其嵌套
    • 8.1 用 layer 图层来操控层叠规则(上篇)
      • 8.1.1 图层的定义(上篇)
      • 8.1.2 图层的顺序与优先级(下篇)
      • 8.1.3 revert-layer 关键字(下篇)
    • 8.2 层叠图层的推荐组织方案
    • 8.3 伪类 :is() 和 :where() 的用法
    • 8.4 CSS 嵌套的使用
      • 8.4.1 嵌套选择器的使用
      • 8.4.2 深入理解嵌套选择器
      • 8.4.3 媒体查询及其他 @规则 的嵌套
    • 8.5 本章小结
  • 第九章 CSS 的模块化与作用域
    • 9.1 模块的定义
      • 9.1.1 模块和全局样式
      • 9.1.2 一个简单的 CSS 模块
      • 9.1.3 模块的变体
      • 9.1.4 多元素模块
    • 9.2 将模块组合为更大的结构
      • 9.2.1 模块中多个职责的拆分
      • 9.2.2 模块的命名
    • 9.3 CSS 的作用域
      • 9.3.1 CSS 作用域的就近原则
      • 9.3.2 划定作用域的边界
      • 9.3.3 CSS 中的隐式作用域
      • 9.3.4 关于 CSS 作用域与层叠图层
    • 9.4 CSS 模式库
    • 9.5 本章小结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

macOS无法打开未验证安装包的解决方案:无法打开‘XXX.pkg’,因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件

macOS无法打开未验证安装包的解决方案&#xff1a;无法打开‘XXX.pkg’&#xff0c;因为无法验证其是否包含可能危害Mac安全或泄漏隐私的恶意软件 在macOS Ventura及以上版本中&#xff0c;系统安全性进一步加强&#xff0c;默认情况下不允许运行未验证或未签名的应用程序。当…

Springboot项目搭建(8)-用户登出与个人中心修改

1.提要信息 1.1 catch和then方法 then和catch是JavaScript中Promise对象的两个方法&#xff0c;用于处理异步操作的成功&#xff08;成功回调&#xff09;和失败&#xff08;失败回调&#xff09;情况。这两个方法通常与async/await语法一起使用&#xff0c;但也可以单独使用…

Android Studio 使用插件Database Navigation 连接 sqlite数据库

文章目录 Database Navigation 简介一&#xff0c;Database Navigation 下载二&#xff0c;将sqlite数据库文件存放到本地三&#xff0c;连接sqlite数据库四&#xff0c;使用SQL语句查看数据 Database Navigation 简介 Database Navigation 是一款在 Android Studio 开发环境中…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据&#xff0c;笔者在今年10月写了文章&#xff0c;怎么使用配置化实现kafka的装载&#xff1a;springboot kafka多数据源&#xff0c;通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中&#xff0c;kafka broker是加密的&#xff0c…

ansible使用说明

将安装包拷贝到主控端主机 在主控端主机安装ansible&#xff0c;sh setup.sh 确认安装成功后&#xff0c;编辑hosts文件&#xff08;按步骤逐个添加主机组&#xff0c;不要一开始全部配置好&#xff09; [site-init]下的主机列表为被控制的主机&#xff08;按照当前ai建模方案…

5G学习笔记之PRACH

即使是阴天&#xff0c;也要记得出门晒太阳哦 目录 1. 概述 2. PRACH Preamble 3. PRACH Preamble 类型 3.1 长前导码 3.2 短前导码 3.3 前导码格式与小区覆盖 4. PRACH时频资源 4.1 小区所有可用PRACH资源 4.2 SSB和RACH的关系 4.3 PRACH时频资源配置 1. 概述 随机接入…

单点登录深入详解之技术方案总结

技术方案之CAS认证 概述 CAS 是耶鲁大学的开源项目&#xff0c;宗旨是为 web 应用系统提供一种可靠的单点登录解决方案。 CAS 从安全性角度来考虑设计&#xff0c;用户在 CAS 输入用户名和密码之后通过ticket进行认证&#xff0c;能够有效防止密码泄露。 CAS 广泛使用于传统应…

不开流也可以知道文件大小(File类)file.length():long

但是文件的toString是这个东西&#xff0c;所以当你把一个文件对象转json&#xff0c;大概率只有paXXXXX” 这一个key&#xff0c;想要自动转成输出其他的文件大小或者文件名什么的&#xff0c;就自己封装file类&#xff0c;封装fiel的方法

数据结构 (16)特殊矩阵的压缩存储

前言 特殊矩阵的压缩存储是数据结构中的一个重要概念&#xff0c;它旨在通过找出特殊矩阵中值相同的矩阵元素的分布规律&#xff0c;把那些呈现规律性分布的、值相同的多个矩阵元素压缩存储到一个存储空间中&#xff0c;从而节省存储空间。 一、特殊矩阵的定义 特殊矩阵是指具有…

试题转excel;试题整理工具;试卷转excel;word转excel

一、问题描述 我父亲是一名教师&#xff0c;偶尔会需要将试卷转excel&#xff0c;方便管理处理一些特别重要的题目 于是&#xff0c;就抽空写一个专门将试题转excel的工具&#xff0c;便于各位教师从业者和教育行业的朋友更好的整理试题&#xff0c;减少一点重复枯燥的工作 …

CSP/信奥赛C++语法基础刷题训练(36):洛谷P11229:[CSP-J 2024] 小木棍

CSP/信奥赛C语法基础刷题训练&#xff08;36&#xff09;&#xff1a;洛谷P11229&#xff1a;[CSP-J 2024] 小木棍 题目描述 小 S 喜欢收集小木棍。在收集了 n n n 根长度相等的小木棍之后&#xff0c;他闲来无事&#xff0c;便用它们拼起了数字。用小木棍拼每种数字的方法如…

【NLP 4、数学基础】

此去经年&#xff0c;应是良辰美景虚设 —— 24.11.28 一、线性代数 1.标量和向量 ① 标量 Scalar 一个标量就是一个单独的数 ② 向量 Vector 一个向量是一列数 可以把向量看作空间中的点&#xff0c;每个元素是不同坐标轴上的坐标 向量中有几个数&#xff0c;就叫作几维…

IOC控制反转DI依赖注入(Java EE 学习笔记06)

1 IoC 控制反转 控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;是面向对象编程中的一个设计原则&#xff0c;用来降低程序代码之间的耦合度。在传统面向对象编程中&#xff0c;获取对象的方式是用new关键字主动创建一个对象&#xff0c;也就是说…

68 mysql 的 临键锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 一种锁, 行临键锁 虽然 在平时我们用到的不是很多, 我们这里 主要是 讲一下 它的主要的触发的场景 行临键锁 等价于 行锁 间隙锁, 行间隙锁是一个 左开右开的区间, 行临键锁 是一个左开右闭的区间 但是 它 和 行锁的差异…

(数据结构与算法)如何提高学习算法的效率?面试算法重点有哪些?面试需要哪些能力?

面试官眼中的求职者 通过对你算法的考察&#xff01;&#xff01;&#xff01;&#xff01; 缩进太多&#xff01;&#xff01;一般不要超过三层&#xff01;&#xff01;&#xff01;缩进越少&#xff0c;bug越少&#xff1b;逻辑比较复杂&#xff0c;把这些包装成为函数&…

设计模式-适配器模式-注册器模式

设计模式-适配器模式-注册器模式 适配器模式 如果开发一个搜索中台&#xff0c;需要适配或接入不同的数据源&#xff0c;可能提供的方法参数和平台调用的方法参数不一致&#xff0c;可以使用适配器模式 适配器模式通过封装对象将复杂的转换过程隐藏于幕后。 被封装的对象甚至…

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09;3.1 介绍&#xff1a…

Opencv+ROS实现摄像头读取处理画面信息

一、工具 ubuntu18.04 ROSopencv2 编译器&#xff1a;Visual Studio Code 二、原理 图像信息 ROS数据形式&#xff1a;sensor_msgs::Image OpenCV数据形式&#xff1a;cv:Mat 通过cv_bridge()函数进行ROS向opencv转换 cv_bridge是在ROS图像消息和OpenCV图像之间进行转…

【MySQL — 数据库基础】MySQL的安装与配置 & 数据库简单介绍

数据库基础 本节目标 掌握关系型数据库&#xff0c;数据库的作用掌握在Windows和Linux系统下安装MySQL数据库了解客户端工具的基本使用和SQL分类了解MySQL架构和存储引擎 1. 数据库的安装与配置 1.1 确认MYSQL版本 处理无法在 cmd 中使用 mysql 命令的情况&a…

shell编程基础笔记

目录 echo改字体颜色和字体背景颜色 bash基本功能&#xff1a; 运行方式&#xff1a;推荐使用第二种方法 变量类型 字符串处理&#xff1a; 条件判断&#xff1a;&#xff08;使用echo $?来判断条件结果&#xff0c;0为true&#xff0c;1为false&#xff09; 条件语句&a…