父元素高度塌陷本质是浮动子元素脱离文档流致父容器无法感知其存在;overflow: hidden 通过触发BFC使父容器重新包含浮动元素,但会裁剪溢出内容。
父元素高度塌陷,本质是浮动子元素脱离文档流后,父容器“看不见”它们了——解决的核心不是“压住浮动”,而是让父容器重新“感知”子元素的存在。
它通过触发 BFC(块级格式化上下文),强制父元素建立独立的布局区域,使浮动子元素被包含在内。这不是“清除浮动”,而是“绕过浮动问题”。
.parent { overflow: hidden; }
overflow: auto 可能意外加滚动条它不破坏结构、不干扰布局逻辑,真正意义上“在视觉末尾插入一个清除浮动的占位”,且完全不影响渲染样式。
.clearfix::after {
content: "";
display: table;
clear: both;
}
/ 兼容 IE6–7(已基本可忽略,但若需支持请加上) /
.clearfix {
*zoom: 1;
}
display: table 比 display: block 更稳妥,避免某些浏览器下 margin 折叠干扰content: "" —— 没有内容,伪元素不会生成,clear 就失效clear: both 是作用于“自身”,不是“清除子元素浮动”——它只对当前元素生效,让它落到所有浮动元素下方。
clear: both(它自己就是浮动的,clear 无效),并设 .clear { clear: both; height: 0; overflow: hidden
; }
clear: both,防止它被浮动内容顶上来这是 CSS Display Module Level 3 中明确为解决塌陷设计的值,语义清晰、行为确定,且无副作用。
.parent { display: flow-root; }
@supports (display: flow-root) { ... } 降级到 clearfix真正容易被忽略的点是:**塌陷和 margin 折叠常同时发生**。比如父容器没 border/padding,子元素的 margin-top 会“穿透”上去,看起来像塌陷加重了——这时单清浮动没用,得一起处理 BFC 或加 padding-top: 1px 打断折叠。