首先我们先看出现外边距塌陷的三种情况:

1.当上下相邻的两个块级元素相遇,上面的元素有下边距 margin-bottom,下面的元素有上边距 margin-top,则它们之间的垂直距离取两个值中的较大者。

<style>
  .box1 {
    width: 150px;
    height: 100px;
    margin-bottom: 20px;
    background-color: rgb(201, 239, 98);
  }
  .box2 {
    width: 100px;
    height: 100px;
    background-color: rebeccapurple;
    margin-top: 10px;
  }
</style>
<div class="box1"></div>
<div class="box2"></div>

这时候两个盒子之间的垂直距离不是 30px,而是 20px。解决方法:尽量只给一个盒子添加 margin 值

  1. 对于两个嵌套关系的块元素,如果父元素没有上内边距及边框,父元素的上外边距会与子元素的上外边距发生合并,合并后的外边距为两者中的较大者。
<head>
  <style>
    .box1 {
      width: 150px;
      height: 100px;
      margin-top: 20px;
      /* border: 1px solid #000000; */
      background-color: red;
    }
    .box2 {
      width: 100px;
      height: 100px;
      /* border: 1px solid #000000; */
      background-color: rebeccapurple;
      margin-top: 10px;
    }
  </style>
</head>
<body>
  <div class="box1">
    <div class="box2"></div>
  </div>
</body>

这时候两个盒子会发生合并,上外边距为 20px。

解决办法: ① 给父元素定义上边框 ② 给父元素定义上内边距 ③ 给父元素添加 overflow:hidden;④ 添加浮动 ⑤ 添加绝对定位

  1. 如果存在一个空的块级元素,border、padding、inline content、height、min-height 都不存在,那么上下边距中间将没有任何阻隔,上下外边距将会合并。
<p style="margin-bottom: 0px;">这个段落的和下面段落的距离将为20px</p>
<div style="margin-top: 20px; margin-bottom: 20px;"></div>
<p style="margin-top: 0px;">这个段落的和上面段落的距离将为20px</p>

可以理解成中间 div 宽度为 0 且上下边距融合,只取 margin 的最大值。

CSS 中如何解决外边距塌陷问题? (opens new window)