CSS 如何解决 margin 塌陷

188 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

在 CSS 中,margin 用来设置或者清除周围的(外边框)元素区域。

image.png

什么是 margin 塌陷

margin 塌陷问题是 css 中常见的一种情况,我们先来看一段代码:

<!DOCTYPE html>
<html>
<head>
  <style>
    #box1{
      background: yellow;
      width:200px;
      height:200px;
      margin:100px 0 0 100px;
    }
    #box2{
      background: #2bc22b;
      width:100px;
      height:100px;
      margin-left:30px;
      margin-top:30px;
    }
  </style>
</head>
<body>
<div id="box1">
  <div id="box2">box2
</body>
</html>

运行到浏览器的效果如下:

image.png

很明显这与我们的预期有所偏差,实际上想要的效果是这样的: image.png

上面的代码效果实际上就是产生了 margin 塌陷(边界重叠)。

外边距的塌陷是在标准流中,指的是竖直方向的 margin 发生塌陷现象(水平方向不会产生塌陷)

塌陷可以分为两种情况,一般父子元素之间的塌陷比较常见:

  • 情况一:两个元素同级,垂直排列,那么上面的 div 的下边距(margin-bottom)和下面 div 的上边距(margin-top)会产生塌陷,间距会重叠,最终的距离会以大的边距来计算。

    解决方法:两个外边距不同时出现在样式中。

  • 情况二:两个元素是父子元素,内部的元素设置 margin-top,它的父级元素也会受到影响,同时产生上边距,此时父子元素会发生粘连。

margin 塌陷解决方案:

1、父容器设置 border(不需要边框样式的话可以设置成透明)

#box1 {
  border: 1px solid transparent;
}

2、在父容器的之前添加一个空元素(利用伪元素 ::before)

#box1::before { 
    content:''; 
    display:table; 
}

3、父容器设置 overflow:hidden

4、父容器设置 padding

5、父容器设置 position:fixed

6、父容器设置 display:table

另外,Html 中的一些元素会有默认的 margin ,可以通过通配符选择器设置 margin、padding 来消除其影响

* {
    margin: 0;
    padding: 0;
}