【转】position跟display、overflow、float相互作用下的margin折叠

外边距折叠(margin collapse)指两个或多个margin毗邻元素间发生的两个外边距折叠为一个的现象,是在网页布局中经常需要考虑到的问题。

所谓margin毗邻,可以总结为:

  • 这两个或多个外边距没有被非空内容、padding、border 或 clear 分隔开。
  • 这些 margin 都处于普通流中。
  • 1.两个或多个毗邻的普通流中的块元素垂直方向上的 margin 会折叠。

    注意一点,在没有被分隔开的情况下,一个元素的 margin-top 会和它普通流中的第一个子元素(非浮动元素等)的 margin-top 相邻; 只有在一个元素的 height 是 "auto" 的情况下,它的 margin-bottom 才会和它普通流中的最后一个子元素(非浮动元素等)的 margin-bottom 相邻。

    示例代码:

    <div style="border:1px solid red; width:100px;">
        <div style="margin:50px 0; background-color:green; height:50px; width:50px;">
           <div style="margin:20px 0;">
               <div style="margin:100px 0;">B</div>
           </div>
        </div>
    </div>

    效果图:

    以上代码中,margin 会把 B 的包含块撑开。

    如果一个元素的 height 特性的值不是 auto,那么它的 margin-bottom 和它子元素的 margin-bottom 不算相邻,因此,不会发生折叠。 margin-top 没有此限制,所以是 100px,margin-bottom 没有折叠,只有 50px。

    垂直方向

    是指具体的方位,只有垂直方向的 margin 才会折叠,也就是说,水平方向的 margin 不会发生折叠的现象。

    折叠后 margin 的计算
    1). 参与折叠的 margin 都是正值

    例子:

    <div style="height:50px; margin-bottom:50px;width:50px; background-color: red;">A</div>
    <div style="height:50px;margin-top:100px; width:50px; background-color: green;">B</div>

    示意图:

    在 margin 都是正数的情况下,取其中 margin 较大的值为最终 margin 值。

    2). 参与折叠的 margin 都是负值

    当 margin 都是负值的时候,取的是其中绝对值较大的,然后,从 0 位置,负向位移。

    示例代码:

    <div style="height:100px; margin-bottom:-75px;width:100px; background-color: red;">A</div>
    <div style="height:100px;margin-top:-50px; margin-left:50px; width:100px; background-color: green;">B</div>

    示意图:

    3). 参与折叠的 margin 中有正值,有负值

    如果,毗邻的 margin 中有正值,同时存在负值会怎样呢?有正有负,先取出负 margin 中绝对值中最大的,然后,和正 margin 值中最大的 margin 相加。

    示例代码:

    <div style="height:50px; margin-bottom:-50px;width:50px; background-color: red;">A</div>
    <div style="height:50px;margin-top:100px; width:50px; background-color: green;">B</div>

    示意图:

    上面的例子最终的 margin 应该是 100 + (-50) = 50px。

    4). 相邻的 margin 要一起参与计算,不得分步计算

    要注意,相邻的元素不一定非要是兄弟节点,父子节点也可以,即使不是兄弟父子节点也可以相邻。

    而且,在计算时,相邻的 margin 要一起参与计算,不得分步计算。

    一个复杂的实例:

    <div style="margin:50px 0;background-color:green; width:50px;">
        <div style="margin:-60px 0;">
               <div style="margin:150px 0;">A</div>
        </div>
    </div>
    <div style="margin:-100px 0;background-color:green; width:50px;">
        <div style="margin:-120px 0;>
               <div style="margin:200px 0;">B</div>
        </div>
    </div>

    错误的计算方式:算 A 和 B 之间的 margin,分别算 A 和其父元素的折叠,然后与其父元素的父元素的折叠,这个值算出来之后,应该是 90px。依此法算出 B 的为 80px;然后,A和B折叠,margin 为 90px。

    请注意,多个 margin 相邻折叠成一个 margin,所以计算的时候,应该取所有相关的值一起计算,而不能分开分步来算。

    以上例子中,A 和 B 之间的 margin 折叠产生的 margin,是6个相邻 margin 折叠的结果。将其 margin 值分为两组:

  • 正值:50px,150px,200px
  • 负值:-60px,-100px,-120px
  • 根据有正有负时的计算规则,正值的最大值为 200px,负值中绝对值最大的是 -120px,所以,最终折叠后的 margin 应该是 200 + (-120) = 80px。
    2.浮动元素、inline-block 元素、绝对定位元素的 margin 不会和垂直方向上其他元素的 margin 折叠

    浮动元素的 margin 在垂直方向上也不会发生 margin 折叠,即使和它相邻的子元素也不会。

    <div style="margin-bottom:50px;width:50px; height:50px; background-color:green;">A</div>
    <div style="margin-top:50px; width:100px; height:100px; background-color:green; float:left;">
        <div style="margin-top:50px;background-color:gold;">B</div>
    </div>

    示意图:

    两个绿色的块儿之间,相距100px,而若 B 和它的浮动包含块发生 margin 折叠的话,金色的条应该位于绿色块的最上方,显然,没有发生折叠。inline-block 元素、绝对定位元素的 margin同样如此, 不会和垂直方向上其他元素的 margin 折叠。

    3.创建了块级格式化上下文的元素,不和它的子元素发生 margin 折叠

    以 “overflow : hidden” 的元素为例:

    <div style="margin-top:50px; width:100px; height:100px; background-color:green; overflow:hidden;">
        <div style="margin-top:50px; background-color:gold;">B</div>
    </div>

    若 B 和它的 "overflow:hidden" 包含块发生 margin 折叠的话,金色的条应该位于绿色块的最上方,否则,没有发生。

    示意图:

    最后

    原文地址      http://www.cnblogs.com/jackyWHJ/p/3756087.html

    原文是关于position、float、display、overflow与collapse之间关系的一篇文章,原作者写的很全面,图例丰富,这样的写法值得学习。

  • 本文只是其中关于margin折叠的部分,基本用的是原文的文字、代码、图例,感谢前人栽阴。下一篇博客是关于原文中position、float、display、overflow相互作用的部分。
