margin(垂直外邊距合并、margin負值)

垂直外邊距合并的問題

外邊距合并出現(xiàn)的三個場景
  • 同一個BFC,且同處于普通流中的垂直相鄰元素外邊距合并
  • 父子元素的外邊距合并
  • 空元素的外邊距合并
合并規(guī)則
  • 兩個margin都是正值的時候,取兩者的最大值;
  • 當(dāng) margin 都是負值的時候,取的是其中絕對值較大的,然后,從0位置,負向位移;
  • 當(dāng)有正有負的時候,先取出負 margin 中絕對值中最大的,然后,和正 margin 值中最大的 margin 相加。
  • 所有毗鄰的margin要一起參與運算,不能分步進行
不讓相鄰元素外邊距合并的方法
  • 被非空內(nèi)容、padding、border 或 clear 分隔開
  • 不在一個普通流中或一個BFC中
  • margin在垂直方向上不毗鄰
  • 如果我們想減少這種情況的發(fā)生:在實際編寫過程中,應(yīng)盡量避免同時使用margin-bottommargin-top
    <style type="text/css">
    *{
        padding: 0;
        margin: 0;
    }

    .clearfix:after {
        content: " ";
        display: table;
        clear: both;
    }

    .parent {
        /* 對于這種父子外邊距合并的情況,除了了讓父元素形成BFC,給其加 padding 或 border 都可以 */
        margin-top: 50px;
        /*border: 1px solid red;*/
        /*padding: 1px 0;*/
        background-color: teal;
        /*overflow: hidden;*/
    }

    .parent > div {
        width: 100px;
        height: 100px;
    }

    .child1 {
        clear: right;
        margin-top: 50px;
        margin-bottom: 50px;
        background-color: lightblue;
    }

    .child2 {
        margin-top: 50px;
        background-color: lightcoral;
        opacity: 0.8;
    }
    </style>
</head>
<body>
<div class="parent">
    <div class="child1"></div>
    <!-- 添加內(nèi)容 -->
    <div class="child2"></div>
</div>
</body>
總結(jié)
  • 這些 margin 都處于普通流中,并在同一個BFC中;
  • 這些 margin 沒有被非空內(nèi)容、padding、border 或 clear 分隔開;
  • 這些 margin 在垂直方向上是毗鄰的,包括以下幾種情況:
    • 一個 box 的 top margin 與第一個子box 的 top margin
    • 一個 box 的 bottom margin 與最后一個子box 的 bottom margin,但須在該box 的 height 為 auto 的情況下
    • 一個 box 的 bottom margin 與緊接著的下一個 box 的 top margin
    • 一個 box 的 top margin 與其自身的 bottom margin,但須滿足沒創(chuàng)建BFC、零min-height、零或者“auto”的 height、沒有普通流的子元素
  • 例外的情況:
    • 根元素(html)的外邊距不會參與折疊
    • 設(shè)置任何屬性的空span和空div不影響任何布局,可以無視之。

margin負值

表現(xiàn)
  • 雖然margin可以應(yīng)用到所有元素,但display屬性不同時,表現(xiàn)也不同
    • block元素可以使用四個方向的margin值
    • inline元素使用上下方向的margin值無效
    • inline-block使用上下方向的margin負值看上去無效:這與其默認的vertical-align: baseline;有關(guān)系,當(dāng)垂直對齊的屬性值為其它值時,則會顯示不同的視覺效果
重疊
  • margin負值并不總是后面元素覆蓋前面元素,它與元素display屬性有關(guān)系
    • 兩個block元素重疊時,后面元素可以覆蓋前面元素的背景,但無法覆蓋其內(nèi)容
    • 當(dāng)兩個inline元素,或兩個line-block元素,或inline與inline-block元素重疊時,后面元素可以覆蓋前面元素的背景和內(nèi)容
    • 當(dāng)inline元素與block元素重疊時,inline的元素覆蓋block元素的背景和內(nèi)容
    • 當(dāng)inline-block元素與block元素重疊時,inline-block元素覆蓋block元素的背景,但無法覆蓋其內(nèi)容
浮動
  • block元素與浮動元素重疊時,其邊框和背景在該浮動元素之下顯示,而內(nèi)容在浮動元素之上顯示
  • inline或inline-block元素與浮動元素重疊時,其邊框、背景和內(nèi)容都在該浮動元素之上顯示
定位
  • 定位元素(position不為static)覆蓋其他元素的背景和內(nèi)容
  • 將relative屬性值應(yīng)用于inline元素,由于無法改變其行內(nèi)元素的本質(zhì),所以其上下margin依然存在問題
