margin相關(guān)

一、標準盒模型和怪異模式盒模型

標準盒模型和怪異模式盒模型可以通過box-sizing來設(shè)置:
?標準盒模型: box-sizing: content-box
?怪異模式盒模型: box-sizing: border-box

兩種模型的區(qū)別:標準模式會被設(shè)置的padding撐開,而怪異模式則相當于將盒子的大小固定好,再將內(nèi)容裝入盒子。盒子的大小并不會被padding所撐開。

1.標準盒模型:盒子總寬度 = width + padding + border + margin


標準盒模型.jpg

2.怪異模式盒模型:盒子總寬度 = width + margin


怪異模式盒模型.jpg

二、margin百分比

假設(shè)我們有這樣的一段HTML代碼,外面一個DIV寬度980px,高度500px,里面有一個子元素DIV,寬度和高度都不設(shè)置,然后給他設(shè)置margin:10% 5%,這個屬性相當于margin:10% 5% 10% 5%。

HTML代碼:

<div class="demo1"> <div>這個div設(shè)置:margin:10% 5%</div> </div>

CSS代碼:

.demo1{ height:500px; width:980px; margin:0 auto; background:#EEE; overflow:hidden;} .demo1 div{margin:10% 5%; background:#666;}

這里還出現(xiàn)了一個小的hack,就是demo1盒子不會緊挨著body,也就是不會定格布局,而且body元素上面還有一段空白,這段空白的高度剛好是.demo1 div元素的margin-top,demo1和.demo1 div元素都是頂格對其的,只要給demo1元素設(shè)置overflow:hidden,即可解決這個問題。
??我們根據(jù)以往的理解,.demo1 div的margin應該是:50px 49px 50px 49px,但是運行以后,通過查看盒模型示意圖,卻發(fā)現(xiàn)是:98px 49px 98px 49px:


得出結(jié)論:

當margin設(shè)置成百分數(shù)的時候,其top right bottom left的值是參照父元素盒子的寬度進行計算,在w3c的規(guī)范中也是這樣描述的: margin 的百分比值參照其包含塊的寬度進行計算,同樣的padding如果設(shè)置成百分數(shù)的話,其盒子模型和margin是一樣的。
??這只發(fā)生在默認的 writing-mode: horizontal-tb;direction: ltr;的情況下,當書寫模式變成縱向的時候,其參照將會變成包含塊的高度。

三、關(guān)于img的margin設(shè)置問題

margin-top 和 margin-bottom 值對行內(nèi)非替換元素(non-replaced inline element)是無效的。因此我們可以指定 img 元素的 margin-top 和 margin-bottom,而非替換行內(nèi)元素(如 i,span 等)設(shè)置 margin-top 和 margin-bottom 卻不會產(chǎn)生效果。

四、margin--在同級元素(非父子關(guān)系)之間應用

(1)水平方向的外邊距合并

兩個水平方向的盒子相遇,那么最終兩者之間的距離為左邊盒子的右外邊距和右邊盒子的做外邊距之和。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平方向的兩個盒子</title>
    <style>
        *{
            margin:0;
            padding:0;
            border:0;
        }
        body{
            font-size: 0;
        }
        .left{
            width: 100px;
            height: 100px;
            background: red;
            display: inline-block;
            margin-right: 50px;
            font-size: 20px;
        }
        .right{
            width: 100px;
            height: 100px;
            background: yellow;
            display: inline-block;
            margin-left: 50px;
            font-size: 20px;
        }
    </style>
</head>
<body>
    <div class="left">寬為100px,右邊距為50px</div>
    <div class="right">寬為100px,左邊距為50px</div>
</body>
</html>

效果圖:


Paste_Image.png
補充說明:

大家可以看到,為了使得兩個div(塊狀元素)脫離正常的文檔流我使用了display:inline-block;屬性,另外,我還把body的font-size設(shè)置為0,這樣可以解決inline-block自身的問題,否則兩個div的舉例會大于100px。當然使用float也可以使得兩個div出現(xiàn)在同一行中。

如果使用display: inline-block;,則會出現(xiàn)一個bug,例如li、a把設(shè)置成display: inline-block;,然后把padding和margin都設(shè)置為0還是會出現(xiàn)空隙,如:


此時有兩種方法設(shè)置間距為0:
1.將設(shè)置display: inline-block;的元素寫在一行。

2.將父元素設(shè)置為font-size: 0。

(2)豎直方向的外邊距合并

兩個豎直方向的盒子相遇時,其豎直方向的距離等于上方盒子的下外邊距和下方盒子的上外邊距中較大的一個。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平方向的兩個盒子</title>
    <style>
        *{
            margin:0;
            padding:0;
            border:0;
        }
        .top{
            width: 100px;
            height: 100px;
            margin-bottom: 100px;
            background: red;
        }
        .bottom{
            width: 100px;
            height: 100px;
            margin-top: 50px;
            background: green;
        }
    </style>
</head>
<body>
    <div class="top">高為100px,下邊距為100px</div>
    <div class="bottom">高為100px,上邊距為50px</div>
</body>
</html>

此時兩個塊之間的間隙為100px,而非100+50px。

另外一個有趣的例子就是:假設(shè)有一個元素同時設(shè)置了margin-top和margin-bottom,但是內(nèi)容為空,那么這兩個margin值也會疊加,值為兩者最大的一個,它類似與豎直方向上兩個盒子margin值的疊加。代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平方向的兩個盒子</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
 
        .top{
            width: 500px;
            height: 100px;
            background: red;
        }
        .middle{
            margin-top: 100px;
            margin-bottom:50px;
        }
        .footer{
            width: 500px;
            height: 100px;
            background: green;
        }
 
    </style>
</head>
<body>
    <div class="top">上面的div,高100px</div>
    <div class="middle"></div>
    <div class="footer">下面的div,高100px</div>
</body>
</html>

我們發(fā)現(xiàn)這時在上面的div和在下面的div之間的舉例并不是100+50=150px,而是兩者中的最大者,即100px。

(3)margin--在父元素和子元素之間應用(重點)

(1)在子元素中設(shè)置水平方向的margin值,父元素設(shè)置padding:父子元素距離為margin+padding,不會疊加;
??(2)在子元素中設(shè)置豎直方向的margin值:margin-top: 100px;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>margin</title>
    <style>
        *{padding:0; margin:0; border:0;}
        .father{
            width: 500px;
            height: 500px;
            background: red;
        }
        .son{
            width: 100px;
            height: 100px;
            background: green;
            margin-top: 100px;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son">高度為100px,margin-top為100px。</div>
    </div>
</body>
</html>

效果如下:



??我們希望子元素的上部距離父元素的上部為100px,可是我們看到的卻是父元素的上部距離瀏覽器頁面的上部有100px的距離,實際上這是因為當父元素沒有設(shè)置padding值以及border值時,出現(xiàn)了一個bug--父元素的上方與子元素的上方完全重合在了一起,無法分開。所以才會導致上述這種父元素和子元素同時向下的情況。

對于這種問題解決方法有下面幾種:
  • 方法一:給父元素添加padding-top值
  • 方法二:給父元素添加border值
  • 方法三:給父元素添加屬性overflow:hidden;
  • 方法四:給父元素或者子元素聲明浮動float;
  • 方法五:使父元素或子元素聲明為絕對定位:position:absolute;
  • 方法六:給父元素添加屬性 overflow:auto; positon:relative;

轉(zhuǎn)載自 http://www.cnblogs.com/zhuzhenwei918/p/6124263.html

margin的高度塌陷總結(jié):

在標準文檔流中,豎直方向上的margin不疊加,以較大的為準,水平方向疊加無塌陷,如果不在標準文檔流中(例如絕對定位,浮動),無塌陷現(xiàn)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 14,113評論 1 92
  • margin與可視尺寸,適用范圍:1、沒有設(shè)定width/height的普通block水平元素2、只適用于水平方向...
    大瓶綠茶閱讀 569評論 0 0
  • 本課來自http://www.imooc.com/learn/9請不要用作商業(yè)用途。 HTML5 HTML介紹 H...
    PYLON閱讀 3,447評論 0 5
  • 1.在什么場景下會出現(xiàn)外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 概念:在CSS當...
    饑人谷_任磊閱讀 838評論 0 3
  • 一 外部式css樣式 (也可稱為外聯(lián)式)就是把css代碼寫一個單獨的外部文件中,這個css樣式文件以“.css...
    KunMitnic閱讀 1,119評論 0 1

友情鏈接更多精彩內(nèi)容