优先用 display: flow-root 解决浮动塌陷,比 clearfix 更可靠;clearfix 失效主因是 clear: both 仅作用于兄弟元素,伪元素需满足 content、display: table、clear 三条件。
直接用 display: flow-root,比 clearfix 更可靠、更少坑——除非你必须支持 IE11 或更老浏览器。
因为 clear 只作用于「自身所在的块级盒」,且只避开前面的浮动兄弟元素。父容器和它的浮动子元素是祖先/后代关系,不是兄弟关系。写 .parent { clear: both; },浏览器根本不会拿它去“清”子元素——父容器依然看不见浮动内容,高度还是 0。
真正起效的位置,必须是「浮动元素之后、同一父容器内」的一个块级节点。伪元素 ::after 就是模拟这个节点的干净方式。
漏掉任意一个,都可能在某些浏览器(尤其是旧版 IE 或特定渲染组合)中失效:
content: "":必须显式声明,否则伪元素不渲染,后续样式全白搭display: table:比 display: block 更稳妥;它天然触发 BFC,还能避免 IE7 下 margin 双倍问题clear: both:核心动作,强制该伪元素下移到所有浮动元素下方,从而把父容器底边拉下来标准写法就是:
.clearfix::after {content: "";
display: table;
clear: both;
}
.clearfix 类必须加在「直接包裹浮动子元素」的父容器上。套多一层(比如外层 wrapper)或少一层(比如加在 body 上),都不起作用。
需要加的典型场景:
<nav> 里用 float: left 排菜单项,但外层没背景色或边框显示不出来float: left,文字环绕,但下方段落被顶到左边去了容易翻车的点:
::after,得手动勾选 “Show user agent shadow DOM” 才能确认它是否渲染成功height 或 min-height,会覆盖 clearfix 带来的高度计算,先检查这些显式值.clearfix,外层加了不代表内层自动生效这是 W3C 明确定义的 BFC 触发方式,专为解决这类问题而生:
.container { display: flow-root; }
box-shadow、下拉菜单、position: absolute 弹层flex 或 grid 那样重置 float 行为)真正要留意的,不是伪元素怎么写,而是那个还在用 float 做布局的容器——它就在那儿,静静塌陷着,等你决定是修它,还是换掉它。