西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)其它知識(shí) → CSS框模型中外邊距(margin)折疊圖文詳解

CSS框模型中外邊距(margin)折疊圖文詳解

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2012/9/18 16:57:41字體大小:A-A+

作者:佚名點(diǎn)擊:369次評(píng)論:0次標(biāo)簽: CSS

最近做了個(gè)項(xiàng)目,居然在一個(gè)小小的css問題上折騰了很久很是糾結(jié)——外邊距折疊的問題。今天難得清閑,就把這個(gè)問題研究了一下,才發(fā)現(xiàn)大有學(xué)問,所以寫篇博文整理一下,以便更加牢記!

  外邊距折疊,指的是毗鄰的兩個(gè)或多個(gè)外邊距 (margin) 在垂直方向會(huì)合并成一個(gè)外邊距。

  觸發(fā)條件

 毗鄰,沒有被非空內(nèi)容、paddingborder 或 clear 分隔開的margin特性. 非空內(nèi)容就是說這元素之間要么是兄弟關(guān)系或者父子關(guān)系

 這些 margin 都處于普通流中,即非浮動(dòng)元素,非定位元素

  垂直方向外邊距合并的計(jì)算

  1) 參加折疊的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>

  示意圖:
      

   2). 參與折疊的 margin 都是負(fù)值:取的是其中絕對(duì)值較大的,然后,從 0 位置,負(fù)向位移。

<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 中有正值,有負(fù)值:先取出負(fù) margin 中絕對(duì)值中最大的,然后,和正 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>

   示意圖:
      

  4). 相鄰的 margin 要一起參與計(jì)算,不得分步計(jì)算

  要注意,相鄰的元素不一定非要是兄弟節(jié)點(diǎn),父子節(jié)點(diǎn)也可以,即使不是兄弟父子節(jié)點(diǎn)也可以相鄰。

  而且,在計(jì)算時(shí),相鄰的 margin 要一起參與計(jì)算,不得分步計(jì)算。

<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>

  錯(cuò)誤的計(jì)算方式:算 A 和 B 之間的 margin,分別算 A 和其父元素的折疊,然后與其父元素的父元素的折疊,這個(gè)值算出來之后,應(yīng)該是 90px。依此法算出 B 的為 80px;然后,A和B折疊,margin 為 90px。

  請(qǐng)注意,多個(gè) margin 相鄰折疊成一個(gè) margin,所以計(jì)算的時(shí)候,應(yīng)該取所有相關(guān)的值一起計(jì)算,而不能分開分步來算。

  以上例子中,A 和 B 之間的 margin 折疊產(chǎn)生的 margin,是6個(gè)相鄰 margin 折疊的結(jié)果。將其 margin 值分為兩組:

  正值:50px,150px,200px

  負(fù)值:-60px,-100px,-120px

  根據(jù)有正有負(fù)時(shí)的計(jì)算規(guī)則,正值的最大值為 200px,負(fù)值中絕對(duì)值最大的是 -120px,所以,最終折疊后的 margin 應(yīng)該是 200 + (-120) = 80px。

  

  5). 浮動(dòng)元素、inline-block 元素、絕對(duì)定位元素的 margin 不會(huì)和垂直方向上其他元素的 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>

  示意圖:
      

  6). 創(chuàng)建了塊級(jí)格式化上下文1的元素,不和它的子元素發(fā)生 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" 包含塊發(fā)生 margin 折疊的話,金色的條應(yīng)該位于綠色塊的最上方,否則,沒有發(fā)生。

  示意圖:
    

  7). 元素自身的 margin-bottom 和 margin-top 相鄰時(shí)也會(huì)折疊

  自身 margin-bottom 和 margin-top 相鄰,只能是自身內(nèi)容為空,垂直方向上 border、padding 為 0。

<div style="border:1px solid red; width:100px;">
    <div style="margin-top: 100px;margin-bottom: 50px;"></div>
</div>

  以上代碼運(yùn)行后,我們講得到的是紅色邊框的正方形,方框的寬高都應(yīng)該是 100px,高度不應(yīng)該是 150px。

  示意圖:
    

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)