一、什么是高度坍塌?
高度坍塌(Collapsing Margins)是指当父元素没有设置边框(border)、内边距(padding)、内容(content)或清除浮动时,其子元素的 margin 会"溢出"到父元素外面,导致父元素的高度计算不包含子元素的 margin,看起来像是父元素"坍塌"了。
二、高度坍塌的常见场景
1. 父子元素 margin 传递:
html
<div class="parent">
<div class="child"></div>
</div>
.parent {
background: #f00;
}
.child {
margin-top: 50px;
height: 100px;
width:200px;
background: #0f0;
}
效果:

此时父元素的背景只覆盖了子元素的 height 部分,margin-top 部分没有覆盖
2. 相邻元素的 margin 合并:
html
<div class="box1"></div>
<div class="box2"></div>
.box1 {
margin-bottom: 30px;
}
.box2 {
margin-top: 20px;
}
实际间距是 30px(取较大值),而不是 50px
三、解决高度坍塌的 7 种方法
1. 使用边框(border)或内边距(padding)
css
.parent {
border: 1px solid transparent; /* 透明边框 */
/* 或 */
padding: 1px; /* 最小内边距 */
}
2. 触发 BFC(块级格式化上下文)
css
.parent {
overflow: hidden; /* 最常用 */
/* 或 */
display: flow-root; /* 专门用于创建BFC */
/* 或 */
float: left/right;
/* 或 */
position: absolute/fixed;
/* 或 */
display: inline-block;
}
3. 使用伪元素清除浮动(clearfix)
css
.parent::after {
content: "";
display: table;
clear: both;
}
4. 使用 flex 或 grid 布局
css
.parent {
display: flex; /* 或 grid */
}
5. 给父元素设置最小高度
css
.parent {
min-height: 1px;
}
6. 使用隔离属性(isolation)
css
.parent {
isolation: isolate;
}
tip:实际应用建议
1. 现代布局:优先使用 flex 或 grid 布局,它们天然避免了许多传统布局问题
2. 通用解决方:`display: flow-root` 是最语义化的 BFC 创建方式
3. 兼容性考虑:如果需要支持旧浏览器,`overflow: hidden` 或 clearfix 方法更可靠