CSS之BFC及其应用
BFC是Block Formatting Context的缩写,直译过来就是“块级格式化上下文”。先不管它到底是什么,看一个例子:
.parent{
border: 1px solid blue;
}
.children{
width: 100px;
height: 100px;
background: red;
float: left;
margin: 10px;
}
<div class="parent">
<div class="children"></div>
<div class="children"></div>
</div>
结果:

想必大家都了解,子元素float时父容器是不会被撑开高度的。一般的解决方法是给父容器加上 .clearFix类,
.clearfix:after{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden
}
清除浮动后,父容器能自动获得正确的高度了:

现在通过BFC,可以用更简单的方法解决这个问题了,只需要在父容器的样式里加上一句 overflow: hidden :
.parent{
border: 1px solid blue;
overflow: hidden;
}

原理:块级元素使用 overflow: hidden 的时候会创建一个 BFC ,而计算BFC的高度时,浮动元素也会参与计算。
BFC还有另外一个非常重要的特性,那就是垂直方向的外边距重叠,还是之前那两个div,样式改为:
.children{
width: 100px;
height: 100px;
background: red;
margin: 50px 10px;
overflow: hidden;
}
我们为两个div设置了上下50px的外边距,按理来说两个div的距离应该是100px;然而事与愿违,

上边div的margin-bottom与下边div的margin-top重叠了。
当然,BFC的特性不止这些,创建BFC的方法也不只有overflow: hidden。
BFC元素的特性
参考w3-CSS2规范,9.4.1节,总结如下:
1 内部的Box会在垂直方向从上到下排列。
2 内部的Box会在水平方向从左到右排列(对于从右到左的格式化则相反)。即使存在浮动也是如此。
3 Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生折叠
4 BFC的区域不会与float box叠加。这条后边会解释
5 BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。
6 计算BFC的高度时,浮动元素也参与计算。
哪些元素会创建BFC?
- 根元素
- float元素
- 绝对定位元素(position属性为absolute或fixed)
- 不是块级框的元素(display属性为inline-block, table-cell, table-caption等)
- overflow属性不为visible的元素
BFC的应用场景
1 闭合浮动 即前边父容器获取高度问题,不再介绍了 注意这里不叫清除浮动,因为BFC元素可以包含浮动元素,并且浮动元素也参与计算高度。
2 防止垂直 margin 重叠
前边提到的垂直外边距折叠问题,可以通过给子元素外层包裹一个BFC块,像这样:
<div class="parent">
<div class="children"></div>
<div class="BFC">
<div class="children"></div>
</div>
</div>
这样之前的两个children块便不属于同一个BFC了。但是一般不建议滥用BFC来解决此类问题,推荐使用同向的margin-top,margin-bottom来解决。
3 多列布局
前边BFC特性第4条提到了,BFC的区域不会与float box叠加,这句话是什么意思呢,看一个例子:
.food{
width: 100px;
height: 100px;
float: left;
}
<div class="container">
<img class="food" src="food.png">
<p class="BFC">商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍商品介绍
</p>
</div>

当我们展示一张图片和介绍性文字的时候,一般会给图片加上float属性,但是有时候这种文字环绕的方式不是我们要的效果,怎么将图片和文字变成两列式布局呢?很简单,给文字的容器p元素创建一个BFC。
.BFC{
overflow: hidden;
}

使用BFC,很简单方便的就将效果实现了。
图片和文字过于紧凑显然不够美观,我们给图片和文字设置20px的间距。如果直接给文字块设置左边距,需要将图片的宽度计算在内,即120px,这种方式显然不好。这种情况我们只需给浮动的元素设置一个20px的右边距即可。
.food{
width: 100px;
height: 100px;
float: left;
margin-right: 20px;
}

