您可能熟悉元素垂直塌陷的情况。如果一个元素只包含其他浮动元素,则父元素将塌陷为零高度。我们通常使用 清除修复 来解决这个问题。但如果一个元素不包含任何内容,它也会水平塌陷,这对于布局来说非常尴尬。
以下是一些用于三列布局的 HTML 示例。
<div class="grid grid-bad">
<div class="col col-1-3"></div>
<div class="col col-1-3"></div>
<div class="col col-1-3">
I'm the last column.
</div>
</div>
浮动仍然可能是目前处理列的最实用方法。我们可能使用 一个非常简单的网格系统,如下所示
.col {
float: left;
}
.col-1-3 {
width: 33.33%
}
如果您和我一样,您可能有一个像这样的心理模型

但您可能会感到惊讶。因为前两列是空的,没有任何其他东西来给它们提供任何高度,所以它们会水平塌陷。最后一列,因为它确实包含一些内容,将尊重它的宽度,但会出现在左侧,因为前面的两列已经塌陷了。

何时会发生这种情况
我最近在一个使用 Ajax 加载列内容的情况下遇到了这个问题。该列原本不包含任何内容,所以直到 Ajax 调用成功并将内容添加进来之前,它一直水平塌陷。当内容进来时,它将所有后面的列都向右移动。很尴尬。
查看 CodePen 上 Chris Coyier 创建的 gBCfl 演示 (@chriscoyier) CodePen
你可能永远不会遇到这种情况。也许你的列总是包含某种内容。那没什么大不了的。但是,如果你正在制作一个网格框架,即使是为你自己,你可能也应该考虑这种情况。
如何修复它
这些列需要某种东西来赋予它们至少 1 像素的高度。有了它,它们就不会水平塌陷。有时列有填充,这就可以了。如果一个列有顶部或底部填充,或者顶部或底部边框,你就没问题了。如果没有,你可以设置一个最小高度。
/* Any of these with positive lengths will work */
.col {
border-top: 1px solid white;
border-bottom: 1px solid white;
padding-top: 1rem;
padding-bottom: 1rem;
min-height: 1px;
}
所以是的,这种情况并不常见,但是如果你正在制作一个网格系统,你最好还是在里面添加一些东西来防止塌陷。
亲爱的 Chris 先生,
我非常喜欢您的网站,并期待您的新帖子。我遇到了一个问题,您能发布一篇像这篇文章一样的教程吗?3 个不同的 div
如果一个 div 根据内容有 180px 高度,第二个 div 有 210px 高度,第三个 div 根据内容有 399px 高度。这三个 div 都浮动到左侧,您能发布一篇关于如何让 div1 和 div2 自动像第三个 div 一样变成 100% 的文章吗?
抱歉我的英语不好,我对 CSS 还很陌生,所以希望你能明白我的意思。
期待您的回复
非常感谢 CSS-Tricks 团队
您可能想看看这里。 等高列
将您的列设置为
display: table-cell
,并将它们的父元素设置为display: table
也可以解决这个问题。不过它也有自己的问题。非常感谢!这些塌陷让我失眠了好几个晚上。
我以前使用 ,但这可能是一个更好的解决方案。
我喜欢 Nicolas Gallagher 方法
巧妙有趣!我不确定我完全理解那篇文章中示例的定位,但我认为我明白了大意。
我非常喜欢另一种技巧(实际上,我一直用它来制作网格),它不会出现水平列塌陷的问题: zen 网格.
我以前使用不间断空格来创建“虚拟内容”并避免空列的问题,但这个解决方案似乎更好。:-)
正如你所说,这不是一个常见的问题,但是如果出现类似问题,把它记在心里会很有用。感谢你的帖子,Chris。一如既往,你的内容真是太棒了。
那干脆就不要使用浮动?
.element { display: inline-block; width: 33.333%; }
使用内联块布局的问题是浏览器会在块之间添加空白,这会扰乱你的布局计算。
您好,
您可以通过多种方法解决这个问题: https://css-tricks.cn/fighting-the-space-between-inline-block-elements/ ;)
我想通知您,这个人(Muhammed Aslam)未经您的许可就从您的网站源代码中复制了您的网站设计,我认为。
他的网站 URL: http://aslamise.blogspot.com/
请检查一下……
我在这网站上有一门完整的课程,详细介绍了这个网站的设计和构建过程,所以这是可以理解的。
我知道这通常不被赞成,所以感谢你的提醒。
我会买它,因为它与本文的内容无关。
@Ahmed Shawan – https://css-tricks.cn/license/
先生,
我有一个无关的问题,如果你能回答,我会非常感谢
“如何仅使用 JavaScript 禁用一个超链接,其中 href 将保留在一个带有类的 div 标签中”
论坛 是一个很好的提问场所。我再次要将此主题埋掉,因为它与本文的内容无关。
不错。实际上,有一种布局方法叫做——伪绝对定位。它可以完美地解决这个问题,并且还可以让列的顺序与源代码的顺序不同。
非常感谢您提供此解决方案 :)
太棒了。我从来没有遇到过这种情况,但现在我已经做好了准备,如果它真的出现了。谢谢。
Chris 写得很好,这是一种很好的方法。感谢您发布此解决方案。
好技巧。您也可以通过将列放置在一个具有固定宽度的容器内来防止此问题吗?
不错的简单技巧。我过去一直通过设置宽度来解决这个问题。
从没想过使用填充或边框,但这是一个好主意。
我更喜欢使用 min-height 来防止折叠,因为您的列仍然会保持透明。
[class*=”col” ] { min-height:20px; }