浮动元素撑不开父容器的根本原因是其脱离文档流,解决方法有clearfix(通过伪元素清除浮动,兼容性好)、overflow: hidden(触发BFC但会裁剪溢出内容)和display: flow-root(现代标准方案,无副作用但不支持IE)。
这是浮动最典型的副作用:父元素高度塌陷,看起来像“被子元素穿透了”。根本原因是浮动元素脱离了文档流,父容器计算高度时直接忽略它们。
解决思路不是“修复浮动”,而是让父容器重新感知浮动子元素的尺寸。常用方法就两个:clearfix 和 overflow: hidden,但它们原理和适用场景不同。
clearfix 是通过伪元素在父容器末尾插入一个清除浮动的块,不干扰布局逻辑,兼容性好(支持 IE6+)overflow: hidden 是靠触发 BFC(块级格式化上下文),让父容器把浮动子元素纳入自身布局范围,写法简单但有副作用clearfix
当你需要精确控制清除行为,或父容器本身已有溢出内容(比如横向滚动、下拉菜单、弹层)时,overflow: hidden 会意外裁剪内容,必须避开。
推荐使用标准 clearfix 类:
.clearfix::after {
content: "";
display: table;
clear: both;
}
class="clearfix",无需改结构display: block + clear: both 的旧写法,它在 IE6/7 下对 inline 元素无效display: flow-root(更语义、无副作用),但 IE 完全不支持overflow: hidden 的隐藏风险它确实能快速“撑开”父容器,但代价明显:
transform 或 position: fixed 时,可能破坏层级或定位基准overflow: hidden + touchmove 有兼容问题,导致滚动卡顿只建议用于明确知道子元素不会溢出、且不需要复杂交互的静态模块,比如纯图文卡片容器。
display: flow-root
这是 CSS Level 3 标准中专门用于解决浮动塌陷的属性,本质是创建一个 BFC,但比 overflow: hidden 干净得多:
.container {
display: 
flow-root;
}
position 或 transform
clearfix
实际项目中,先写 display: flow-root,再用 @supports 回退或直接搭配 clearfix 类更稳妥。