【问题标题】:How Exactly Is The Containing Block Determined包含块是如何确定的
【发布时间】:2021-12-27 12:19:59
【问题描述】:

我仍然很难理解元素如何选择它们的包含块,相对于它们的相对值,例如height 被评估。

body {
  margin: 0;
}

.outer {
  min-height: 200px;
  background: red;
  overflow: hidden;
}

.inner {
  height: 100%;
  background: green;
}
<div class="outer">
  Hello,
  <div class="inner">world!</div>
</div>

这里的外部容器只有一个最小高度集,这显然不足以将自己断言为包含块,即使溢出隐藏。

我的理解是,不隐藏溢出,存在循环依赖,因为当子大于 200 px 时,父大小取决于子大小,但隐藏溢出,循环依赖应该消失。

更奇怪的是,当我将 body 设置为显示 flex 时,它又开始“工作”了。

body {
  display: flex;
  flex-direction: column;
  height: 100vh;
  margin: 0;
}
.outer {
  min-height: 200px;
  background: red;
  overflow: hidden;
}

.inner {
  height: 100%;
  background: green;
}
<div class="outer">
  Hello,
  <div class="inner">world!</div>
</div>

这背后的逻辑是什么?

【问题讨论】:

  • 这里的外部容器只有一个最小高度集,这显然不足以建立一个 BFC,即使溢出隐藏。 --> 是什么让你想到那里没有BFC吗?它确实创建了一个 BFC
  • 我认为您混淆了两个正交特征。 BFC和百分比高度之间没有关系
  • 对不起,是的,这是真的!我认为 BFC 是与百分比值相比的值。
  • 我将它从 BFC 更改为包含块,我希望这是正确的术语吗?

标签: css


【解决方案1】:

首先,两种情况下的包含块对于inner 是相同的,它是outeroverflow 在这里不起作用,flexbox 的用法也是如此。更多详情:https://www.w3.org/TR/CSS2/visudet.html#containing-block-details

现在,您需要了解有关百分比高度的技巧。一般规则是:“包含块需要有一个明确的高度”

指定百分比高度。该百分比是相对于生成框的包含块的高度计算的。如果包含块的高度没有明确指定(即,它取决于内容高度),并且该元素不是绝对定位的,则该值计算为“自动”。 ref

考虑到这一点,您可以假设您的百分比高度在这两种情况下都会失败,但情况已经发生变化,现在我们可以在某些特殊情况下解决百分比高度问题,即我们没有在包含块上定义任何明确的高度。

有时,百分比大小的盒子的包含块的大小取决于盒子本身的内在大小贡献,从而产生循环依赖。在计算这种盒子的固有尺寸贡献(包括任何基于内容的自动最小尺寸的计算)时,一个百分比值会根据与固有尺寸贡献(循环百分比尺寸)相同的轴上的尺寸进行解析: ref

如果你继续阅读,你会发现很多复杂的概念和定义不容易理解。我不会详细说明所有这些,但您的第二个案例就是其中之一。

为方便起见:Flexbox 强制某些尺寸明确允许解析高度百分比 (https://drafts.csswg.org/css-flexbox-1/#definite-sizes)。

还有更多与 flexbox 和 CSS 网格相关的案例:

Percentage 'min-height' works only when element has indirect parent with 'display: flex'

Why does `height: 100%` value 'work' for child tags of grid-items?

https://stackoverflow.com/a/52137966/8620333

【讨论】:

  • 非常感谢您的回答!你是对的,溢出隐藏在这种情况下没有任何区别。但是在某些情况下它会有所不同,例如here。如果没有隐藏溢出,图像将不会包含在标题上方剩余的空间中。
  • @fweth 那是另一个故事,你应该使用 min-height: 0;而不是溢出。您正面临最小高度默认约束,溢出是禁用它的一种方法 (stackoverflow.com/q/36247140/8620333)。而且它与包含块或百分比高度无关
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 2015-03-12
相关资源
最近更新 更多