块的顶部外边距和底部外边距有时被组合(折叠)为单个外边距,其大小是组合到其中的最大外边距,

这种行为称为外边距塌陷(margin collapsing),有的地方翻译为外边距合并。

1.相邻的兄弟姐妹元素

毗邻的两个兄弟元素之间的外边距会塌陷(除非后者兄弟姐妹需要清除过去的浮动)。例如:

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

可以发现这两个段落中间的距离,不是 ”上面段落的下边距“ 与 ”下面段落的上边距“ 的 求和 ,而是两者中的较大者(在此示例中为30px)。

2.块级父元素与其第一个/最后一个子元素

如果块级父元素中,当上边框宽度(border-top)及上内边距距离(padding-top)为0时,那么这个块级元素和其第一个子元素的上边距就可以说”挨到了一起“。
此时这个块级父元素和其第一个子元素就会发生上外边距合并现象,换句话说,此时这个父元素对外展现出来的外边距将直接变成这个父元素和其第一个子元素的margin-top的较大者。
若第一个子元素为float或者position:absolute/fixed,则它脱离了普通文档流,不算第一个第一个子元素。

举一个例子

<style type="text/css">
* {
margin: 0;
padding: 0;
}
html {
background: black; //html为黑色背景
}
body {
background: red; //body为红色背景
}
#item {
width: 200px;
height: 200px;
background: pink; //粉色的一个块元素,设置了margin-top
margin-top: 100px;
}
</style> <body>
<div id="item"></div>
</body>

运行结果:

发现结果好像不按套路,粉色部分item设置的margin-top却影响了他的父元素body。如下:                  理想结果:

                                 

此类出现情况:

1、父元素没有上边框
2、为第一个子元素设置上外边距时

解决方案:

1、为父元素增加上边框 border-top
弊端:父元素会变高
2、通过为父元素设置上内边距来取代子元素的上外边距 padding-top
弊端:也会增加父元素的高度
3、在父元素中首部增加一个空 <table>元素      (触发bfc)
弊端:页面中多一个空元素而已

4.父元素加一个:before伪元素 

body:before{
content:"";
display:table;
}

3.空块元素

如果存在一个空的块级元素,其 border、padding、inline content、height、min-height 都不存在。
那么此时它的上下边距中间将没有任何阻隔,此时它的上下外边距将会合并。例如:

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

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

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

4.备注

当以上情形同时出现时,外边距合并会更加复杂(会比较两个以上外边距来最终计算出真实的边距值)。

即使外边距为0,这些规则也仍旧生效。因此,无论父元素的外边距是否为0,第一个或者最后一个子元素的外边距会被父元素的外边距"截断"(根据上面的规则),在负外边距的情况下,合并后的外边距为最大正外边距与最小负外边距之和。

当有负边距存在时,合并后的外边距将是最大正边距加上最小负边距(即负边距中绝对值最大的一个)。

如两个兄弟元素,上面的元素的下边距为 20px ,下面的元素的上边距为 -20px ,那么发生外边距合并后,这两个元素的实际距离将变成 0px 。

BFC会阻止元素外边距合并。

(点击:深入理解BFC)

 

