margin合并及解决办法

作者: 手指乐 | 来源:发表于2019-10-03 17:46 被阅读0次

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。
合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者
水平方向不会发生合并
只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框、浮动框或绝对定位之间的外边距不会合并。

  • 情况1
    当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            margin: 0px;
            padding: 0px;
        }
        div{
            border: 1px solid black;
        }
        .div1{
            margin-bottom: 20px;
        }
        .div2{
            margin-top: 10px;
        }
    </style>
</head>
<body>
    <div class="div1">divtest1</div>
    <div class="div2">divtest2</div>
</body>
</html>
  • 情况2
    当一个元素包含在另一个元素中时(假设没有内边距或边框把外边距分隔开),它们的上和/或下外边距也会发生合并。
    合并后的外边距加在父元素上


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
         *{
            margin: 0px;
            padding: 0px;
        }
      
        .div1{
            margin-top: 20px;
            background: blue;
        }
        .div2{
            margin: 10px;
            background: green;
        }
    </style>
</head>
<body>
    <div class="div1">
        <div class="div2">test</div>
    </div>
</body>
</html>

如果子元素margin为30,总margin就是30,而且也会加在父元素上

  • 情况3
    外边距也可以与自身发生合并。
    假设有一个空元素,它有外边距,但是没有边框或填充。在这种情况下,上外边距与下外边距就碰到了一起,它们会发生合并。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
         *{
            margin: 0px;
            padding: 0px;
        }
      
        .div1{
            margin-top: 20px;
            margin-bottom: 10px;
            background: blue;
        }
 
        .div2{
            background: red;
        }
         
    </style>
</head>
<body>
    <div class="div1"></div>
    <div class="div2">div2</div>
</body>
</html>
  • 使用float消除合并
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            margin: 0px;
            padding: 0px;
        }
        div{
            border: 1px solid black;
        }
        .div1{
            margin-bottom: 20px;
        }
        .div2{
            margin-top: 10px;
            float: left;
            width: 100%;
        }
    </style>
</head>
<body>
    <div class="div1">divtest1</div>
    <div class="div2">divtest2</div>
</body>
</html>

float会脱离文档流,后面的元素会占据它的位置,但是它不能占据前面的元素的位置
上例改成div1 float left,div2不变,则div2会占据div1的位置,反生重叠

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
        }
 
        .div1 {
            width: 200px;
            height: 200px;
            margin-top: 30px;
            background: blue;
        }
 
        .div2 {
            width: 100px;
            height: 100px;
            margin-top: 20px;
            background: green;
            float: left;
        }
    </style>
</head>
 
<body>
    <div class="div1">
        <div class="div2">test</div>
    </div>
</body>
 
</html>

可以看到float的元素,margin是相对其包含框的

  • 使用绝对定位消除合并
    上面的float:left改成position: absolute效果一样
    position: absolute不设置位置的情况下,默认还在正常文档流的位置

  • 使用inline-block消除合并
    上面的float:left改成display: inline-block效果一样

  • 使用伪元素把盒子上下封起来,封起来的盒子不会发生margin合并

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="bootstrap.min.css">
    <title>Document</title>
    <style>
        .div1 {
            height: 200px;
            width: 200px;
            margin-top: 30px;
            background: blue;
        }
 
        .div1::before{
            display: table;
            content: "";
        }
 
        .div2 {
            height: 100px;
            width: 100px;
            margin-top: 20px;
            background: green;
        }
    </style>
</head>
 
<body>
    <div class="div1">
        <div class="div2">abc</div>
    </div>
</body>
 
</html>

before伪元素显示为table相当于把div盒子顶部封起来,防止嵌套顶部margin合并
同理,after伪元素可以把下面封起来

相关文章

  • margin合并及解决办法

    外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度...

  • html css

    1.margin 塌陷,与margin合并 margin合并不解决,直接设置一个box的margin即可 marg...

  • 为什么会外边距合并,怎么处理margin塌陷(盒模型)

    Margin合并,相邻元素会合并 没有padding,border,则相邻 margin上下会合并,左右不会 父元...

  • margin的合并

    我们在给div设置margin属性的时候,会出现margin 合并的问题。 Q:什么是margin合并呢? A:我...

  • css问题搜集

    margin 负值问题margin百分比margin外边距合并合并外边距2深入理解line-heightflexb...

  • margin合并

    以前学上下方向上margin会合并,就是单纯的知道,margin塌陷了,要形成BFC overflow:hidde...

  • margin合并

    margin合并是什么? 我们来简单看一下MDN对margin合并的解释: 块的顶部外边距和底部外边距有时被组合(...

  • margin合并

    两个相邻元素如果处于同一个BFC中,那么它们就会发生margin合并。代码举例 红色父元素和黄色子元素的上下mar...

  • margin 合并、盒模型

    margin 上下会合并

  • 2019-07-17margin-top失效、

    margin-top失效及解决办法 现象: 当两个空的块级元素嵌套时,如果内部的块设置有margin-top属性,...

网友评论

    本文标题:margin合并及解决办法

    本文链接:https://www.haomeiwen.com/subject/ffidpctx.html