本文主要是针对BFC特性的应用,至于什么是BFC,可以参看MDN的简介:
 
   
使用Block Formatting Context可以解决如下问题:
 
  (1)父元素的垂直外边距不会和子元素的垂直外边距重叠
  (2)开启该特性的元素不会被浮动元素所覆盖
  (3)开启该特性的父元素可以包含浮动的子元素
 
BFC的这个特性默认是不具有的,所以我们需要手动的去开启这个特性,开启的方法如下所示:
 
  (1)设置浮动(脱离了文档流)
  (2)设置绝对定位(脱离了文档流)
  (3)设置display为inline-block(如果是块级元素,这样设置会具有行内元素的特性)
  (4)设置overflow设置为除visible之外的值(副作用最小的方式)

(1)使用BFC特性解决块级父元素无法包含浮动子元素的问题
利用上面的BFC的第三点特性就可以解决该问题。
首先,我们先进行一下问题场景重现。如下所示的两个div:
 <div class="box1">
<div class="inBox1"> </div>
</div>
box1中包含inBox1,当我们不显示的给box1设置一个高度时,box1的高度取决于inBox1的高度,也就是子元素会把父元素“撑开”。效果如下所示:

如图所示,红色边框的是box1,蓝色边框的是inBox1。CSS如下:
 <style type="text/css">
/*
设定box1的样式
*/
.box1{
border: 5px solid red;
}
/*
设定box1内部的inBox1的样式
*/
.box1 .inBox1{
width: 100px;
height: 100px;
border: 1px solid blue;
}
</style>
接下来,如果我们手动的为inBox1设置一个浮动属性(float:left;),就会成为如下所示的效果:

这时,我们就可以形象的称父div——box1出现了“高度塌陷”问题。
造成这个问题的原因就是给inBox1设置了浮动属性后,子div和父div不在同一层了,所以子元素就无法承担起“撑开”父元素的任务了。
解决方法就是将box1的overflow属性设置为hidden。这样设置的好处就是副作用很小。添加后如下所示:


(2)使用BFC特性解决父元素的垂直外边距和子元素的垂直外边距重叠
场景还原如下:
<!DOCTYPE html>
<html>
<head>
<title>BFC</title>
<style type="text/css">
/*
设定box1的样式
*/
.box1{
background-color: red;
/* 为了演示重叠,我们给父元素也设置一个上外边距 */
margin-top: 20px;
}
/*
设定box1内部的inBox1的样式
*/
.box1 .inBox1{
width: 100px;
height: 100px;
border: 1px solid yellow;
/* 为子元素设置一个上外边距 */
margin-top: 100px;
}
</style>
</head>
<body>
<div class="box1">
<div class="inBox1"> </div>
</div>
</body>
</html>
在运行结果中我们可以看到子元素的上外边距与父元素的上外边距发生了重叠,并且取了一个最大值,也就是子元素的上外边距。

也许我们想要的效果并不是这样的,我们需要子元素以父元素的上边界外参考设置margin-top,解决方法同样是为父元素设置overflow:hidden;属性,效果如下所示:


(3)使用BFC特性解决浮动覆盖问题
如果有两个div如下所示:

如果我们给红色div块加上一个左浮动属性,则红色块会脱离文档流并位于文档流上层,所以红色块会盖住蓝色块。效果如下所示:

为了不让蓝色块被盖住,我们可以给蓝色块设置一个overflow:hidden;开启BFC特效,效果如下所示:

代码如下所示:
 <!DOCTYPE html>
<html>
<head>
<title>BFC</title>
<style type="text/css">
/*
为box1设置样式
*/
.box1{
width: 100px;
height: 100px;
background-color: red;
/* 为红色块设置一个浮动属性,使其脱离文档流 */
float: left;
}
/*
为box2设置样式
*/
.box2{
width: 100px;
height: 100px;
background-color: blue;
/* 为蓝色块开启BFC特性 */
overflow: hidden;
}
</style>
</head>
<body>
<div class="box1"> </div>
<div class="box2"> </div>
</body>
</html>

