CSS Margin 坍塌

Margin坍塌

什么是 Margin 坍塌?

块与块之间的顶部外边距底部外边距有时候会被合并成这两个外边距的值最大的那一个,称之为 Margin 坍塌

出现于哪些情况?

  • 当两个竖直方向上的边距元素相遇的时候:

假设我们有一个颜色为#ff6b6bdiv位于页面上,还有一个颜色为#4e97cddiv位于这个div的下面,htmlCSS代码分别如下:

HTML:

<div class="module__top"></div>
<div class="module__bottom"></div>

CSS:

.module {
  display: block;
  width: 100%;
  height: 150px;
}

.module__top {
  margin-bottom: 25px;
  background-color: #f38a6d;
}

.module__bottom {
  margin-top: 50px;
  background-color: #3bbfef;
}

效果如下图所示:

这里写图片描述

根据我们的直观感觉,中间这个白色的部分的高度,应该是75px,然而运行结果却是50px,较大的margin吞掉了较小的margin

那么当一个margin是正数,另外一个是负数的时候呢?比如:

.module__top {
  margin-bottom: -25px;
  background-color: #ff6b6b;
}

.module__bottom {
  margin-top: 50px;
  background-color: #4e97cd;
}

最终的结果就是50 + (-25) = 25px

当两个值都是负数,比如-50px-25px,那么最终的结果是-50px

  • 父元素的margin遇见了它的第一/最后一个孩子的margin

CSS:

/* 父元素 */
div {
  margin: 15px;
}

/* 下面都是孩子元素 */
.red {
  background-color: #ff6b6b;
}

.orange {
  background-color: #ff9e2c;
}

.yellow {
  background-color: #eeee78;
}

.green {
  background-color: #4ecd9d;
}

.blue {
  background-color: #4e97cd;
}

.purple {
  background-color: #6c4ecd;
}

HTML:

<div class="red">
  <div class="orange">
    <div class="yellow">
      <div class="green">
        <div class="blue">
          <div class="purple">Collapsed</div>
        </div>
      </div>
    </div>
  </div>
</div>

<div class="padding red">
  <div class="padding orange">
    <div class="padding yellow">
      <div class="padding green">
        <div class="padding blue">
          <div class="padding purple">Not Collapsed</div>
        </div>
      </div>
    </div>
  </div>
</div>

运行结果:

这里写图片描述

再一次,我们应该想当然认为所有元素的margin加起来应该等于父元素和孩子元素margin的总和。但是运行结果显示,孩子元素的margin将会被父元素的margin所覆盖,父元素看起来就像一个大Boss。

通过给父元素添加1px padding或者border-top,就可以解决这个问题。

如何解决 margin 坍塌问题?

一个方向上总是使用一种margin,不要混着用,比如竖直方向上总是只使用margin-bottom,比如水平方向上总是只使用margin-left

参考

Mastering margin collapsing
What You Should Know About Collapsing Margins
Single-direction margin declarations

欢迎关注

我的公众号:“代码人生”,coodelife

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值