BFC与margin重叠

在平时做项目的时候,有些时候会发生margin重叠的现象,但这种情况并不是一直都会发生,那到底什么时候会发生margin重叠呢。在网上搜索了一些资料,大致做了一些整理。

首先,会发生margin重叠的肯定是同一个BFC内的块级元素,例如div、ul等,不是块级元素不会发生重叠。(内联元素是不能设置高、行高、内外边距的,而且内联元素只能容纳文本或者其他内联元素。)

重叠的情况大致可以分为以下几种:

1、当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并。

2、当一个元素包含在另一个元素中时(假设没有内边距或边框把外边距分隔开),第一个子元素的上边距会和父元素的上边距合并;最后一个子元素的下边距会和父元素的下边距合并。

3、假设有一个空元素,它有外边距,但是没有边框或填充。在这种情况下,上外边距与下外边距就碰到了一起,它们会发生合并。如果这个外边距遇到另一个元素的外边距,它还会发生合并。

当发生重叠的时候:

1、当两个margin都是正值的时候,取两者的最大值;

2、当 margin 都是负值的时候,取的是其中绝对值较大的,然后,从 0 位置,负向位移;

3、当有正有负的时候,先取出负 margin 中绝对值中最大的,然后,和正 margin 值中最大的 margin 相加。

有时候我们并不希望margin会合并,因为不期望的合并会给页面布局带来混淆。前面说过,会发生合并的是同一个BFC内的块级元素,也就是说属于同一个BFC的两个相邻块级元素的margin会发生重叠。那么什么是BFC,怎么生成BFC。

以下内容大多摘自:http://www.cnblogs.com/dojo-lzz/p/3999013.html。

BFC:块级格式化上下文,它是指一个独立的块级渲染区域,只有Block-level BOX参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

满足下列CSS声明之一的元素便会生成BFC。

1、根元素

2、float的值不为none

3、overflow的值不为visible  (这一条不知道为什么对于上下元素的时候不起作用。)

4、display的值为inline-block、table-cell、table-caption

5、position的值为absolute或fixed

浏览器对于BFC这块区域的约束规则如下:

1、内部的Box会在垂直方向上一个接一个的放置

2、垂直方向上的距离由margin决定。(完整的说法是:属于同一个BFC的两个相邻Box的margin会发生重叠,与方向无关。)

3、每个元素的左外边距与包含块的左边界相接触(从左向右),即使浮动元素也是如此。(这说明BFC中子元素不会超出他的包含块,而position为absolute的元素可以超出他的包含块边界)

4、BFC的区域不会与float的元素区域重叠

5、计算BFC的高度时,浮动子元素也参与计算

6、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然

以上这些约束就可以解释css中的一些规则了。

Block元素会扩展到与父元素同宽,所以block元素会垂直排列

垂直方向上的两个相邻DIV的margin会重叠,而水平方向不会(此规则并不完全正确)

浮动元素会尽量接近往左上方(或右上方)

为父元素设置overflow:hidden或浮动父元素,则会包含浮动元素(根本原因在于创建BFC的元素,子浮动元素也会参与其高度计算,即不会产生高度塌陷问题)

为了防止发生margin重叠,只需要把发生重叠的两个元素之一生成BFC就可以了,这只是BFC其中一个作用。BFC在css布局中有很多情况可卡因起作用,例如:

1、对于上下相邻的两个元素,只要把其中一个设置为display:inline-block。按理论来说,将其中一个设置为overflow:hidden,也可以达到消除重叠的效果,结果却没有,不知道为什么。

2、给父元素设置border或者padding,子元素的margin就不会与父元素重叠。例如margin-top。

给父元素设置    overflow: hidden或者display: inline-block或者float: left或者position: absolute,子元素的margin就不会与父元素重叠。

给子元素设置display: inline-block,子元素的margin就不会与父元素重叠。

3、当父元素没有设置宽高,子元素浮动的时候,会使得父元素高度塌陷,这时候只需要给父元素设置overflow: hidden或者display: inline-block或者float: left或者position: absolute。都可以解决这个问题。根本原因在于创建BFC的元素,子浮动元素也会参与其高度计算,即不会产生高度塌陷问题

4、与浮动元素相邻的已生成BFC的元素不能与浮动元素相互覆盖。利用该特性可以作为多栏布局的一种实现方式。overflow: hidden或者display: inline-block或者float: left或者position: absolute。

.left{

background:pink;

float: left;

width:180px;

}

.center{

background:lightyellow;

overflow:hidden;

}

.right{

background: lightblue;

width:180px;

float:right;

}