應(yīng)用
  • 水平垂直居中:由于margin的百分比相對于包含塊的寬度,所以在需要居中的元素外面套一個空的<div>元素,并且利用absolute的包裹性,使該元素的寬高等于需要定位的元素的寬高
    <style type="text/css">
    .box{
        position:relative;
        width: 200px;
        height: 200px;
        border: 2px solid black;
        background-color: lightgreen;
    }
    
    .out{
        position: absolute;
        left: 50%;
        top: 50%;
    } 
       
    .in{
        height: 100px;
        width: 100px;
        margin-left: -50%;
        margin-top: -50%;
        background-color: pink;
    }
    </style>
</head>
<body>
<div class="box">
    <div class="out">
        <div class="in">測試內(nèi)容</div>    
    </div>    
</div>   
</body>
  • 列表項兩端對齊:在列表項外面包一層元素,使用margin負值來將最后一個列表項拉回來
    <style type="text/css">
    ul{
        margin: 0;
        padding: 0;
        list-style:none;
    }

    .box{
        width: 200px;
        background-color: pink;    
    }

    .list{
        overflow: hidden;
        margin-right: -10px;
    }

    .in{
        float: left;
        width: 60px;
        height: 100px;
        margin-right: 10px;
        background-color: lightgreen;
    }
    </style>
</head>
<body>
<div class="box">
    <ul class="list">
        <li class="in">1</li>
        <li class="in">2</li>
        <li class="in">3</li>
    </ul>    
</div>  
</body>
  • 三欄自適應(yīng)布局:中間的主體使用雙層標(biāo)簽,外層<div>寬度100%顯示,并且浮動,內(nèi)層<div>為真正的主體內(nèi)容,含有左右210px的margin值。左欄和右欄都采用margin負值。左欄左浮動,margin-left為-100%,正好使左欄位于頁面左側(cè)。右欄左浮動,大小為其本身的寬度200px
    <style type="text/css">
    html,body{
        height: 100%;
    }

    body{
        margin: 0;
    }

    .main{
        float: left;
        width: 100%;
        height: 100%;
    }

    .main .in{
        height: 100%;
        margin: 0 210px;
        background-color: pink;
    }

    .left,.right{
        float: left;
        width: 200px;
        height: 100%;
        background-color: lightgreen;
    }

    .left{
        margin-left: -100%;
    }

    .right{
        margin-left: -200px;
    }
    </style>
</head>
<body>
<div class="main">
    <div class="in">in</div>
</div>
<div class="left">left</div>
<div class="right">right</div>
</body>
  • 三欄等高布局:給每欄設(shè)置大的底部內(nèi)邊距,然后用數(shù)值相同的負外邊距消除這個高度,然后在外層容器中設(shè)置overflow: hidden;
    <style type="text/css">
    body{
        overflow: hidden;
        margin: 0;
    }

    ul{
        margin: 0;
        padding: 0;
        list-style: none;
    }

    .list{
        overflow: hidden;
        width: 100%;
        height: 100%;
    }

    .main{
        margin: 0 210px;
        background-color: lightgreen;
    }

    .left{
        float: left;
        width: 200px;
        background-color: pink;
    }

    .right{
        float: right;
        width: 200px;
        background-color: pink;
    }

    .main,.left,.right{
        margin-bottom: -9999px;
        padding-bottom: 9999px;
    }
    </style>
</head>
<body>
<ul class="list">
    <li class="left">左側(cè)文字比較少</li>
    <li class="right">右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多右側(cè)文字比較多</li>
    <li class="main">中間文字比較少</li> 
</ul>
</body>
最后編輯于
?著作權(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)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J的外補...
    _Yfling閱讀 14,121評論 1 92
  • relative:生成相對定位的元素,通過top,bottom,left,right的位置相對于其正常位置進行定位...
    zx9426閱讀 1,073評論 0 2
  • 1.在什么場景下會出現(xiàn)外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 概念:在CSS當(dāng)...
    饑人谷_任磊閱讀 843評論 0 3
  • 一,浮動元素有什么特征?對父容器、其他浮動元素、普通元素、文字分別有什么影響? 浮動模型是一種可視化格式模型,浮動...
    DeeJay_Y閱讀 1,000評論 0 4
  • 一、在什么場景下會出現(xiàn)外邊距合并?如何合并?如何不讓相鄰元素外邊距合并?給個父子外邊距合并的范例 在CSS當(dāng)中,相...
    dengpan閱讀 689評論 0 0

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