外边距坍塌

  本文根据MDN以及经css精通书上的内容进行了一些关于外边距坍塌问题的总结!

  对于一个块级元素来说,如果有两个或者更多的垂直外边距相遇时,会发生“坍塌”,即结合为一个外边距,而这个外边距的高度值等于发生叠加的外边距高度中的较大者。并且,值得注意的是:“只有普通文档流中的块级元素垂直外边距才会发生外边距坍塌现象;对于行内框、浮动框以及绝对定位框之间的外边距不会发生坍塌”!

  外边距坍塌分为三种类型:

1. 相邻元素(Ajacent sibilings)

  当一个元素出现在另一个元素上面时,第一个元素的底外边距与第二个元素的顶外边距发生叠加。

例如:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8" />
 5     <title>Document</title>
 6     <style type="text/css">
 7         * {
 8             margin: 0;
 9             padding: 0;
10         }
11 
12         div {
13             width: 50px;
14             height: 50px;
15             text-align:center;
16             border: 1px solid #000;
17         }
18 
19         div:nth-child(1) {
20             margin:20px 0;
21             background-color:yellow;
22         }
23 
24         div:nth-child(2) {
25             margin:10px 0;
26             background-color:green;
27         }
28     </style>
29 </head>
30 <body>
31         <div>BOX1</div>
32         <div>BOX2</div>
33 </body>
34 </html>

原理图:

图左为想象中的效果,图右为实际效果

                               

2. 父子元素(Parents and first/last child)

   假设没有边框或者内边距将外边距为隔开来,那么当一个元素包含另一个元素时,它们的也会发生垂直坍塌。

例如:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8" />
 5     <title>Document</title>
 6     <style type="text/css">
 7         * {
 8             padding: 0;
 9             margin: 0;
10         }
11 
12         div.parent {
13             width: 100px;
14             height: 100px;
15             margin:20px;
16             background-color:#eee;
17         }
18 
19         div.child {
20             width: 40px;
21             height: 40px;
22             margin:30px;
23             text-align:center;
24             line-height:40px;
25             background-color:red;
26         }
27     </style>
28 
29 </head>
30 <body>
31     <div class="parent">
32         <div class="child">Child</div>
33     </div>
34 </body>
35 </html>

原理图:

左边为想象中的效果图;右边为实际效果图

3. 空块框(Empty blocks)

  假设有一个空元素,没有内边距以及边框,只有外边距。这种情况下,顶部外边距与底部外边距就会发生坍塌。对于这个类型,个人感觉有争议,试了一下,并不会发生坍塌现象,应该与早期版本的浏览器渲染有关吧。

 

posted @ 2017-11-13 14:13  Shane水木  阅读(534)  评论(0编辑  收藏  举报