问题:有时当我们设置子元素的margin-top,但是却发现子元素没有出现上外边距的效果,反而是父元素出现了上外边距的效果。第一个子元素设置margin-top父元素会跟着移动
原因:边距重叠:一个盒子和其子孙的边距重叠。根据规范,一个盒子如果没有上补白和上边框,那么它的上边距应该和其文档流中的第一个孩子元素的上边距重叠。
发生这一现象的有三种情况:
相邻兄弟块元素间、
父元素及其首子元素和末子元素间(没有内边距或边框把外边距分隔开)、
空块级元素自身的合并。
解决方法:
1、为父元素设置padding。---要设置padding,设置margin不行
2、为父元素设置border。---设置border为0px不行,border要有值
3、为父元素设置 overflow: hidden 。
4、父级或子元素使用浮动或者绝对定位absolute
补充:
普通文档流盒子间,只要垂直外边距直接接触就会发生合并,合并后外边距视觉高度取两个发生合并外边距中较大者。
父元素的第一个子元素的上边距margin-top如果碰不到有效的border或者padding.就会不断一层一层的找自己 “领导”(父元素,祖先元素)的麻烦。只要给领导设置个有效的 border或者padding就可以有效的管制这个目无领导的margin防止它越级。
同一个BFC中的box会发生margin坍塌(也叫margin重叠)现象,这里注意,说的是上下margin。
所以不同BFC的box不会发生margin坍塌现象。
在父子级嵌套中,若父级没有border/padding-top,也没有空标签清浮动,总而言之就是没有触发BFC的时候,此时只给自己设置margin-top,会传递给父级。为了避免margin坍塌现象,就要通过各种方式触发BFC。
触发BFC的几种方式:
1.overflow:hidden/auto/scroll;
2.position不是static也不是relative;
3.float不是none;
4.display是table-cell或inline.
什么是BFC:
BFC全称是Block Formatting Context,即块格式化上下文。它是CSS2.1规范定义的,关于CSS渲染定位的一个概念。
BFC是页面CSS 视觉渲染的一部分,用于决定块盒子的布局及浮动相互影响范围的一个区域。
BFC的一个最重要的效果是,让处于BFC内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。
利用BFC可以闭合浮动,防止与浮动元素重叠。