置顶文章:《纯CSS打造银色MacBook Air(完整版)》

上一篇:《JavaScript实现Ajax小结》

作者主页:myvin
博主QQ:851399101(点击QQ和博主发起临时会话)

::selection{ background:blue; color:red; } span{ color:red; }


外边距合并

myvin今天主要说的是BFC,块级格式化上下文,这里先由外边距合并引出来。

对于外边距合并,应该都不陌生,在这里简单列出外边距合并的几种情况:

  1. 两个元素上下相邻,则上面元素的下边距会和下面元素的上边距合并,取最大值;
  2. 外部元素包含一个内部元素,外部元素和内部元素的上边距或/和下边距会发生合并;
  3. 自身外边距合并:一个空元素,如果设置了上下外边距,则和合并,即比如,一个空的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).

英文并不难懂,这里就不再详细翻译。这里主要讲了两点;

  1. 怎样能实现一个BFC
  2. BFC有什么用

我们先说第一点:怎么能够实现一个BFC,如下:

  1. float元素
  2. 绝对定位元素,点出一点,绝对定位元素包括absolute和fixed
  3. display:inline-block,table-cell,table-caption
  4. overflow除了visible的其他属性值。

作用主要是两点:

  1. 在BFC盒子中,两个垂直相邻的元素外边距会发生合并,还有一层意思就是,分别属于两个不同BFC盒子的不会发生合并;
  2. 对浮动也有影响,这也就是为什么设置父元素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的更多相关文章

  1. 文本溢出、垂直外边距合并、BFC、hasLayout

    今天学习文本溢出,又遇到了一些小问题,先上图: 关于文本溢出推荐:http://www.cnblogs.com/yzg1/p/5089534.html 从里面学习到单行文本和多行文本溢出, overf ...

  2. 关于CSS inline-block、BFC以及外边距合并的几个小问题

    CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...

  3. BFC 以及 外边距合并问题

    BFC定义: BFC(Block formatting context)直译为"块级格式化上下文". 它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部 ...

  4. css外边距合并和z-index的问题

    参考这篇文章, 将外边距的 折叠 参考这篇文章, 将bfc的生成, bfc的应用 参考这篇文章 position: absolute的元素, 仍然具有内填充padding和border边框属性样式, ...

  5. 关于collapsed margin(外边距合并)

    这是前面写postion定位时写到最后面的例子的时候发现的一个问题,于是专门写一篇随笔来解释记录一下,毕竟两个知识点同时写在一篇文章里面有点混乱的感觉.. 上篇随笔position定位遇到的问题在这里 ...

  6. CSS2系列:外边距合并问题(margincollapse)

    外边距合并 w3介绍这个问题地址:https://www.w3.org/TR/CSS2/box.html#collapsing-margins 当两个垂直方向外边距相遇,它们将形成一个折叠外边距. 合 ...

  7. CSS外边距合并&块格式上下文

    前言问题Margin Collapsing 外边距合并Block Formatting Context 块格式化上下文解决方案参考 前言 之前在前端开发的过程中,都没有遇到外边距合并的问题(其实是因为 ...

  8. CSS 垂直外边距合并:规范、延伸、原理、解决办法

    <CSS 权威指南>第七章基本视觉格式化.p192,提到了 垂直外边距合并 的情况,解释总体算清晰,但是感觉不全且没有归纳成一条一条的,参考 CSS框模型中外边距(margin)折叠图文详 ...

  9. CSS min-height不能解决垂直外边距合并问题

    垂直外边距合并有一种情况是嵌套元素的垂直外边距合并,当父级元素没有设定外边距时,在顶部或者底部边缘的子元素的垂直外边距就会和父级的合并,导致父级也有了“隐形”的垂直外边距. 当父级元素的min-hei ...

随机推荐

  1. Java异常处理和设计【转】

    Java异常处理和设计 在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常 ...

  2. Syslog

    一.简介 syslog是一种工业标准的协议,可用来记录设备的日志.在UNIX系统,路由器.交换机等网络设备中,系统日志(System Log)记录系统中任何时间发生的大小事件.管理者可以通过查看系统记 ...

  3. linux内核宏container_of

    首先来个简单版本 /* given a pointer @ptr to the field @member embedded into type (usually * struct) @type, r ...

  4. Linux Bash shell one practice : array if else

    shell practice 1 1.require A B C D 1 2 3 4 5 6 7 8 3 5 8 0 1 2 4 3 after handling: T A B C D A 1 2 3 ...

  5. TableViewer使用

    1.自定义编辑器激活方式   /**     * Create a customized editor whose activation process is customized     *    ...

  6. Webpack+React+ES6入门指南[转]

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  7. 利用HttpListener创建简单的HTTP服务

    using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using ...

  8. codeforces 477B B. Dreamoon and Sets(构造)

    题目链接: B. Dreamoon and Sets time limit per test 1 second memory limit per test 256 megabytes input st ...

  9. 【转】Python 列表排序

    很多时候,我们需要对List进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序 方法2.用built-in函数sorted进行排序(从2 ...

  10. URAL 1416 Confidential --最小生成树与次小生成树

    题意:求一幅无向图的最小生成树与最小生成树,不存在输出-1 解法:用Kruskal求最小生成树,标记用过的边.求次小生成树时,依次枚举用过的边,将其去除后再求最小生成树,得出所有情况下的最小的生成树就 ...