CSS 2.1 规范:不折叠父级边距的基本原理(当父级是浮动的或具有除可见之外的溢出时)

2023-12-02

The CSS 2.1 规范,第 8.3.1 节在折叠边距上指出:

建立新块格式化上下文的元素的边距(例如 因为浮动和带有“可见”以外的“溢出”的元素)不会 与他们流入的孩子一起崩溃。

我花了一段时间才意识到块格式化上下文是 由父母建立并应用于孩子的上下文, 因此,要产生任何区别,浮动或溢出属性具有 在父元素(而不是子元素)上进行调整。

在下面的代码片段中,相邻子div元素的边框高度 折叠,以便任意两个子 div 元素之间存在垂直间距 max(20px, 20px) = 20px 而不是 20px + 20px = 40px,以及边框高度 第一个子元素和父级 div 之间以及最后一个子元素之间 和父 div 也分别是 max(20px, 0px) = 20px 而不是 20px + 20px = 40px。 请注意,按照 CSS 2.1 规范,水平方向不会出现折叠。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
<style type="text/css">
* { margin: 0; border: 0; padding: 0; }
</style>
</head>
<body style="background: green;">
  <div id="wrapper" style="width: 400px; background: black;
                           /* overflow: hidden; *//* float: left; */">
    <div id="box1" style="margin: 20px; height: 100px; background: red;">
    </div>
    <div id="box2" style="margin: 20px; height: 100px; background: blue;">
    </div>
    <div id="box3" style="margin: 20px; height: 100px; background: red;">
    </div>
    <div id="box4" style="margin: 20px; height: 100px; background: blue;">
    </div>
  </div>
</body>
</html>

Case 1

如果红色 box1 元素的上边距没有与其父元素折叠,则这样的边距将 没有将黑色背景推到边距以下,而红色 box1 的边距会 叠加在父元素的黑色背景上。类似的论点也适用 到底部的蓝色 box1 元素。

现在,正如 CSS 2.1 规范提到的,如果“float: left;”中的任何一个或“溢出:隐藏;” 包含 div 的部分被注释掉,然后是父级的顶部和底部边框 元素(在本例中为 0)和第一个子元素的顶部边框(在本例中为 10px), 和底部子元素的底部(在本例中为 10px)边框是分开的,产生 结果如下图所示:

enter image description here

现在,问题来了:

将这条规则引入 CSS 的理由是什么?难道这只是一个偶然的决定 或者是受到一些真实的、实际的例子的启发? (知道这也会帮助我 记住规则,除了满足我的好奇心)。

Thanks.


我能给出的唯一合理的解释是块格式化上下文是原子的,从某种意义上说,一个块格式化上下文中的框可以never与另一个块格式化上下文中的框交互。折叠边距的这条规则似乎与浮动永远不会侵入其他块格式化上下文或将其自己的块格式化上下文退出到祖先块格式化上下文中的规则相同。

对此进行扩展:建立新块格式化上下文的框的流入后代参与该框的块格式化上下文,而框itself参与在布局树中较高位置建立的块格式化上下文。因此,框本身的边距预计会与同一块格式化上下文中的框折叠,但不会与后代框折叠。

第 9.4.1 节似乎支持这一点:

块格式化上下文中相邻块级框之间的垂直边距折叠。