时间: 2024-11-10 08:52:16

【转】position跟display、overflow、float相互作用下的margin折叠的相关文章

position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?

这是寒冬大神提出的一个题目,刚开始看到这题的时候完全不知道从什么地方回答起好,题目内容比较广泛,找不到针对点.后来我觉得这个题目应该能拆成几个点来回答:1.'display'.'position' 和 'float' 的相互关系:2.position跟display.overflow.float下的margin collapse. 一.'display'.'position' 和 'float' 的相互关系 首先我们先来看下这3个属性. display 属性规定元素应该生成的框的类型. bloc

CSS position overflow float 属性 详解

position  overflow float 几个属性比较容易混淆,写一段代码详解各自具体情况: position在w3school的可能取值: 值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定. fixed 生成绝对定位的元素,相对于浏览器窗口进行定位. 元素的位置通过

css(display,float,position)

display 用来设置元素的显示方式 display : block | none | inline | inline-block inline:指定对象为内联元素 block:指定对象为块元素 inline-block:指定对象为内联块元素 none:隐藏对象 float 控制元素是否浮动显示 float : none | left | right none:设置对象不浮动 left:设置对象浮在左边 right:设置对象浮在右边 浮动的目的: 就是要打破文档流的默认显示规则.如果要让元素按

转发- css(display,float,position)

此文章仅为转发,非原创,原文http://www.cnblogs.com/zhuanggege/p/5778309.html 请支持原创 display 用来设置元素的显示方式 display : block | none | inline | inline-block inline:指定对象为内联元素 block:指定对象为块元素 inline-block:指定对象为内联块元素 none:隐藏对象 float 控制元素是否浮动显示 float : none | left | right non

10步掌握CSS布局定位: position static relative absolute float

无意中看到此文,因作者强调其中避开了浏览器bug/分歧,所以个人认为值得借鉴. 不才仔细看了此文,自觉受益匪浅 ,屡试不爽,佩服作者对css布局的精炼总结,顺便小译了一段, 英文水平有限,且个人通常写写php,对css了解不深却有点兴趣,错误之处还请指正. 个人没有空间,代码中的css文件和js保留了完整路径:http://www.barelyfitz.com/screencast/html-training/css/positioning/ 原文地址:http://www.barelyfitz

CSS学习------CSS定位(position)与浮动(float)

position属性:用来对元素进行定位 定位的意义: 定位允许你定义元素框相对于其正常位置应该出现的位置. 相对于父元素. 相对于另一个元素. 相对于浏览器窗口本身的位置. 定位分为:绝对定位和相对定位. 相对定位: 如果对一个元素进行相对定位,它将出现在它所在的位置上.然后,可以通过设置垂直或水平位置,让这个元素"相对于"它的起点进行移动. 在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间.因此,移动元素会导致它覆盖其它框. 示例: <html>   <

有效防止softmax计算时上溢出(overflow)和下溢出(underflow)的方法

<Deep Learning>(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了上溢出(overflow)和下溢出(underflow)对数值计算的影响,并以softmax函数和log softmax函数为例进行了讲解.这里我再详细地把它总结一下. 『1』什么是下溢出(underflow)和上溢出(overflow) 实数在计算机内用二进制表示,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这

display、 float 、position

1. display(元素显示模式) display 属性用来设置元素的显示方式. block 块对象指的是元素显示为一个方块,默认显示状态下将占据整行,其它的元素只能另起一行显示. inline 行间对象与block刚好相反,它允许其它元素在同一行显示. none 隐藏对象 CSS Display - 块和内联元素 块元素是一个元素,占用了全部宽度,在前后都是换行符. 块元素的例子: <h1>.<p>.<div> 内联元素只需要必要的宽度,不强制换行. 内联元素的例子

505,display,float,position之间的关系(有疑问)

(display属性设置元素如何显示) 如果display取值为none,那么position和float都不起作用,这种情况下元素不产生框 否则,如果position设置框是绝对定位,float的计算值就为none,display根据下面的表格进行调整 否则,float不是none,框是浮动的,display根据下表进行调整 否则,如果元素是根元素,display根据下表进行调整 其他情况下,display的值是指定值 总之:绝对定位,浮动,根元素都需要调整display 原文地址:https