由外边距合并到BFC
置顶文章:《纯CSS打造银色MacBook Air(完整版)》
上一篇:《JavaScript实现Ajax小结》
作者主页:myvin
博主QQ:851399101(点击QQ和博主发起临时会话)
::selection{ background:blue; color:red; } span{ color:red; }
外边距合并
myvin今天主要说的是BFC,块级格式化上下文,这里先由外边距合并引出来。
对于外边距合并,应该都不陌生,在这里简单列出外边距合并的几种情况:
- 两个元素上下相邻,则上面元素的下边距会和下面元素的上边距合并,取最大值;
- 外部元素包含一个内部元素,外部元素和内部元素的上边距或/和下边距会发生合并;
- 自身外边距合并:一个空元素,如果设置了上下外边距,则和合并,即比如,一个空的div,如果上外边距和下外边距都设置为20px,则上下外边距合并为一个,实际的高度为20px。
BFC(块级格式化上下文)
在这里,myvin以第二种情况来引出BFC。
首先给出代码,下面的均已该代码为模型:
<div id="outer">
  <div id="inner">
  </div>
</div>
#outer {
  width:300px;
  height:300px;
  background-color:red;
  margin-top:20px;
}
#inner {
  width:50px;
  height:50px;
  background-color:blue;
  margin-top:10px;
}这里外部div margin-top:20px,内部div margin-top:10px。
如果将外部div margin-top:10px,内部div margin-top:20px,则两者的效果是一样的,即外部div的margin-top为20px,而内部div紧贴上部。效果如下:

也许我们要的效果是外部div距离顶端10px,内部div距离外部div上边界20px,但是如上所述,这样的设置只能得到上面的效果。
到这里,就有必要聊一下BFC了。
BFC可以理解为一种属性,一种状态。
这里先给出w3c官方对BFC的解释,也可点击链接(http://www.w3.org/TR/CSS2/visuren.html#block-formatting)直接查看:
Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with 'overflow' other than 'visible' (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.
In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.
In a block formatting context, each box's left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box's line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).
英文并不难懂,这里就不再详细翻译。这里主要讲了两点;
- 怎样能实现一个BFC
- BFC有什么用
我们先说第一点:怎么能够实现一个BFC,如下:
- float元素
- 绝对定位元素,点出一点,绝对定位元素包括absolute和fixed
- display:inline-block,table-cell,table-caption
- overflow除了visible的其他属性值。
作用主要是两点:
- 在BFC盒子中,两个垂直相邻的元素外边距会发生合并,还有一层意思就是,分别属于两个不同BFC盒子的不会发生合并;
- 对浮动也有影响,这也就是为什么设置父元素overflow:hidden能清除浮动的原因。
在这里使用overflow:hidden来设置BFC属性,当然可以用使用fixed、absolute等上述方式。
我们依然尝试实现上面我们没有实现的效果,在这里我们给外部div添加overflow:hidden,使之成为一个具有BFC属性的盒子,现在来看下效果;

这样确实实现了所要的效果。
众所周知,如果唯一的一个内部元素是浮动元素,那么父元素是会发生坍塌的,即父元素无法被撑起来,如果将BFC设置到父元素上,父元素会被浮动元素正常撑起来,清除浮动。
所以,设置BFC就相当于设置了一个和外部隔离的独立环境,在这个环境里,浮动元素正常撑起父元素;如果A设置了BFC,B设置了BFC,B中有元素B1,A中有元素A1,则分别设置A1和B1的外边距的话,它们是不会合并的,因为这时候它们的外边距是相对于自己的父元素的。
转载请记得说明作者和出处哦-.-
作者:myvin
原文出处:http://www.cnblogs.com/myvin/p/4892545.html
下一篇:《图片ping、JSONP和CORS跨域 》
置顶文章:《纯CSS打造银色MacBook Air(完整版)》
由外边距合并到BFC的更多相关文章
- 文本溢出、垂直外边距合并、BFC、hasLayout
		今天学习文本溢出,又遇到了一些小问题,先上图: 关于文本溢出推荐:http://www.cnblogs.com/yzg1/p/5089534.html 从里面学习到单行文本和多行文本溢出, overf ... 
- 关于CSS inline-block、BFC以及外边距合并的几个小问题
		CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ... 
- BFC 以及 外边距合并问题
		BFC定义: BFC(Block formatting context)直译为"块级格式化上下文". 它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部 ... 
- css外边距合并和z-index的问题
		参考这篇文章, 将外边距的 折叠 参考这篇文章, 将bfc的生成, bfc的应用 参考这篇文章 position: absolute的元素, 仍然具有内填充padding和border边框属性样式, ... 
- 关于collapsed margin(外边距合并)
		这是前面写postion定位时写到最后面的例子的时候发现的一个问题,于是专门写一篇随笔来解释记录一下,毕竟两个知识点同时写在一篇文章里面有点混乱的感觉.. 上篇随笔position定位遇到的问题在这里 ... 
- CSS2系列:外边距合并问题(margincollapse)
		外边距合并 w3介绍这个问题地址:https://www.w3.org/TR/CSS2/box.html#collapsing-margins 当两个垂直方向外边距相遇,它们将形成一个折叠外边距. 合 ... 
- CSS外边距合并&块格式上下文
		前言问题Margin Collapsing 外边距合并Block Formatting Context 块格式化上下文解决方案参考 前言 之前在前端开发的过程中,都没有遇到外边距合并的问题(其实是因为 ... 
- CSS 垂直外边距合并:规范、延伸、原理、解决办法
		<CSS 权威指南>第七章基本视觉格式化.p192,提到了 垂直外边距合并 的情况,解释总体算清晰,但是感觉不全且没有归纳成一条一条的,参考 CSS框模型中外边距(margin)折叠图文详 ... 
- CSS min-height不能解决垂直外边距合并问题
		垂直外边距合并有一种情况是嵌套元素的垂直外边距合并,当父级元素没有设定外边距时,在顶部或者底部边缘的子元素的垂直外边距就会和父级的合并,导致父级也有了“隐形”的垂直外边距. 当父级元素的min-hei ... 
随机推荐
- 【VB超简单入门】二、知识准备
			在开始编程之前,需要先熟悉一下各种操作和术语,以后学习编程才能得心应手. 首先最重要的操作当然就是-电脑的开机关机啦~(开个玩笑哈哈),必须掌握软件的安装和卸载,还有能编写批处理程序对平时的使用也是很 ... 
- ElasticSearch Filter Aggregations
			类似于sql语句中where子句的作用 { "query": { "match_all": {} }, "aggs": { "ag ... 
- linux进程间通信-概述
			一 进程间通信有如下的目的: 1.数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间:2.共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到 ... 
- 获取bing每日图片
			http://global.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US 其中idx表示倒数第几张图片 ... 
- DataGridView合并单元格
			昨天一个同事问我DataGridView单元格合并的问题,一开始按照我的设想是算出两个单元格的Rectangle,然后直接使用e.Graphics.FillRectangle(backColorBru ... 
- 最小瓶颈路  Uva 534 Frogger
			说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ... 
- hdu 5802 Windows 10 贪贪贪
			传送门:hdu 5802 Windows 10 题意:把p变成q:升的时候每次只能升1,降的时候如果前一次是升或者停,那么下一次降从1开始,否则为前一次的两倍 官方题解: 您可能是正版Windows ... 
- sublime Text 2 安装Sublime Package Control
			Sublime Text 2 安装 Sublime Package Control,通过 Sublime Package Control,安装.升级和卸载 Package. 安装 Package Co ... 
- linux命令学习-复制(cp,scp)
			linux为我们提供了两个用于文件的copy的命令,一个是cp,一个是scp.但是它们略有不同: cp主要用于在同一台电脑上,在不同的目录之间来回copy文件,scp主要是在不同的linux系统之间来 ... 
- [转] Centos 6.4 python 2.6 升级到 2.7
			http://blog.csdn.net/jcjc918/article/details/11022345 