请注意,它说“块格式化上下文中的相邻块级框”——这意味着边距不会跨块格式化上下文折叠,这是块格式化上下文的固有属性。但这只是我对规范的解释;我不是作者,所以我不能确定这是否是原意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS 2.1 规范:不折叠父级边距的基本原理(当父级是浮动的或具有除可见之外的溢出时) 的相关文章

  • 用左div填充剩余空间

    谁能告诉我如何让左侧 div 填充剩余空间 而不固定右侧 div 大小 我想要与以下示例完全相反的内容 left float left border 1px solid blue right overflow hidden border 1
  • Sass 部分导入

    我有 sass 编译的问题 当我有一个部分的项目时 partial scss并将其导入到多个部分文件中 因为它包含颜色变量 它将多次出现在编译的 css 中 这很丑陋 因为同一个规则会多次 推翻 自身 这使得调试信息 chromium 开发
  • 简单的 svg css 进度圈

    我正在尝试寻找一种方法来实现没有动画的简单进度圈 静态 我发现的示例具有非常不同的百分比偏移量 如下例所示 如何以这样的方式制作进度圈 如果我提供偏移量为 50 那么它恰好是 50 半填充 u absoluteCenter position
  • 仅在 Windows Chrome 上使用变换比例会导致文本模糊

    我遇到了一个关于 CSS 转换的非常令人沮丧的问题scale 我有一个文本块 我想在悬停时将其缩放 105 但它导致文本模糊 但仅限于 Windows 版本的 Chrome 我发现这个问题 https stackoverflow com q
  • Bootstrap 切换导航项在单击后保持打开状态

    我有简单的 Bootstrap 3 切换导航 ul class nav navmenu nav clearfix li class navmenu brand dropdown clearfix a href class dropdown
  • 修复了 div 背景重叠浏览器滚动条的问题

    我以前从未见过的非常奇怪的行为 我有一个固定位置的 div 它有一个透明的 png 背景图像 z index 设置为 1 以便内容可以使用滚动条在固定图像上滚动 我将其放置在底部和右侧 0px 处 但图像与滚动条重叠 无论如何 在 FF 和
  • 如何在一个元素上实现多个 CSS 过渡?

    这是一个非常简单的问题 但我找不到关于 CSS 转换属性的很好的文档 这是 CSS 片段 nav a text transform uppercase text decoration none color d3d3d3 line heigh
  • 如何将内容放在article.js之上/之上

    So I am trying to create a navigation and footer in the body of the website but the particle js keeps coming over those
  • 在引导折叠手风琴中显示部分文本

    我想替换一个允许用户使用 Bootstrap 折叠手风琴 阅读更多内容 的脚本 我的问题是 据我所知 手风琴要么打开 要么关闭 有谁知道在关闭模式下显示一些文本的选项 在我现在使用的脚本中 我可以通过更改文本区域的高度来使一些文本可见 但在
  • Sass 与 BEM,继承选择器

    我正在使用 Sass 3 4 1 和 BEM 所以我的 scss 是 photo of the day title font size 16px 我希望每次将鼠标悬停在 photo of the day标题发生了一些事情 这很常见 所以通常
  • Cocoa webview UserAgent“webkit-legacy”问题

    我解决了这个问题 请看下面所选的答案 我一直在努力寻找导致 OSX Cocoa 应用程序的 WebView 与 Safari 表现不同的原因 事实证明 用户代理是不同的 有点明显 并且我正在访问的网站不知道如何处理它 令人惊讶的是 它是ht
  • 如何在 Bootstrap v4 中实现导航栏下拉悬停?

    我对新的 bootstrap 版本有点困惑 因为他们将下拉菜单更改为 div
  • 如何使用 CSS 使表格中的分隔线/边框消失?

    我有一个简单的 HTML 表格 我希望分隔线 边框 消失 所需的最终结果是一个除了实际文本之外不可见的表格 我尝试将 border 属性设置为 0 但没有帮助 我应该使用什么正确的 CSS 属性 table tr td th border
  • Django base.html扩展为homepage.html,出现静态图像,但home.css不起作用

    Problem 正如标题所示 我正在构建一个 django 项目 base html 扩展为 homepage html 并且工作正常 出现静态图像 但 home css 在任何地方都不起作用 Update 我已经切换了base html
  • div 元素中的文本在 Firefox 中位于水平对齐的 span 元素之上

    我正在编写一个 Web 应用程序 其中支持票证显示为左侧的票证 ID 作为静态文本 其余字段 描述 严重性 持续时间 状态 报告者 在右侧显示为固定文本中的滚动文本 大小视口 我从一个 span 包含票证 ID 和视口 div 包含第二个
  • 为什么边框会增加元素的宽度?

    我有一个div如下 其指定宽度为 300px 边框宽度为 2px 为什么2px边框会导致宽度div是304px 如果我希望它有边框但宽度仍为 300 像素怎么办 test width 300px height auto border 2px
  • 有没有带有保存和语法突出显示功能的 HTML、CSS 在线文本编辑器?

    我想让 css 文件可以从任何地方 家庭 办公室等 访问并准备好编辑 并保存 我将进行手工编码 只想语法突出显示并保存在网络设施上 我尝试了谷歌文档 这很好 因为我可以在线保存 而且它也有修订历史记录功能 这很有用 但它没有语法突出显示 也
  • 图像映射区域周围不需要的边框

    我正在使用带有圆形区域的图像贴图 问题是我在 IE7 中的区域周围出现了不需要的边框 此边框不会出现在 FF 和 Chrome 中 也不会出现在 IE8 IE9 中 我尝试向图像添加 border 0 锚点的 css 属性 即 a bord
  • CSS 3 nth 类型仅限于类 [重复]

    这个问题在这里已经有答案了 有没有办法限制 CSS 3nth of type去上课 我有一个动态数量section具有不同类别的元素指定其布局需求 我想抓住三分之一 module 但似乎nth of type查找类元素类型 然后计算类型 相
  • CSS:结合纹理和颜色

    有人如何将用作背景图像的纹理和该纹理上方的背景颜色结合起来 这是纹理 我希望我的正文背景页面是这样的 我正在努力处理背景图像和背景颜色 http jsfiddle net 87K72 http jsfiddle net 87K72 body

随机推荐