什么是BFC

BFC(Block Formatting Context),简单讲,它是提供了一个独立布局的环境,每个BFC都遵守同一套布局规则。例如,在同一个BFC内,盒子会一个挨着一个的排,相邻盒子的间距是由margin决定且垂直方向的margin会重叠。而float和clear float也只对同一个BFC内的元素有效。

什么情况产生BFC

W3C标准中这样描述:

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.

非块级盒子的浮动元素、绝对定位元素及块级容器(比如inline-blocks,table-cells和table-captions),以及overflow属性是visible之外任意值的块级盒子,都会创建了一个BFC。即当元素CSS属性设置了下列之一时,即可创建一个BFC:

  • float:left|right
  • position:absolute|fixed
  • display: table-cell|table-caption|inline-block
  • overflow: hidden|scroll|auto

BFC的一个简单应用

一个简单的例子:

html:

<div class=”item”>
<div class=”pic”>your photo here?</div>
<p class=”cont”>
爱饭否,爱豆瓣,也爱鸡脱壳。
爱爬山,爱拍美景。
爱腐败,更爱远征的自虐。
爱下雪天,爱感动,爱平底鞋。
我没有什么特别,我很特别。
我和别人不一样,我和你一样。
我是前端。
</p>
</div>

css:

.item{width:300px;border:1px solid #b2d1a3;background-color:#e5ebe4;}
.pic{width:80px;height:80px;margin:10px;
font-family:”Segoe UI Light”;color:#fff;}
.cont{margin:10px;color:#37a;}

这段代码是结构简单的三个元素的叠放,效果如下:

这时,如果要将文字部分放到图片的右侧,很多人都会想到给.pic使用float:
css:

.pic{width:80px;height:80px;margin:10px;
font-family:”Segoe UI Light”;color:#fff;
float:left;
}

将得到这样的效果:

右侧内容并没有如我们预料一样规整的排在右侧,而是将左侧图片包围起来。接下来,我们为右侧内容部分设置overflow:hidden属性来使它形成一个新的BFC:
css:

.cont{margin:10px;color:#37a;overflow:hidden;}

这次将看到:

这确实是我们想要的。可是,在IE6下看到的却是下面这样:


不仅内容区没有排在右侧,而且遭遇了双边距bug。双边距bug非本文重点讨论,直接为.pic增加display:inline来解决。我们关心的是为什么IE6下右侧内容元素还是不能决定自己的布局呢?这里涉及到了另一个概念HasLayout。其实,在完美世界的字典里,是没有HasLayout这个概念的。它是IE浏览器引擎内部特有的属性,它可以影响到元素的定位和元素之间的相互作用。当一个元素的HasLayout属性为true时,这个元素才可以决定自己和其子孙元素的布局。为数不多的元素默认这个属性值为true,包括:

  • body and html
  • table, tr, th, td
  • img
  • hr
  • input, button, file, select, textarea, fieldset
  • marquee
  • frameset, frame, iframe
  • objects, applets, embed

所以,当发现有些元素的布局在IE下有异常时,可以有充分的理由来怀疑可能是hasLayout属性为false。而且这个属性值不能直接设置。一个元素要么默认拥有,要么通过设置特定的CSS属性来获取。直接的使元素hasLayout属性值为true的方法是声明下面的CSS属性之一:

  • width: 除auto之外的值
  • height: 除auto之外的值
  • float: left|right
  • position: absolute
  • display: inline-block
  • writing-mode: tb-rl(IE)
  • zoom: 除normal之外的值
IE7中增加了一些同样效果的属性:
  • min-height: 任意值
  • max-height: 除 “none” 之外的任意值
  • min-width: 任意值
  • max-width: 除 “none” 之外的任意值
  • overflow: hidden|scroll|auto
  • overflow-x: hidden|scroll|auto
  • overflow-y: hidden|scroll|auto
  • position: fixed

最常用的是zoom:1,因为这个设置对元素外观不会造成任何影响。但是这个属性是IE特有的CSS属性,不会通过CSS检查器W3C提供的CSS校验器(当然,让不让通过校验实际取决于各种校验器的规则)。所以,有推荐对于IE7,最好是设置min-height:0。因为0是min-height的初始值,这样不会对元素外观造成影响。对于IE6及更早的版本,推荐方法是设置height:1%。这个高度会使得容器盒子的大小刚好包含内容区而忽略掉真正的属性值。但这个设置的缺陷是会影响到其他浏览器的解析,因此需要使用hack屏蔽掉对其他浏览器的影响。
所以,最终的代码可能是:

.item{width:300px;border:1px solid #b2d1a3;background-color:#e5ebe4;}
.pic{width:80px;height:80px;margin:10px;
font-family:”Segoe UI Light”;color:#fff;
float:left;display:inline;}
.cont{margin:10px;color:#37a;overflow:hidden;_height:1%;}

你偏爱哪一种呢?欢迎探讨。

转:http://www.aliued.cn/2012/12/31/css%E5%B8%83%E5%B1%80%E4%B8%AD%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84%E5%BA%94%E7%94%A8bfc%E7%9A%84%E4%BE%8B%E5%AD%90.html

CSS布局中一个简单的应用BFC的例子的更多相关文章

  1. css布局中的各种FC(BFC、IFC、GFC、FFC)

    什么是FC?FC(Formatting Context)格式化上下文,其实指的是一个渲染区域,拥有一套渲染规则,它决定了其子元素如何定位,以及与其他元素之间的关系和相互作用. 什么是BFC? BFC( ...

  2. 认识和理解css布局中的BFC

    认识和理解css布局中的BFC BFC的定义 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用. Block Formatting Con ...

  3. DIV CSS布局中position属性用法深入探究

    本文向大家描述一下DIV CSS布局中的position属性的用法,position属性主要有四种属性值,任何元素的默认position的属性值均是static,静态.这节课主要讲讲relative( ...

  4. DIV CSS布局中绝对定位和浮动用法

    转自:http://developer.51cto.com/art/201009/223337_1.htm 你对DIV CSS布局中绝对定位和浮动的概念及使用是否熟悉,这里和大家分享一下,CSS中,实 ...

  5. DIV+CSS布局中自适应高度的解决方法

    div乱跑问题  (文件<DIV+CSS布局中自适应高度的解决方法.rar>)   float 是个很危险的东西 得小心使用 本来有一很好的关于CSS+DIV的论坛 不过现在关门了 甚是可 ...

  6. DIV+CSS布局中主要CSS属性介绍

    Float: Float属性是DIV+CSS布局中最基本也是最常用的属性,用于实现多列功能,我们知道<div>标签默认一行只能显示一个,而使用Float属性可以实现一行显示多个div的功能 ...

  7. CSS布局中的水平垂直居中

    CSS布局中的水平垂直居中 各位好,先说两句题外话.今天是我开通博客园的博客第一天,虽然我申请博客园的账号已经有一年半了,但是由于各种原因迟迟没有开通自己的博客.今天非常有幸开通博客,在此也写一篇关于 ...

  8. CSS布局中最小高度的妙用

    CSS布局中最小高度的妙用 --最小高度可以设定一个BOX的最小高度,当其内容较少时时,也能保持BOX的高度为一定,超出就自动向下延伸最小高度可以设定一个BOX的最小高度,当其内容较少时时,也能保持B ...

  9. python中一个简单的webserver

     python中一个简单的webserver 2013-02-24 15:37:49 分类: Python/Ruby 支持多线程的webserver   1 2 3 4 5 6 7 8 9 10 11 ...

随机推荐

  1. Ubuntu 16.04 安装搜狗输入法

    安装步骤: 1.去官网下载文件[https://pinyin.sogou.com/linux/] 2.安装deb安装包: sudo dpkg -i 安装包的名字.deb //(如果安装失败,请重复几次 ...

  2. 1722 最优乘车 1997年NOI全国竞赛

    题目描述 Description H城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆,饭店等地都设置了巴士站并开通了一些单程巴上线路.每条单程巴士线路从某个巴士 ...

  3. ZOJ 2975 Kinds of Fuwas

    K - Kinds of Fuwas Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu De ...

  4. Syntactic and Semantic Errors

    There are two kinds of errors that Basis can find. Syntax errors occur during the parsing of input c ...

  5. XML 高速入门总结

    XML已经学习完了一段时间了.一直感觉知识比較琐碎,没有去好好总结.事实上越琐碎的知识也越须要我们去好好 理一下.将知识串起来.争取变得不再琐碎.以下是我学完xml画的一张图. 以下对XML进行一下简 ...

  6. Win10专业版永久激活方法

    自从升级安装了Windows10系统以后,我想很多朋友和我一样,想要激活Windows10系统,但是小编找了半天以后发现,很多激活工具都是批量激活的,也就是只有180天的使用时间,那么我们怎么永久激活 ...

  7. iOS 项目一直在后台执行

    我后来是这么解决不知道行不行,能够长期的在后台执行 首先我在xx-info.plist 里的 "Required background modes" 里增加"App pr ...

  8. 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    (1)GCD实现的同步异步.串行并行. --同步sync应用场景:用户登录,利用堵塞 --串行异步应用场景:下载等耗时间的任务 /** * 由于是异步.所以开通了子线程.可是由于是串行队列,所以仅仅须 ...

  9. AngularJS的增删改查、state嵌套案例,不涉及服务端

    本篇实践一个案例,大致是:左边有导航菜单,右边显示列表,并可对列表项编辑或删除,也可添加新的列表项.借此,可体会到:如何组织可扩展的AngualrJS文件结构,如何点击左侧菜单项右侧显示相应内容,an ...

  10. X.509 数字证书结构和实例

    http://www.cppblog.com/sleepwom/archive/2010/07/08/119746.html 一. X.509数字证书的编码 X.509证书的结构是用ASN1(Abst ...