原文地址:https://www.cnblogs.com/zhaosijia----1234/p/8993209.html

时间: 2024-08-04 04:07:00

BFC与margin重叠的相关文章

BFC 和 margin collapse(重叠)

写过很多页面的样式,但是却少有理论的基础,近日看到了关于BFC和一些关于magin collapse的知识 ,决定系统的整理一下. 一.BFC是什么? BFC(Block formatting context)直译为"块级格式化上下文".它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干. 二.BFC布局规则? 内部的Box会在垂直方向,一个接一个地放置. Box垂直方向的距离由margin

CSS篇——BFC与margin

首先FC: Formatting Context 指页面中的一个渲染区域,并且拥有一套渲染规则,他决定了其子元素如何定位,以及与其他元素的相互关系和作用. CSS2.1中有BFC(block)和IFC(Inline). BFC的布局规则: 内部的Box会在垂直方向,一个接一个地放置. Box垂直方向的距离由margin决定.属于同一个BFC的两个相邻Box的margin会发生重叠. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)

由position属性引申的关于css的进阶讨论(包含块、BFC、margin collapse)

写这篇文章的起因是源于这篇文章:谈谈面试与面试题 中关于position的讨论,文中一开始就说的这句话: 面试的时候问个css的position属性能刷掉一半的人这是啥情况…… 其实这问题我本来打算的是可以顺着一路扯到normal flow.containing block.bfc.margin collapse,base line,writing mode,bidi,这样一路问下去的,奈何第一个问题(亲我真的只问了position有哪些取值和行为啊)就悲剧了…… 说到position,那么稍微

清除浮动(带来的影响) clear与margin重叠

[CSS][清除浮动(带来的影响) clear与margin重叠] 1.用clear清除浮动(在浮动元素的底加入div且设置clear:both;),会发生margin重叠显现 2.用BFC清除浮动(在浮动元素的父元素上加入overflow: hidden;),则会把整个元素包起来,从而不会发生margin重叠现象 (PS:只有普通文档流中块框的垂直外边距才会发生外边距叠加.行内框.浮动框或绝对定位框之间的外边距不会叠加.) 第一个是使用了"clear:both"但是它会与margin

CSS盒模型和margin重叠

在 CSS 中,width 和 height 指的是内容区域的宽度和高度.增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸.(div的实际占用尺寸变打了) 但: 一旦为页面设置了恰当的 DTD,大多数浏览器都会按照上面的图示来呈现内容.然而 IE 5 和 6 的呈现却是不正确的.根据 W3C 的规范,元素内容占据的空间是由 width 属性设置的,而内容周围的 padding 和 border 值是另外计算的.不幸的是,IE5.X 和 6 在怪异模式中使用自己的非标准模型

2016/2/25 1, margin auto 垂直方向测试 无效 2,margin重叠 3,哪些是块状哪些是内联 4,display:block inline 导航栏把内联转块状最常见+ 扩展

1.利用margin auto完成首页居中,并自行研究,竖直方向用margin auto,是什么效果#container{width:1002px;margin: 0px auto;}    竖直方向上margin:auto;无效.2.测试margin重叠的发生条件及现象,并自行搜索“父子div”也会发生margin重叠,写出代码及效果图. <!DOCTYPE html> <html> <head> <title>测试父子DIV-margin</tit

CSS 外边距(margin)重叠及防止方法

CSS 外边距(margin)重叠及防止方法 胡俊涛 | 2011-11-17 边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大的值.如果出现负边界,则在最大的正边界中减去绝对值最大的负边界.如果没有正边界,则从零中减去绝对值最大的负边界.注意:相邻的盒子可能并非是由父子关系或同胞关系的元素生成. 但是边界的重叠也有例外情况: 1.水平边距永远不

css margin重叠

父子元素margin重叠 解决办法: 给子元素添加浮动属性,相应父元素添加必要的清浮动属性: 给父元素添加边缘属性,如padding.border: 同级元素margin反向重叠 同级元素margin反向重叠时,元素之间的距离为两个margin值中较大的那个. 因解决办法较少且兼容性较差,在具体编码中,应尽量避免这种情况的出现.

深入理解BFC和Margin Collapse

深入理解BFC和Margin Collapse BFC的理解与应用 首先我们来看看w3c规范对BFC的解释,其实对于这种概念的学习上,我们总是建议首先寻找官方的定义,因为原则上来说官方的才是最权威和正确的,而且还比较详细,千万不要因为看到英文就畏惧不前. 什么是BFC(Block formatting contexts) w3c规范中的BFC定义: 浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及