css面试题随笔

之前在前端群有个汉纸聊到他面试别人时问到:margin塌陷和margin合并问题如何解决?

然后我自己也懵逼了哈哈,因为只是遇到过并不知道这叫塌陷、合并哈哈哈················那我们一起来看看怎么回事吧,加上要怎么解决哦

塌陷问题:

在标准文档流中,竖直方向(记住是竖直方向,左右方向的不会出现塌陷现象)的margin会出现叠加现象,即较大的margin会覆盖掉较小的margin,竖直方向的两个盒子中间只有一个较大的margin,这就是margin的塌陷现象

HTML代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>margin塌陷(父子)</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .father {
        width: 200px;
        height: 200px;
        background-color: red;
        margin-top: 100px;
      }
      .son {
        width: 50px;
        height: 50px;
        background-color: #eee;
        opacity: 0.8;
        margin-top: 150px;
      }
    </style>
  </head>
  <body>
    <div class="father">
      <div class="son"></div>
    </div>
  </body>
</html>

 虽然给类名为:son 的元素给了  margin-top: 150px;   但是子元素并没有相对于父元素  margin-top: 150px;    ,而是和父元素一起下移了。(即父级盒子往下塌陷了50px)。

原理:父子嵌套元素在垂直方向的margin,父子元素是结合在一起的,他们两个的margi会取其中最大的值.正常情况下,父级元素应该相对浏览器进行定位,子级相对父级定位.但由于margin的塌陷,父级相对浏览器定位.而子级没有相对父级定位,子级相对父级,就像坍塌了一样。

解决方案:

/* 解决方案 */
      /* 给父级设置边框或内边距(不建议使用) */
      /* .father {
        border: 1px solid #000000;
      } */
      /* 触发bfc(块级格式上下文),改变父级的渲染规则 */
      /* 改变父级的渲染规则有以下四种方法,给父级盒子添加
      (1)position:absolute/fixed
      (2)display:inline-block;
      (3)float:left/right
      (4)overflow:hidden
      这四种方法都能触发bfc,但是使用的时候都会带来不同的麻烦,具体使用中还需根据具体情况选择没有影响的来解决margin塌陷 */

合并问题:

块级元素的上外边距与下外边距有时会合并为单个外边距。 

margin合并计算规则为正正取大值,正负值相加,负负最负值。

HTML代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>margin塌陷</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .box1,
      .box2 {
        width: 300px;
        height: 300px;
      }
      .box1 {
        background-color: brown;
        margin-bottom: 60px;
      }
      .box2 {
        background-color:cornflowerblue;
        margin-top: 70px;
      }
    </style>
  </head>
  <body>
    <div class="box1"></div>
    <div class="box2"></div>
  </body>
</html>

上面的有:margin-bottom: 60px;    下面的有:margin-top: 70px;    按理来说那它俩之间的距离应该是130px,然而事实并非如此,它俩之间的距离是70px。

其实这个margin合并的bug你没有必要去解决,比如你现在有两个元素,你想让他俩上下130px,没有必要60px+70px吧,你只需要上面的margin-bottom为130px,就可以了!!和margin塌陷不同,margin塌陷是视觉上的效果,你加个css就能弥补。

解决方案:

      /* 解决方案: */
      /* 给box1或box2加上一层父级元素并加上overflow:hidden; */

      /* .box2{
          float: left;
      } */
      /* .box2 {
        position: absolute;
      } */
      /* .box1 {
        display: inline-block;
      } */
      /* .box2 {
        display: inline-block;
      } */

HTML改为:

  <body>
    <!-- <div style="overflow: hidden;">
        <div class="box1"></div>
    </div> -->
    <div style="overflow: hidden;">
      <div class="box2"></div>
    </div>
  </body>
原文地址:https://www.cnblogs.com/yingzi1028/p/13503464.html