[Java小工匠]CSS盒子模型-边距合并
CSS外边距合并,只有上外边距和下外边距才会触发外边距合并,左外边距和右外边距不会。
源代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>相邻合并</title> <style type="text/css"> .div{ width: 100px; height: 100px; background: red; margin:100px; } </style> </head> <body> <div class="div">div1</div> <div class="div">div2</div> </body> </html>
运行效果如下: div1和div2 根据盒子模型的计算规则,div1下边距100px和div2上边距100px,理论应该是200px。实际CSS规则是合并的,因此div1和div2 之间的距离为100px;如果div1的下边距和div2的上边距,边距值不一样,那么以最大的边距为最终取值。
image.png
源代码: ```
div2
运行结果: div2是div1的子元素,完全安装盒子模型,div2应当距离浏览器顶部100px+父元素100px =200px。因为上下边距合并,所以div2距离顶部100px;由于左右边距不合并,所以div2距离浏览器左边的距离是200px。  ###4、Margin穿透问题 ###4.1 Margin穿透效果演示 源代码: ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Margin穿透问题</title> <style type="text/css"> body{ margin: 0px; } .header{ height: 100px; background: red; } .logo{ background: blue; width: 60px; height: 60px; margin-top: 40px; } </style> </head> <body> <div class="header"> <div class="logo"></div> </div> </body> </html>
远行结果:代码本意,header固定在浏览器顶部,当给logo的div添加上一个margin-top,header距离浏览器顶部由于父子元素合并所以出现了这个问题。
穿透
可以使用overflow:hidden,触发BFC模型解决这个问题,有专门章节介绍BFC模型。
在父元素中,插入一个高度、宽度都是0px的隐藏元素.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Margin穿透问题</title> <style type="text/css"> body{ margin: 0px; } .header{ height: 100px; background: red; } .logo{ background: blue; width: 60px; height: 60px; margin-top: 40px; } .before{ width: 0px; height: 0px; overflow: hidden; visibility: hidden; } </style> </head> <body> <div class="header"> <div class="before"></div> <div class="logo"></div> </div> </body> </html>
与插入元素的思路一致,使用伪元素。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Margin穿透问题</title> <style type="text/css"> body{ margin: 0px; } .header{ height: 100px; background: red; } .logo{ background: blue; width: 60px; height: 60px; margin-top: 40px; } .header:before{ width: 0px; height: 0px; display: block; content: 'clear'; overflow: hidden; visibility: hidden; } </style> </head> <body> <div class="header"> <div class="logo"></div> </div> </body> </html>
源代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>空元素合并</title> <style type="text/css"> .div1{ width: 100px; height: 100px; background: blue; } .div2{ margin-top: 50px; margin-bottom: 100px; } .div3{ width: 100px; height: 100px; background: red; } </style> </head> <body> <div class="div1"></div> <div class="div2"></div> <div class="div3"></div> </body> </html>
运行结果: div2 理论占据150px=上边距+下边距,实际占用了100px。因为空元素上下边距合并。如果div2的内容添加文字,显示效果将会有巨大差异。
image.png
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>左右不合并</title> <style type="text/css"> .div1{ overflow: hidden; } .div11{ margin-right: 100px; width: 200px; height: 100px; float: left; border: 1px solid red; } .div12{ margin-left: 100px; float: left; width: 200px; height: 100px; border: 1px solid red; } .div2{ margin-top: 10px; width: 602px; border: 1px solid red; height: 100px; } </style> </head> <body> <div class="div1"> <div class="div11">margin-right100px</div> <div class="div12">margin-left100px</div> </div> <div class="div2"> 200(div11宽度)+1px(div11右边框)+100px(div11右边距)+<br/> 200(div12宽度)+1px(div12左边框)+100px(div12左边距)<br/> </div> </body> </html>
运行效果: