前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库空块级元素 上下外边距合并
CSS盒模型与排版

一个空 div 同时设了上下 margin,它在页面上占多高?

会合并。一个没有内容、没有 padding 和 border、高度为 0 的块元素,它的 margin-top 和 margin-bottom 会合成一个,取两者中较大的那个。margin: 20px 0 30px 的空 div 只占 30px,而不是 50px,而且这 30px 还会继续和前后元素的外边距合并。

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

空块的外边距为什么能「穿过」自己

  1. 自身合并上下边距之间没有内容、padding、border 隔开,就被视为相邻
  2. 连续合并合并后的外边距又和上一个、下一个兄弟的外边距相邻,继续合并
  3. 取值规则全是正数取最大;有负数时用最大正值加上绝对值最大的负值

合并只发生在块级方向上。Flex 和 Grid 的子项、浮动元素、绝对定位元素、inline-block 的外边距都不会合并。

核心回答

先记住这个答案

会合并。空块元素上下两个外边距之间没有任何东西隔开,没有内容、没有 padding、没有 border,高度也是 0,CSS 就把它们看作相邻外边距,合成一个,值取较大的那个。更容易忽略的是,这个合并后的外边距还会继续和上一个兄弟的 margin-bottom、下一个兄弟的 margin-top 合并,所以空元素有时看起来像完全不占空间。只要给它加上内容、padding、border、height 或 min-height 中的任何一个,合并就被打断。

  • 空块的上下外边距会合并,取较大值
  • 合并后还会和前后兄弟的外边距接着合并
  • 正负混合时:最大正值加上绝对值最大的负值
  • 内边距、边框或内容可阻止合并

算一算这段间距到底多大

条件渲染经常留下空的包裹元素,比如一个没有数据时内容为空的提示区。

空元素夹在两段文字中间HTML
<p class="a">第一段</p>
<div class="empty"></div>
<p class="b">第二段</p>

<style>
  .a { margin-bottom: 16px; }
  .empty { margin: 20px 0 30px; }   /* 自身合并成 30px */
  .b { margin-top: 10px; }
  /* 最终两段之间的距离:max(16, 20, 30, 10) = 30px,不是 16 + 50 + 10 = 76px */
</style>

这里有四个外边距挨在一起:.a 的下边距、.empty 的上下边距、.b 的上边距。它们中间没有任何内容或边框隔开,所以会一次性合并成一个,取最大值 30px。 如果把 .empty 删掉,两段之间是 max(16, 10) = 16px。也就是说,这个空元素只让间距从 16px 变成了 30px,而不是多出 50px。

什么情况能阻止它合并

空块的上下外边距能合并,前提是两者之间「什么都没有」。所以只要往中间塞点东西就行。

能打断合并的写法
给空块加 padding-top: 1px 或者 border-top: 1px solid transparent,上下边距就被隔开了,不再自身合并。设一个非 0 的 height 或 min-height 也可以。放进一个文字、一个行内元素,也会让它不再是「空」的。 还有一类办法是改变布局方式。把父容器改成 display: flex 并设 flex-direction: column,子项的外边距不会合并;浮动、绝对定位、display: inline-block 的元素也不参与外边距合并。现在更推荐的写法是父级用 Flex 或 Grid 的 gap 控制间距,子元素不写外边距,从根上避开这个问题。 给空元素自身设 overflow: hidden 或 display: flow-root,让它创建 BFC,也能阻止自身合并,CSS 2.1 的规则里明确排除了创建新 BFC 的盒子。但它的上边距仍会和上一个兄弟合并,下边距仍会和下一个兄弟合并,只是上下两个不再合成一个。

负外边距时怎么算

合并不只是「取最大」。规范规定的算法是:所有正的外边距取最大值,所有负的外边距取绝对值最大的那个,两者相加。

比如一个空块写 margin: 20px 0 -30px,自身合并后是 20 + (-30) = -10px,下面的元素会往上移 10px。如果全是负数,就取绝对值最大的负值。实际项目里用负外边距做重叠效果时,旁边再有个空元素,间距就会算错,按这个规则就能推回来。

回答前,多想一步

容易答错的地方

以为空元素的上下外边距会相加
margin: 20px 0 30px 的空块只贡献 30px,而且还可能被前后更大的外边距吸收掉。用空 div 撑间距时,这是间距对不上最常见的原因。
以为合并只发生在兄弟元素之间
外边距合并有三种情况:相邻兄弟之间、父元素和第一个或最后一个子元素之间、空块自己的上下之间。只记住第一种,遇到空元素和父子穿透时就解释不了。
以为 display: none 的元素也会参与
display: none 的元素不生成盒子,外边距也就不存在,不参与合并。visibility: hidden 的元素仍然生成盒子,它的外边距照常参与,如果它是空的,也会自身合并。
试着用自己的话回答

面试官还会怎么问?

空元素的外边距会不会穿出父元素?

会。如果父元素没有 padding、border,也没有创建 BFC,空子元素的外边距可能先自身合并,再和父元素的外边距合并,最后穿到父元素外面。给父元素加 padding 或 border,或者用 display: flow-root 让父元素创建 BFC,就能挡住。

用空 div 做占位间隔,怎么保证它真的占那么高?

不要靠外边距,直接给它设 height。比如间隔 24px 就写 height: 24px,它是真实占位的高度,不会和任何外边距合并。更好的做法是去掉占位元素,用父级的 gap 或子元素的外边距管理间距。

水平方向的外边距会合并吗?

不会。外边距合并只发生在块方向,也就是普通横排文字下的上下方向。左右外边距总是相加。如果页面用 writing-mode: vertical-rl 改成竖排,块方向变成左右,合并也会跟着发生在左右方向上。

从一道题,走向一组知识

把知识连起来

盒模型与排版

想让文字绕着图片排,用 float 和 inline-block 效果一样吗?

浮动和 inline-block 元素的外边距不参与合并,正好是这道题的反例。

盒模型与排版

父元素高度是 auto,为什么撑不开绝对定位的子元素?

两道题都在算父容器高度,那道讲绝对定位子元素为什么撑不开 height: auto。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 算一算这段间距到底多大
  3. 什么情况能阻止它合并
  4. 负外边距时怎么算
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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