CSS中外边距合并及BFC解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014465934/article/details/88676842

参考文章:https://juejin.im/post/5965c46ef265da6c2518f5ec

1.外边距合并

块的顶部外边距和底部外边距有时候会被折叠为单个外边距,其大小为两值中的最大值,这种行为就被称为外边距合并。

一般发生外边距合并主要有以下三种情况:
1.相邻兄弟姐妹元素
2.父元素和子元素
3.空元素

相邻兄弟姐妹元素

两个兄弟元素之间的外边距,会取两个元素外边距的最大值。

<p style="margin-bottom: 30px;">这个段落的下外边距被合并...</p>
<p style="margin-top: 20px;">...这个段落的上外边距被合并。</p>

按照上面的例子可以得出,两个p元素之间距离为30px。

父元素和子元素

这种情况又可以分为以下两种:
1.父元素的上外边距和第一个子元素的上外边距
2.父元素的下外边距和最后一个子元素的下外边距

这两种情况,最终显示出来的结果都是取二者中的最大值。

空元素

自己的上外边距会和自己的下外边距合并

假设有一个空元素,它有外边距,但是没有边框或填充。在这种情况下,上外边距与下外边距就碰到了一起,它们会发生合并:

在这里插入图片描述

如果这个外边距遇到另一个元素的外边距,它还会发生合并:

在这里插入图片描述

<p style="margin-bottom: 0px;">这个段落的和下面段落的距离将为20px</p>

<div style="margin-top: 20px; margin-bottom: 20px;"></div>

<p style="margin-top: 0px;">这个段落的和上面段落的距离将为20px</p>

这样第一个p元素和第三个p元素之间距离为20px.

这就是一系列的段落元素占用空间非常小的原因,因为它们的所有外边距都合并到一起,形成了一个小的外边距。

外边距合并初看上去可能有点奇怪,但是实际上,它是有意义的。以由几个段落组成的典型文本页面为例。第一个段落上面的空间等于段落的上外边距。如果没有外边距合并,后续所有段落之间的外边距都将是相邻上外边距和下外边距的和。这意味着段落之间的空间是页面顶部的两倍。如果发生外边距合并,段落之间的上外边距和下外边距就合并在一起,这样各处的距离就一致了。

在这里插入图片描述

注释:只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框、浮动框或绝对定位之间的外边距不会合并。

2.阻止合并方法

通用方法:
1.处于静态流元素会发生合并,所以float和position:absolute都不会发生合并
2.设置为inline-block ,也不会发生合并

针对父元素和子元素情况不合并方法:
1.设置了清除浮动属性
2.因为margin需要直接接触才能合并,所以父元素或子元素中有border或padding,或者二者之间有元素

注意:
1.如果两个外边距值中有一个为0,也会发生合并。
2.如果有负外边距,合并后外边距为最大正边距加上最小负边距(绝对值最大的一个),如上面元素下边距为20px,下面元素上边距为-20px,则最后为0px

3.BFC

参考文章:https://juejin.im/post/5c860afd6fb9a049fd10ab9d

BFC特性:同一个BFC下外边距会发生重叠

解决上述问题的其中一个办法就是创建 BFC。BFC 的全称为 Block Formatting Context,即块级格式化上下文。

BFC特性:
1.处于同一个 BFC 中的元素相互影响,可能会发生 margin collapse;
2.BFC 在页面上是一个独立的容器,容器里面的子元素不会影响到外面的元素,反之亦然;
3.计算 BFC 的高度时,考虑 BFC 所包含的所有元素,包括浮动元素也参与计算;
4.浮动盒的区域不会叠加到 BFC 上;

1.防止垂直margin重叠

1.父子元素的边界重叠得解决方案: 在父元素上加上 overflow:hidden;使其成为 BFC。

<style>
  .parent {
    background: #e7a1c5;
    overflow: hidden;
  }
  .parent .child {
    background: #c8cdf5;
    height: 100px;
    margin-top: 10px;
  }
</style>
<section class="parent">
  <article class="child"></article>
</section>

在这里插入图片描述
参考文章:
https://blog.csdn.net/sinat_22996989/article/details/47255541
https://blog.csdn.net/zpf_2017/article/details/80411658
https://blog.csdn.net/weixin_38203203/article/details/79005671
https://blog.csdn.net/weixin_33918357/article/details/86797743

2.兄弟元素的边界重叠,在第二个子元素创建一个 BFC 上下文:

<style>
  #margin {
    background: #e7a1c5;
    overflow: hidden;
    width: 300px;
  }
  #margin > p {
    background: #c8cdf5;
    margin: 20px auto 30px;
  }
</style>

<section id="margin">
    <p>1</p>
    <div style="overflow:hidden;">
        <p>2</p>
    </div>
    <p>3</p>
</section>

在这里插入图片描述
2.清除内部浮动

<style>
  #float {
    background: #fec68b;
  }
  #float .float {
    float: left;
  }
</style>
<section id="float">
  <div class="float">我是浮动元素</div>
</section>

父元素#float 的高度为 0,解决方案为为父元素#float 创建 BFC,这样浮动子元素的高度也会参与到父元素的高度计算:

#float {
  background: #fec68b;
  overflow: hidden; /*这里也可以用float:left*/
}

在这里插入图片描述

3.自适应两栏布局

<section id="layout">
  <style>
    #layout {
      background: red;
    }
    #layout .left {
      float: left;
      width: 100px;
      height: 100px;
      background: pink;
    }
    #layout .right {
      height: 110px;
      background: #ccc;
    }
  </style>
  <!--左边宽度固定,右边自适应-->
  <div class="left">左</div>
  <div class="right">右</div>
</section>

在这里设置右边的高度高于左边,可以看到左边超出的部分跑到右边去了,这是由于由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样导致的。

在这里插入图片描述

解决方案为给右侧元素创建一个 BFC,原理是 BFC 不会与 float 元素发生重叠。

#layout .right {
  height: 110px;
  background: #ccc;
  overflow: auto;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/88676842