前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库overflow clip 与 hidden 区别
CSS盒模型与排版

overflow: clip 和 overflow: hidden 看起来一样,到底差在哪?

两者都把溢出内容裁掉,区别在于 overflow: hidden 的元素仍然是一个滚动容器,只是没有滚动条,JS 和浏览器都能让它滚;overflow: clip 只裁剪,元素不是滚动容器,任何方式都滚不动。

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

裁剪和滚动是两件事

  1. overflow: hidden裁剪加滚动容器,只是用户没有滚动条可拖
  2. overflow: clip只裁剪,不产生滚动容器,也不建立 BFC
  3. overflow-clip-margin只对 clip 生效,允许内容溢出到边缘外一段距离再裁

hidden 容器里的输入框被聚焦、或者锚点跳转时,浏览器会悄悄滚动这个容器,内容整体错位。很多「内容莫名上移」的 bug 就是它,换成 clip 就不会发生。

核心回答

先记住这个答案

视觉上两者都把超出盒子的内容裁掉,关键区别在滚动。overflow: hidden 的元素依然是滚动容器,只是不显示滚动条,JS 设置 scrollTop、调用 scrollIntoView、聚焦内部的输入框,都能让它滚动。overflow: clip 是纯裁剪,元素不是滚动容器,程序也滚不动它。由此还带出两个差异:hidden 会建立 BFC,会成为后代 position: sticky 的吸附参照;clip 两样都不做。

  • hidden 可编程滚动,clip 不可
  • clip 不接受 scrollTop 滚动
  • hidden 会建立 BFC,clip 不会
  • clip 不建立滚动容器

用一段 JS 看出区别

两个一样高的盒子,内容都比盒子高,分别用 hidden 和 clip,然后用 JS 去滚它们。

设置 scrollTop 的结果JavaScript
// .a { height: 100px; overflow: hidden }
// .b { height: 100px; overflow: clip }
// 两个盒子里都放了 300px 高的内容
const a = document.querySelector('.a')
const b = document.querySelector('.b')

a.scrollTop = 80
b.scrollTop = 80

console.log(a.scrollTop) // 80,内容向上移了 80px
console.log(b.scrollTop) // 0,设置被忽略,内容纹丝不动

hidden 只是把滚动条藏了起来,滚动能力还在,所以 scrollTop 能改。clip 的元素没有滚动位置这个概念,scrollTop 永远是 0。 这个差异在项目里经常以 bug 的形式出现。比如一个 overflow: hidden 的轮播容器里有输入框,用户按 Tab 聚焦到被裁掉的那一张卡片里的输入框,浏览器为了让它可见,会自动滚动这个容器,整个轮播就错位了。锚点跳转、scrollIntoView 也会触发同样的效果。用 clip 就不存在这个问题。

为什么 hidden 会影响布局,clip 不会

一个元素变成滚动容器,就必须把自己的内容「关」在里面,所以 overflow 取 hidden、auto、scroll 时都会建立 BFC(块级格式化上下文,里面的布局不和外面互相影响)。clip 不是滚动容器,没有这层副作用。

两个布局副作用
第一是 BFC。overflow: hidden 常被拿来清除浮动、阻止父子外边距塌陷,靠的就是建立 BFC。把它换成 clip,浮动不会被包住,外边距照样塌陷。所以替换之前要确认原来的 hidden 是不是在承担这个作用,想要 BFC 又不想要滚动容器,可以用 display: flow-root。 第二是 sticky。position: sticky 的元素吸附在离它最近的滚动容器上。祖先里有一个 overflow: hidden,sticky 就会以它为参照,而它本身不滚动,结果就是 sticky 看起来完全失效。把这个祖先改成 overflow: clip,sticky 会继续往上找到真正滚动的页面或容器,吸顶效果就回来了。

clip 独有的两个能力

clip 除了「不滚动」之外,还有两个 hidden 做不到的用法。

只裁一个方向
overflow-x 和 overflow-y 分开写时,如果一个是 hidden、另一个是 visible,浏览器会把 visible 自动算成 auto,因为滚动容器不可能只在一个方向上关住内容。结果本来想横向裁剪、纵向放开,却多出一个纵向滚动条。overflow-x: clip 配 overflow-y: visible 就没有这个转换,真的只裁左右。
往外放宽一点再裁
overflow-clip-margin: 8px 表示内容可以溢出盒子 8 像素再被裁掉,适合给卡片里的阴影、聚焦外框留出位置。这个属性只在 overflow: clip 上生效,对 hidden 没用。
回答前,多想一步

容易答错的地方

以为 hidden 就是不能滚动
hidden 禁止的只是用户通过滚动条和滚轮去滚,JS、聚焦、锚点都能让它滚。需要真正「冻结」内容位置时,要么用 clip,要么自己监听 scroll 事件把 scrollTop 复位。
把所有 hidden 无脑换成 clip
clip 不建立 BFC。原来依赖 overflow: hidden 清浮动、防外边距塌陷的地方,换完布局就会变。替换前先看这个 hidden 是为了裁剪还是为了 BFC。
以为 clip 能防止 body 滚动
在弹窗打开时给 body 设 overflow: hidden 是锁定页面滚动的常见做法,它依赖的是视口的滚动行为,写在 html 或 body 上的 overflow 会传给视口。这时写 clip 没有额外好处,锁滚动还是用 hidden。
试着用自己的话回答

面试官还会怎么问?

除了 overflow,还有哪些方式能裁剪内容?

clip-path 可以按任意形状裁剪,也不产生滚动容器。contain: paint 会让后代不画到元素自身的盒子之外,同时建立新的层叠上下文、BFC 和包含块。几种方式的区别在于副作用,选的时候看需不需要 BFC、需不需要限制绘制范围。

overflow: clip 的兼容性怎么样?

现在主流浏览器都支持,但较老的 Safari 不认识这个值,会把整条声明丢掉,内容直接溢出。稳妥的写法是先写一行 overflow: hidden 再写一行 overflow: clip,不支持的浏览器退回 hidden。

overflow: hidden 的容器,怎么判断内容有没有被裁掉?

比较 scrollHeight 和 clientHeight,前者大于后者就说明内容溢出了,横向同理比较 scrollWidth 和 clientWidth。这个判断对 clip 同样适用,因为 scrollHeight 反映的是内容总高度。

从一道题,走向一组知识

把知识连起来

盒模型与排版

两个元素都没写 z-index,重叠时谁盖住谁?

裁剪只影响内容显示范围,不改变绘制顺序,那一题讲没有 z-index 时元素谁盖住谁。

盒模型与排版

给子元素加 margin-top,为什么整个父元素一起掉下来了?

overflow: hidden 常被用来阻止父子外边距塌陷,靠的正是它建立 BFC,而 clip 做不到这一点。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 用一段 JS 看出区别
  3. 为什么 hidden 会影响布局,clip 不会
  4. clip 独有的两个能力
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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