演示margin外边距塌陷产生时,如何解决外边距塌陷,并列举出常用的解决margin外边距塌陷的办法;

什么情况下会产生margin外边距塌陷:

在两个div嵌套时,里面的div设置了margin-top外边距时,会产生异常

图片和代码演示:

未设置margin-top时

image.png

未设置margin-top时的代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>宗波尘客-解决margin外边距塌陷的办法</title>
    <style>
      .box1 {
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        width: 100px;
        height: 100px;
        background-color: orange;
      }
    </style>
  </head>
  <body>
    <div class="box1">
      <div class="box2">内层的类名为box2的div(橘黄色)</div>
      外层的类名为box1的div(红色)
    </div>
  </body>
</html>


下面是添加了margin-top的状态:

image.png

下面是异常代码演示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>宗波尘客-解决margin外边距塌陷的办法</title>
    <style>
      .box1 {
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        margin-top: 50px;
        width: 100px;
        height: 100px;
        background-color: orange;
      }
    </style>
  </head>
  <body>
    <div class="box1">
      <div class="box2">内层的类名为box2的div(橘黄色)</div>
      外层的类名为box1的div(红色)
    </div>
  </body>
</html>

上方CSS样式里,在子元素里添加了margin-top:50px;使得父元素异常掉了下来,此问题称为外边距塌陷或者margin塌陷

margin外边距塌陷解决办法:

1、可以给父元素(标签)设置一个边框border(可以只设置上方的边框)

代码演示:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>宗波尘客-解决margin外边距塌陷的办法</title>
    <style>
      .box1 {
        /* 可以设置上边框 */
        border-top: 1px solid transparent;
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        margin-top: 50px;
        width: 100px;
        height: 100px;
        background-color: orange;
      }
    </style>
  </head>
  <body>
    <div class="box1">
      <div class="box2">内层的类名为box2的div(橘黄色)</div>
      外层的类名为box1的div(红色)
    </div>
  </body>
</html>

可以看到,上方设置了border-top,添加了1px上边框,颜色选择了透明色transparent,所以下方演示图看不到1px的边框

image.png

2、物理办法,给父元素设置padding-top将子元素挤下来

image.png

3、可以给父元素或者子元素设置float:left;浮动

    <style>
      .box1 {
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        /* 设置浮动 */
        float: left;
        width: 100px;
        height: 100px;
        margin-top: 50px;
        background-color: orange;
      }
    </style>

3、可以给父元素或者子元素设置position定位

<style>
      .box1 {
        position: absolute;
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        width: 100px;
        height: 100px;
        margin-top: 50px;
        background-color: orange;
      }
    </style>

我这里给父元素设置的绝对定位(给父元素设置相对定位无效哦)

4、将父元素或者子元素用display:inline-block;转换成行内块级元素

<style>
      .box1 {
        /* 将父元素或者子元素转换成行内块级元素 */
        display: inline-block;
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        width: 100px;
        height: 100px;
        margin-top: 50px;
        background-color: orange;
      }
    </style>


5、给父元素设置overflow:hidden;溢出隐藏(开启BFC模式)

  <style>
      .box1 {
        /* 设置溢出隐藏 */
        overflow: hidden;
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        width: 100px;
        height: 100px;
        margin-top: 50px;
        background-color: orange;
      }
    </style>


6、给父元素设置display:flow-root;(开启BFC模式)

 <style>
      .box1 {
        /* 这个类型也能开启BFC模式 */
        display: flow-root;
        width: 300px;
        height: 300px;
        background-color: red;
      }
      .box2 {
        width: 100px;
        height: 100px;
        margin-top: 50px;
        background-color: orange;
      }
    </style>