使用float元素引起的margin-top问题

如下代码所示,我给div2加上margin-top属性,div1怎么也跟着有了margin-top属性呢?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>absolute + margin auto</title>
    <style type="text/css">
        div {
            width: 100px;
            height: 100px;
        }
        #div1 {
            background-color: red;
            float: left;
        }
        #div2 {
            margin-top: 30px;
            background-color: green;
        }
    </style>
</head>
<body>
    <div id="div1"></div>
    <div id="div2"></div>
</body>
</html>

clipboard.png

当我给div1也加上margin-top属性值的时候,div1竟然好像相对于div2进行上外边距的计算:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>absolute + margin auto</title>
    <style type="text/css">
        div {
            width: 100px;
            height: 100px;
        }
        #div1 {
            background-color: red;
            float: left;
            margin-top: 10px;
        }
        #div2 {
            margin-top: 30px;
            background-color: green;
        }
    </style>
</head>
<body>
    <div id="div1"></div>
    <div id="div2"></div>
</body>
</html>

clipboard.png

阅读 4.6k
4 个回答

根本原因是div2body发生了上边距的父子折叠,导致两者的顶部是重叠的。

div1会向上浮动到body的顶部,看起来就是div1dvi2的顶部重叠了。

至于给div1加了上边距之后,它看起来好像是相对div2向下移动,还是因为div2body顶部重叠的原因,div1实际上是相对body移动的。

这是由于盒模型垂直外边距折叠引起的。

折叠规则
相邻的外边距都是正数时,折叠结果是两者间较大的值。
相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。
两个外边距一正一负时,折叠结果是两者的和。

这里是body的顶边距(margin-top)跟div2的顶边距折叠了,所以整个body都下来了,此时body的margin-top取值30px。而div1浮动脱离了文档流,所以跟div2重叠了,然而因为div1是body的子节点,所以也被body带下来了。

更详细的边距折叠问题和浮动的一些问题,可以看这里:一行文字左浮动,一行不浮动,二者不对齐?

出现这种情况是因为div1设置浮动float的原因造成的,
你要是想div1受div2影响,清除div2的浮动就可以。

#div2 {
            margin-top: 30px;
            background-color: green;
            clear: both;
        }

他们说的已经很好了,我也没有什么可以说的了。那就说说怎么查这个东西吧。

先说margin,原理呢就是上边说的合并了。你可以打开控制台,然后选择元素自己看看body的位置。当然了,我比较坏设置一下body{border: 1px solid #f00}你会发现他们就合并不了了,当然不让合并还有其他的方法。

#div2一个overflow:hidden;你会发现float被挤走了。原理查查BFC

重叠呢,换一下两个div的顺序,是不是不一样。或者你找一些文字。看看块在下面,但是文字挤出来了。去看看

MDN-float

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题