浅入“Block Formatting Context”的更多相关文章

  1. Block formatting context(块级格式化上下文)

    今天看到豆瓣面试官的一篇文章,讲到关于CSS中的一个知识点:Block formatting context  ,感觉这个确实挺有用,同时我也挺赞同作者的一些观点的,这里就不展开谈我的感受了, 此文只 ...

  2. 块级格式化上下文(block formatting context)

    在CSS2.1中,有三种定位方案--普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inline元素水平排列,直到行被占满后换行,block元素则被渲染为完整的一行,除非指定,所有元素 ...

  3. 【转】关于Block Formatting Context--BFC和IE的hasLayout

    转自穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为“块级格式化范围”. 是 W3C CSS ...

  4. 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解

    CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...

  5. 关于Block Formatting Context--BFC和IE的hasLayout

    转文请标明 --- 出处:穆乙 http://www.cnblogs.com/pigtail/ 一.BFC是什么? BFC(Block Formatting Context)直译为"块级格式 ...

  6. css Block formatting context BFC

    w3c关于BFC解释: http://www.w3.org/TR/CSS21/visuren.html#block-formatting Mdn描述: A block formatting conte ...

  7. Block formatting context

    不会JS中的OOP,你也太菜了吧!(第一篇)   一.你必须知道的 1) 字面量 2) 原型 3) 原型链 4) 构造函数 5) 稳妥对象(没有公共属性,而且其方法也不引用this的对象.稳妥对象适合 ...

  8. CSS BFC(Block Formatting Context)

    BFC是 W3C CSS 2.1 规范中的一个概念Block Formatting Context的缩写即格式化上下文,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.简单讲,它是提 ...

  9. 什么是BFC(Block Formatting Context)

    原文:https://segmentfault.com/a/1190000012221820 https://www.w3.org/TR/CSS2/visuren.html#block-formatt ...

随机推荐

  1. DUILIB CDialogBuilder 使用问题

    频繁调用CDialogBuilder的create接口创建同一个配置文件,会报异常: 正常的处理方式如下: if (!m_dlgBuilder.GetMarkup()->IsValid()) { ...

  2. mysql时间查看以及定时器相关操作

    1.查看事件 show events select * from mysql.event 2.查看是否开启定时器 0:off:1:on 开启定时器:set global event_scheduler ...

  3. jquery中prop()与attr()方法的区别

    一.prop() 简单来说是当需要判断真假时使用,如复选框时: if( $(this).prop('checked')){ //当返回true时在这里调用 }else{ //当返回false时在这里调 ...

  4. 咏南IOCP中间件

    咏南IOCP中间件 特大好消息,咏南中间件系列新增加——咏南IOCP中间件.咏南IOCP中间件完全兼容咏南DATASNAP中间件的远程方法接口. 中间件DELPHI7~DELPHI XE10.1.1都 ...

  5. 20145318赵一Java课程总结

    20145318赵一Java课程总结 每周读书笔记链接汇总 问卷调查 第1周读书笔记 第2周读书笔记 第3周读书笔记 第4周读书笔记 第5周读书笔记 第6周读书笔记 第7周读书笔记 第8周读书笔记 第 ...

  6. 一个关于AM335X比较全面的笔记博客

    http://www.eefocus.com/marianna/blog/cate_18142_0.html

  7. Ubuntu 14.04中gedit打开文件出现中文乱码问题

    http://blog.csdn.net/cywosp/article/details/32325449/ 在中文支持配置还不完整的Ubuntu 14.04中,使用gedit打开带有中文字符的文件有时 ...

  8. DP专题——括号序列

    毕竟是个渣,写完一遍之后又按LRJ的写了一遍,再写了一遍递归版,最终加上输出解部分 括号序列 定义如下规则序列(字符串): 空序列是规则序列: 如果S是规则序列,那么(S)和[S]也是规则序列: 如果 ...

  9. 如何让chrome始终运行插件

    使用chrome可能有时候会拦截比如阿里旺旺和腾讯等的登录插件,那么怎么才始终允许,而不需要每次确认呢.下面. 1. 打开Chrome浏览器. 在地址栏中输入 chrome://plugins 回车 ...

  10. 修改默认MYSQL数据库data存放位置

    随着业务量的增长,mysql默认安装所在分区大小出现瓶颈,通常需要将datadir换到较大的分区 示例原目录:/usr/local/mysql/data/示例新目录:/data/mysqldata/ ...