外边距塌陷 margin collapsing的更多相关文章

  1. CSS 基础 例子 盒子模型及外边距塌陷

    我们通常设置的宽度和高度,是指盒子模型中内容(content)的宽度和高度.元素的高度,还要加上上下padding和上下border,元素整个盒子的高度还要加上上下margin:宽度类似计算. 注意: ...

  2. 外边距塌陷之clearance

    在一个BFC中,垂直方向上相邻的块级盒子产生外边距塌陷,本文要说一个特殊的外边距塌陷情况,即当垂直方向上,两个块级盒子之间有个浮动元素相隔时,这个时候会产生什么样的效果呢? .outer{ overf ...

  3. css总结9:内边距(padding)和外边距(margin)

    1 css总结9:内边距和外边距 通过css总结8:盒子模型可知:内边距(padding),外边距(margin).可以影响盒子在浏览器的位置. 1.1 padding使用:{padding:上 右 ...

  4. css的外边距合并或者外边距塌陷问题

    第一种情况: 已知两个宽和高均为100px,margin均为20px的div垂直排列,现象如下图所示: 当设置css1的margin-bottom:40px:或者css2的margin-top:40p ...

  5. 深入理解BFC和外边距合并(Margin Collapse)

    一.什么是BFC? 1.BFC的概念 BFC全称Block Formatting Context ,直译“块级格式化上下文”,也有译作“块级格式化范围”.它是 W3C CSS 2.1 规范中的一个概念 ...

  6. CSS外边距合并&块格式上下文

    前言问题Margin Collapsing 外边距合并Block Formatting Context 块格式化上下文解决方案参考 前言 之前在前端开发的过程中,都没有遇到外边距合并的问题(其实是因为 ...

  7. “margin塌陷” 嵌套盒子外边距合并现象

    来源于官方文档对于外边距合并的解释: 注释:只有普通文档流中块框的垂直外边距才会发生外边距合并.行内框.浮动框或绝对定位之间的外边距不会合并. 出现外边距塌陷的三种情况: 1.相邻兄弟元素之间 若两者 ...

  8. CSS外边距合并(塌陷/margin越界)

    原文 简书原文:https://www.jianshu.com/p/5f18f12cd162 大纲 1.什么是外边距合并?(折叠外边距) 2.外边距带来的影响 3.折叠的结果 4.产生折叠的原因 5. ...

  9. margin属性以及垂直外边距重叠问题

       盒子的margin属性         盒子的外边距margin 指的是当前盒子与其他盒子之间的距离,环绕在盒子周围的空白区域,属于不可见的区域,,不会影响到可见框的大小,而是会影响到盒子的位置 ...

随机推荐

  1. Alpha 冲刺(1)

    Alpha 冲刺 (1/10)   Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 ...

  2. 分享Azure DevOps技术,来微信群吧!

    现在QQ用户越来越少,基本上都转移到微信上了. 讨论问题,动不动就来一个微信群.下面这样几百人的微信群,专门讨论Azure DevOps (TFS)技术,你加入了么? 还等什么,扫描吧!

  3. GitHub 轻松提速教程

    通过修改hosts文件来提速,获取github的IP地址 访问:https://www.ipaddress.com/ 网址 依次获取以下三个网址的IP github.com github.global ...

  4. php 从2维数组组合为四维数组分析(项目中前台侧边栏导航三级分类显示)

    foreach函数(循环函数)内嵌套循环函数时,当内层完全循环完后,才会向上一级循环 数组要注意问题 array_merge----合并一个或多个数组 将一个或多个数组的单元合并起来,一个数组中的值附 ...

  5. Servlet案例2:文件下载

    首先,解决两个小问题 1.输入中文乱码问题 一个小Demo即可解决: package demo; import java.io.IOException; import java.io.PrintWri ...

  6. C# GroupBy分组的问题和解决

    起因 今天在公司做一个需求的时候,写的是面条代码,一个方法直接从头写到尾,其中用到了GroupBy,且GroupBy的KeySelector是多个属性而不是单个属性. 但是公司最近推行Clean Co ...

  7. iOS开发笔记-Xcode添加pch文件

    xcode6以后苹果取消了pch文件,需要自己创建pch文件并手动添加引用. 1.新建pch文件 2.项目Build Settings添加引用 最后检查路径是否正确,编译一下查看是否出现问题. 如果出 ...

  8. Python模块练习题

    练习题: 1.logging模块有几个日志级别? #INFO,WARNING,DEBUG,CRITICAL,ERROR 2.请配置logging模块,使其在屏幕和文件里同时打印以下格式的日志 2017 ...

  9. Adam

    Adam 方法 Adam 方法将惯性保持和环境感知这两个优点集于一身.一方面, Adam 记录梯度的一阶矩(first moment),即过往梯度与当前梯度的平均,这体现了惯性保持:另一方面,Adam ...

  10. mysql格式化时间戳为日期

    MySQL中有一个像PHP的date函数一样的日期格式化函数DATE_FORMAT,使用这个函数时,需要像下面例子这样传递一个格式字符串和时间戳 SELECT DATE_FORMAT(NOW(),&q ...