前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库clear both 清除浮动原理
CSS盒模型与排版

clear both 到底做了什么,它是怎么避开左右两边浮动的?

clear: both 作用在设置它的元素自己身上:浏览器会在它上方加一段叫 clearance 的空隙,把它推到前面所有左浮动和右浮动的下面。浮动本身还在原处,一点没变。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#盒模型与排版
先看核心答案读代码示例
理解线索

`clear` 的三个取值怎么选

  1. clear: left上边框移到前面所有左浮动的底部之下
  2. clear: right上边框移到前面所有右浮动的底部之下
  3. clear: both取左右两边浮动里更低的那个,移到它下面

clear 只对块级元素生效,写在 span 这种行内元素上没有效果。clearfix 用 ::after 时要写 display: block 或 table,就是这个原因。

核心回答

先记住这个答案

clear 的意思是「我这个元素的旁边不允许有浮动」。浏览器的做法是在这个元素上方插入一段空隙,规范里叫 clearance,让它的上边框刚好落在前面浮动元素的下外边缘之下。both 就是左浮动和右浮动都要避开,实际效果是移到两侧里更低的那个下面。整个过程只移动设置了 clear 的元素,浮动元素的位置不变。它也只看源码中排在它前面、并且处于同一个块格式化上下文里的浮动。

  • clear 移动的是自己,不是浮动元素
  • both 等于同时避开左浮动和右浮动
  • 只看源码里在它前面、同一个 BFC 里的浮动
  • 被清除的元素 margin-top 常常像是失效了

左右两个不一样高的浮动

最常见的场景是左右两栏都浮动,高度不同,底部的页脚要排在两栏下面。

页脚用 clear: both 排到最下面HTML
<div class="left" style="float: left; width: 40%; height: 100px; background: #bfdbfe;">左栏 100px</div>
<div class="right" style="float: right; width: 40%; height: 180px; background: #fde68a;">右栏 180px</div>
<footer style="clear: both; background: #d1fae5;">页脚</footer>
<!-- clear: left  → 页脚顶部在 100px 处,右边还会被右栏挤着 -->
<!-- clear: right → 页脚顶部在 180px 处 -->
<!-- clear: both  → 取更低的那个,也是 180px 处,左右都干净 -->

去掉 clear 时,页脚是个普通块级元素,它会从容器顶部开始排,盒子本身其实钻到了两个浮动的下面,只有里面的文字绕开浮动挤到中间。加上 clear: both,浏览器计算左栏底部 100px 和右栏底部 180px,取较大值,把页脚整个推到 180px 以下。

clearance 带来的 margin 怪现象

理解了「clear 是往上面塞一段空隙」,就能解释一个很多人踩过的坑:给被清除的元素写 margin-top: 20px,想让它和浮动之间隔开一点,结果没有任何变化。

为什么 margin-top 像失效了
浏览器算 clearance 时,目标是让元素的上边框刚好贴到浮动底部。margin-top 本身算在这段距离里,clearance 会相应减少来补足,最后边框位置还是贴着浮动底部。只有当 margin-top 大到超过浮动的底部,才会看到效果。想要间距,更可靠的做法是给浮动元素加 margin-bottom,或者给被清除的元素加 padding-top。 另外,clearance 还会阻止被清除元素的 margin-top 和父元素的外边距合并,这也是有时候调外边距出现意外结果的原因之一。
回答前,多想一步

容易答错的地方

说 clear 把浮动清除掉了
「清除浮动」这个说法容易让人以为浮动元素被删掉或者不再浮动了。实际上浮动元素原样不动,被移动的是写了 clear 的那个元素。它清除的是「自己旁边的浮动」。
以为 clear 能管到任何浮动
clear 只考虑源码里排在它前面的浮动,后面的浮动它不管。它也只看同一个块格式化上下文,也就是 BFC 里的浮动。如果浮动在一个 overflow: hidden 的子容器里,那个容器已经建立了新的 BFC,外面的 clear 就碰不到它。
在 flex 容器里用 clear
flex 和 grid 的子项上,float 和 clear 都不起作用。在这种布局里想换行,要用 flex-wrap 或者网格的行定义。
试着用自己的话回答

面试官还会怎么问?

clearfix 为什么这样写?

常见写法是 .clearfix::after { content: ''; display: block; clear: both; }。伪元素是容器里最后一个子元素,clear: both 把它推到所有浮动下面,而它是正常文档流里的块,容器的高度就得包住它,于是也就包住了浮动。display: block 是因为伪元素默认是行内的,行内元素上 clear 不生效。

浮动元素自己可以设置 clear 吗?

可以。浮动元素设置 clear: left 后,它会排到前面所有左浮动的下面,而不是接在它们右边。有时用这个办法让一排浮动的卡片从某一个开始另起一行。

现在还需要 clear 吗?

新布局基本用 flex 和 grid,已经很少手写浮动了。float 和 clear 如今主要用在「图片浮动、文字环绕」这类图文混排里,以及维护老项目时。父元素包住浮动可以直接用 display: flow-root,不再需要 clearfix。

从一道题,走向一组知识

把知识连起来

盒模型与排版

子元素全部浮动后父元素高度变成 0,为什么?怎么修?

修复父元素高度塌陷的 clearfix,就是在容器末尾放一个 clear: both 的伪元素把高度撑开。

盒模型与排版

contain layout 和 contain paint 怎么缩小重排和重绘的范围?

contain: layout 会让元素建立独立的格式化上下文,里面的浮动就影响不到外面的 clear。

参考资料

  • CSS:盒模型与排版参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 左右两个不一样高的浮动
  3. clearance 带来的 margin 怪现象
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