总结
- BFC是指块级格式化上下文,它是一个独立的渲染区域,内部的元素布局方式与外部无关;
- 主要特点是相邻元素间垂直方向的外边距会被折叠,以及内部的浮动元素会参与计算高度;
- 主要用途是闭合浮动使父容器自动获得高度,以及实现多列布局。
个人理解仅供参考,如有错误欢迎指正。
CSS之BFC及其应用的更多相关文章
- CSS之BFC、IFC、FFC and GFC
CSS之BFC.IFC.FFC and GFC 什么是FC? BFC(Block Formatting Contexts) BFC的布局规则: 如何生成BFC: IFC(Inline Formatti ...
- 理解CSS中BFC
BFC(Block Formatting Context) 是Web页面中盒模型布局的CSS渲染模式.它的定位体系 属于 常规文档流 .摘自 W3C : 浮动,绝对定位元素, inline-block ...
- CSS的BFC和hasLayout及其应用场景
前端精选文摘:BFC 神奇背后的原理 一.BFC是什么? 先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观 ...
- css 之 BFC
1,定义 BFC为块级格式化上下文,也就是一块区域内的封闭空间,里面元素无论怎么样,都不会影响外部元素. 2,触发条件 html 根元素 display的值为 inline-block.table-c ...
- 理解css的BFC
BFC是CSS中一个看不见的盒子,(先理解CSS的盒子模型).它的页面渲染方式与普通流的盒子模型不同,它决定了其子元素将如何定位(所用属于BFC的box 都默认左对齐),以及和其他元素的关系和相互作用 ...
- CSS之BFC详解
What:了解该知识点的概念,本质以及有关牵扯到的相关知识概念 BFC这个东西说常见的话你可能不觉得,但是你肯定会常用,也许你在用的时候也没想到BFC这东西.网上也有很多写这些东西的文章,但是自己写一 ...
- 浏览器的差距、ie6 ie7 ie8、符号、html css、BFC、
1.浏览器的差距 浏览器默认的字体是16px,谷歌的最小字体是12px,其他是10px 2.ie6.ie7.ie8. hack:就是针对不同的浏览器去不同的html,css样式,从而让各个浏览器能达到 ...
- 前端精选文摘:css之BFC 神奇背后的原理(转载)
一.BFC是什么? 在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位 Box 是 CSS 布局的对象和基本单位, 直观点来说 ...
- 【HTML/CSS】BFC
块格式化上下文(Block formatting contexts) BFC是什么? 是Web页面中盒模型布局的CSS渲染模式.它的定位体系属于常规文档流. 至少满足条件之一: float 的值不为 ...
- 总结下对我对于CSS中BFC的认知
首先第一个,什么是BFC? BFC的全称叫Block Formatting Context (块级格式化上下文)BFC是css中隐含属性,开启BFC后元素会变成一个独立的布局环. 简单来说,它 ...
随机推荐
- xml转义符
今天在看项目的UrlRewriteFilter(动态url静态化,有利于搜索引擎搜索)的配置文件urlrewrite.xml时,看到了“&”字符,查询之后才知道xml文件中的转义比html中的 ...
- 【转】译—游戏开发者应该如何应用Git和GitHub
原文地址:http://bbs.9ria.com/thread-259587-1-2.html "我确信Git是强大的,但是它看起来很复杂--我依然会坚持我当前的工作流"就像说&q ...
- JavaScript高级程序设计---学习笔记(二)
面向对象程序设计1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直 ...
- Shell括号之间的区别
前言 初次学习Shell,对于括号的使用肯定很困惑,所以我打算将其整理成一篇文章 单括号 { } 表达变量的值,在不引起歧义的时候可以省略大括号 例子: var=1 echo ${var} # 或者e ...
- 老李性能测试分享:可以没事代理刷榜赚外快了,poptest这是让你快速致富啊
老李性能测试分享:可以没事代理刷榜赚外快了,poptest这是让你快速致富啊 最近学员不断面试,不时听到令人惊喜的消息,类似应届专科毕业生获得7k月薪,小美女应聘月薪11k等等,看到学员开心的笑容 ...
- android开发用无线网络进行Android开发中的调试
1.手机具有root权限 2.安装adbWireless1.5.4.apk (下面有下载地址) 3.敲入命令:adb connect 192.168.1.127 后面是手机的IP地址 打开eclip ...
- Java环境----JDK开发环境搭建及环境变量配置
1.啥是jdk? jdk的是java development kit的缩写,意思是java程序开发的工具包. jdk的版本,一共有三种,标准版(j2se),企业版(j2ee),移动设备版(j2me). ...
- nlog学习使用
最近有不少朋友推荐我用NLog.我以前都是自己写txt的文本输出log,以前别人用log4net的时候看那个配置文件,看得我一阵烦,我比较喜欢约定胜于配置的组件.这次玩了一波NLog,,相当不错.一下 ...
- mac的终端为什么会显示git:(master),如何取消掉?
今天在终端误操作,在主目录下执行git init命令,结果杯具了, 总是出现这个提示. 各种搜索解决方案,终于退出了. 方法如下: 删掉.git目录: rm -rf ~/.git
- sublime-text-3设置输入中文方法
sublime-text-3 编辑器性感而敏捷,却让人感慨有其长必有其短. 有些缺点都可以通过插件解决.但是要解决输入中文问题却很复杂,不能输入中文实在是太痛苦了. 我在做一个有很多文字的html页面 ...