外边距合并

269 阅读2分钟

1 概念

当块级元素的上下外边距相邻时,有时会合并为一个外边距,其大小取其中的最大者,这种情况成为外边距合并。
注意:

  • 一定要相邻,中间不能有任何东西,包括边框和内边距。
  • 浮动元素和绝对定位元素的外边距不会合并。

2 出现外边距合并的三种情况

2.1 相邻兄弟元素之间

相邻的两个兄弟元素之间的外边距会合并,大小取最大者。

<!DOCTYPE html>

<head>
  <style>
    .node {
      background-color: red;
      margin: 20px;
      width: 50px;
      height: 50px;
    }
  </style>
</head>

<body>
  <div class="node">节点1</div>
  <div class="node">节点2</div>
</body>

2.2 父元素与第一个或最后一个子元素之间

当父元素与边界子元素的margin相邻时,边距会发生合并。切记父元素不能有相应的边框与内边距。

<!DOCTYPE html>

<head>
  <style>
    .father {
      width: 200px;
      height: 200px;
      margin-top: 50px;
      background-color: red;
    }

    .child {
      width: 50px;
      height: 50px;
      margin-top: 250px;
      background-color: green;
    }
  </style>
</head>

<body>
  <div class="father">
    <div class="child">child</div>
  </div>
</body>

2.3 元素自身

当元素高度为0,无边框无内边距时,上下外边距会发生合并。

看dom元素的margin都是50px,但是实际所占高度并不是100px,而是50px。

<!DOCTYPE html>

<head>
  <style>
    .contrast {
      width: 200px;
      height: 100px;
      background: red;
    }

    .father {
      margin: 50px;
    }
  </style>
</head>

<body>
  <div class="contrast">对比元素</div>
  <div class="father"></div>
  <div class="contrast">对比元素</div>
</body>

2.4 注意事项

  • 即使某一外边距为0,这些规则仍然适用。因此就算父元素的外边距是0,第一个或最后一个子元素的外边距仍然会“溢出”到父元素的外面。
  • 如果参与合并的外边距中包含负值,合并后的外边距的值为最大的正边距与最小的负边距(即绝对值最大的负边距)的和。
  • 如果所有参与合并的外边距都为负,合并后的外边距的值为最小的负边距的值。这一规则适用于相邻元素和嵌套元素。

3 如何解决

3.1 元素之间

  • 隔绝两个兄弟元素:在两个元素之间添加其他元素。
  • 变为浮动元素
  • 变成绝对定位元素

3.2 父子元素之间

  • 隔离父子元素:父元素添加border、padding
  • 父元素变为BFC

3.3 元素自身

  • 隔绝上下边距:通过border、padding
  • 元素变为BFC

参考资料

developer.mozilla.org/zh-CN/docs/…