clear的本质是强制元素不在指定方向紧贴浮动元素外边缘,浏览器下移该元素直至其外边界与同侧浮动元素底部对齐或脱离浮动影响区,常表现为换行。

clear 为什么会让元素换行
clear 的本质不是“清除浮动”,而是**强制当前元素不在指定方向(left/right/both)上紧贴任何浮动元素的外边缘**。浏览器会不断下移该元素,直到其外边界(margin edge)与最近一个同侧浮动元素的底部对齐,或完全脱离所有浮动影响区域——这个过程常表现为“换行”或“下移一大截”。
clear: both 会破坏 inline-block 或 float 布局流
当多个 float: left 元素并排时,后续加 clear: both 的元素会直接掉到整行最下方,导致视觉断层。常见于导航栏、卡片列表后紧跟标题或分隔线:
.card { float: left; width: 200px; }
.title { clear: both; margin-top: 20px; }此时 .title 不再和前面的 .card 共享同一行布局上下文,它会寻找“能容纳自己的最小垂直位置”,结果就是跳过所有浮动内容,从它们的底部开始重新排布。
- 如果浮动元素高度不一致,
clear: both元素实际落点由最高那个浮动块决定 - 用
clear: left只避开左侧浮动,右侧仍有空间时可能不换行(但极少这么用) - 现代布局中,
clear已基本被display: flow-root或flex/grid容器替代
clear 对父容器高度的影响是间接的
很多人以为 clear 能“撑开”父容器,其实不然:clear 作用在子元素上,父容器是否包含浮动,取决于它自身是否形成 BFC。单独给子元素加 clear 并不会让父容器自动计算浮动子项的高度。
立即学习“前端免费学习笔记(深入)”;
- 父容器无 BFC(如默认
display: block),即使最后一个子元素有clear: both,父高仍可能塌陷 - 真正起作用的是让父容器自己触发 BFC,例如:
overflow: hidden、display: flow-root、float: left -
clear只是把某个子元素“推下去”,不改变父容器的尺寸计算逻辑
用 display: flow-root 替代 clear 更安全
如果你只是想让容器包含内部浮动,并避免额外换行干扰布局,display: flow-root 是更干净的选择——它创建 BFC,自动包含浮动子项,且不引入额外定位偏移:
.container {
display: flow-root; /* 替代老式 .clearfix + clear */
}
.container > div { float: left; }对比 clear,它不改变子元素位置,不触发重排跳跃,也不依赖伪元素 hack。唯一限制是 IE 不支持(需用 overflow: hidden 回退)。
真正难处理的,往往是混合了 float、inline-block 和 clear 的旧项目——这时候得先理清哪个元素本该承担“清除职责”,而不是到处加 clear: both 硬顶。










