1 从一个标题开始说起
某一天,我想定义一个div
元素,于是有了下面的代码:
1 |
|
当我打开浏览器,看到了如下的页面效果:
后来,我想着,只有一个div
有些光秃秃的,于是我就想向里面添加一些内容。于是,我向当中添加了一个h2
标题
1 | <div class="container"> |
并指定了一些基本的样式:
1 | h2 { |
我满心欢喜地去查看页面的效果,结果却发现:
不得了!不得了!我的div
竟然掉了下来!
当我把h2
标题删除,换成了一个<span>
元素。页面效果如下:
可以看到,添加的span
元素并没有使得父元素div
掉下来。那为什么我添加了一个h2
标题,div
就掉了下来呢?
这就是从margin
合并开始说起了。
2 什么是margin
合并
margin
合并就是块级元素(float
、absolute
、inline-block
除外)的上外边距和下外边距会合并为单个外边距,这样的现象称为margin
合并。
margin
合并只会发生在垂直方向上(不考虑writing-mode)。
margin
合并有三种情况,将下来将逐一进行介绍。
3 相邻兄弟元素的margin
合并
第一种情况是相邻兄弟元素之间的合并,这是非常常见的,例如:
1 |
|
在上述代码中,为两个div
元素设置了10px
的外边距,查看页面效果:
可以看到,第1个元素和第二个元素垂直方向上的外边距和水平方向上的外边距一样,只有10px
的距离。这是因为第1个元素的下外边距和第2个元素的上外边距发生了合并,根据一定的规则,合并成了一个外边距。
4 父元素和首尾子元素的margin
合并
第二种情况就是父元素和首尾子元素之间的margin
合并。还记得一开始的问题吗?当给父元素div
中添加了一个h2
时,父元素div
竟然掉了下来。这是因为父元素div
和h2
发生了margin
合并。
父元素中的第一个子元素或最后一个子元素的margin
值会和父元素发生合并,会将合并的margin
作用到父元素上。
4.1 父元素和第一个子元素的合并
注意一下开篇例子的DOM结构:
1 | <div class="container"> |
由于h2
是父元素div
的第一个子元素,因此h2
的margin
值和父元素合并了,等同于作用到了父元素div
上面,因此才造成了父元素的下移。
如下图所示:
我没有设置h2
的margin
,哪里来的margin
呢?这是浏览器的默认样式。
4.2 父元素和最后一个子元素的合并
1 |
|
在上述代码中定义了两个div
,并且设置了它们垂直方向的外边距为0px
。正常情况下,这两个div
应该是紧挨着,但是查看页面效果,却不是这样的。
原因在于p
元素是第一个父元素div
的最后一个子元素,它的外边距和父元素的外边距发生了合并,等同于作用到了父元素div
上,因此,第一个div
才会和第二个div
产生了距离。
4.3 取消合并
5 空白块级元素的margin
合并
1 |
本文作者: CoderLeiShuo
本文链接:https://coderleishuo.github.io/lele/41197.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!