margin collapsing 解决

1 ,初始代码如下:

<body style="border: 2px solid blue;">
  <div id="container" style="height: 200px; background-color: gray; ">
    <p style="margin-top: 0px; height: 20px; background-color: red;">test</p>
  </div>
</body>

  效果:

 

 

 

2,修改一下p元素的margin-top为100px 如下:

<body style="border: 2px solid blue;">
  <div id="container" style="height: 200px; background-color: gray; ">
    <p style="margin-top: 100px; height: 20px; background-color: red;">test</p>
  </div>
</body>

  效果如下:

 

 

 

p元素的margin似乎变成了div元素的magin

 

3,在p元素前加了内容,代码:

<body style="border: 2px solid blue;">
  <div id="container" style="height: 200px; background-color: gray; ">
  &nbsp;
  <p style="margin-top: 100px; height: 20px; background-color: red;">test</p>
  </div>
</body>

  效果如下:

 

 

这下正常了,margin还给p元素了,但是, 因为加了空行,所以距离不是100px了... 不可取的解决方案。

科学的解决方法:

<body style="border: 2px solid blue;">
	<div id="container" style="height: 200px; background-color: gray; overflow: hidden;">
	    <p style="margin-top: 100px; height: 20px; background-color: red;">test</p>
	</div>
</body>

  

 

=====================================================

进入正题: 这是什么原因,以及如何解决。

原因分析:   同一个BFC内,垂直方向盒子的上下会出现margin重叠

 

BFC是什么:
BlockFormatting (块级格式化上下文)
可以同时存在很多盒子,独立的布局作用域。当然也只有块级元素能参与转化成BFC。
BFC内部的布局规则
1、内部的Box会在垂直方向,一个接一个地放置。
2、同一个BFC内,垂直方向盒子的上下会出现重叠
3、每个元素的 box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
4、子BFC的区域不会与float box重叠。
5、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
6、计算BFC的高度时,浮动元素也参与计算(故也可以达到所谓的清除浮动的效果,只要将包裹层转变给BFC)
 
 
如何将一个块级元素转化成BFC?
官方给出了以下几种方式:
1、具有除了float:的其它浮动属性值;
2、定位为absolute或者fixed;
3、display为inlineblock, -cell, -caption, flex, inlineflex
4、overflow不为visible(除非该值已经传播到视口,如 body 会将的值传播到视口,故此情况下,设置该属性不能建立bfc)
 

 

posted @ 2017-03-23 23:45  toBeRare  阅读(214)  评论(0编辑  收藏  举报