一个div包着另一个div, 如下代码所示, 如果我设置内部div上边距100px, 则这两个div都会距离浏览器上边缘100px的距离,
<div style="width:400px;height:400px;background-color:blue;">
<div style="width:200px;height:200px;margin-top:100px;background-color:red;"></div>
</div>
但如果给外部div加上边框的话, 则外部div距离浏览器上边缘就是0, 而内部div与外部div有一个100px的间距, 不明白这是为什么?外部div加边框的代码如下
<div style="width:400px;height:400px;background-color:blue;border-style:solid;">
<div style="width:200px;height:200px;margin-top:100px;background-color:red;"></div>
</div>
楼主的问题可以分解成几个点
1、重叠发生的机制
2、border如何阻止了重叠
3、重叠解决方案
重叠发生的常见情况
1.元素互为相邻关系
2.元素互为包含关系(父子关系)
重叠发生的机制
无论是相邻关系还是包含关系,重叠发生依赖于两个元素的margin能够相互接触到!!相互触碰到!相互摩擦!
相邻关系
如果添加border或者padding还会发生重叠吗?答案是肯定的。
不论如何设置padding或者border,对于相邻元素来说,它们的margin都能互相接触!!!!!所以会发生重叠。
包含关系
注意,这时候border,padding都是0.父元素的margin和子元素的margin能够相互接触到。
如果给父元素加个padding或者border,那么子元素的margin就无法接触到父元素的margin了。因此也无法发生重叠了!这里以border为例。
如果给子元素添加border或者padding是不起作用的。
外边距重叠的解决方式
1.创建BFC(BFC是个坑,以后再聊吧)
2.避免margin的亲密接触。
---------------------------------------1月19更新部分(为加深理解)---------------------------------
刚好看到这个例子,便试了下,觉得可以算是测试margin负值的理解吧。
首先来考虑下这段代码。
这里有各种重叠,ul的负外边距、h1的负外边距以及li的正外边距。
以上代码运行的效果最终效果是:
1.文字描述:ul和h1之间相间隔2px
2.实际效果图
为什么会这样呢?
这个问题的思路有两种,
一、是先考虑ul和li之间的重叠,再考虑h1的重叠。(先考虑包含关系再考虑相邻关系)
二、是先考虑ul和h1的重叠,再考虑li的重叠。(先考虑相邻关系再考虑包含关系)
最终得到的结果都一样。