概述

BFC是块级格式化上下文,它的一个令人熟知的运用是双飞翼布局或者两列布局。但其实它在其它地方也有很巧妙的运用。我把研究的心得记录下来,供以后开发时参考,相信对其他人也有用。

参考资料:

mdn块格式化上下文

为什么BFC可以解决margin叠加问题?

BFC——一个我们容易忽视掉的布局神器

BFC精髓

触发BFC的元素会变成一个独立的盒子,这个独立盒子里的布局不受外部影响也不会影响到外面的元素!这就是BFC的精髓所在!

常用的触发BFC的方法:

  1. 设置除 float:none 以外的属性值(如:left | right)。
  2. 设置除 overflow: visible 以外的属性值(如: hidden | auto | scroll)。
  3. 设置 display属性值为: inline-block。
  4. 设置 position 属性值为:absolute | fixed。

解决margin叠加问题

如下面的代码所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.div1 {
margin-bottom: 150px;
width: 200px;
height: 200px;
background-color: green;
}
.div2 {
margin-top: 100px;
width: 200px;
height: 200px;
background-color: purple;
}
</style>
</head>
<body>
<div class="div1"></div>
<div class="div2"></div>
</body>
</html>

两个块级元素div1和div2会发生上下边距重叠的情况。但是如果我们把div的display改为inline-block,就不会发生上下边距重叠了。代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.div1 {
margin-bottom: 150px;
width: 200px;
height: 200px;
background-color: green;
display: inline-block;
}
.div2 {
margin-top: 100px;
width: 200px;
height: 200px;
background-color: purple;
}
</style>
</head>
<body>
<div class="div1"></div>
<div class="div2"></div>
</body>
</html>

其实严格说来,并不是由于display: inline-block;触发了BFC从而使上下边距不叠加的,因为BFC的精髓是:触发BFC的元素会变成一个独立的盒子,这个独立盒子里的布局不受外部影响,也不会影响到外面的元素!而div1的margin-bottom不能算是盒子内部的布局

那是什么原因导致上下边距不叠加的?

因为W3C官方文档规定,上下边距叠加必须满足2个条件:一个是都是块级元素;另一个是都在同一个BFC里面。参见:w3.org关于margin合并的规范说明

所以我们把div1设置为inline-block之后,它就不是块级元素了,不满足条件1,自然就不会发生上下边距叠加。

解决margin影响父元素问题

我们给父元素的第一个子元素设置margin-top值,就会发现它影响到了父元素的margin值,原因是它和父元素的margin-top值合并了。实例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.div1 {
width: 200px;
height: 200px;
background-color: green;
}
.div2 {
margin-top: 100px;
width: 100px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div class="div1">
<div class="div2"></div>
</div>
</body>
</html>

我们一般是通过设置父元素的padding-top值为1px来解决的。但是利用BFC有更加简便的解决方法,那就是利用overflow: hidden或者overflow: auto,使父元素形成一个BFC,从而它里面的元素不受外面的元素影响,也不会影响外面的元素。实例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.div1 {
width: 200px;
height: 200px;
background-color: green;
overflow: auto;
}
.div2 {
margin-top: 100px;
width: 100px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div class="div1">
<div class="div2"></div>
</div>
</body>
</html>

清除浮动

如下面代码所示,如果我们给子元素加一个浮动,那么子元素就不能撑开父元素了。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.div1 {
width: 200px;
background-color: green;
border: 5px solid red;
}
.div2 {
float: left;
width: 100px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div class="div1">
<div class="div2"></div>
</div>
</body>
</html>

原因是,子元素通过float触发BFC,成为了一个独立的盒子,根据BFC的精髓,它不会影响外部元素,也不会受外部元素影响,所以它不会影响父元素的高度,所以不能撑开父元素

这个时候,如果给父元素触发BFC,就可以强制把子元素拉到它形成的独立盒子里面(在计算BFC的高度时,浮动元素也参与计算),这样就清除浮动了。而触发BFC最好用的还是overflow: hidden或者overflow: auto。实例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.div1 {
width: 200px;
background-color: green;
border: 5px solid red;
overflow: auto;
}
.div2 {
float: left;
width: 100px;
height: 100px;
background-color: purple;
}
</style>
</head>
<body>
<div class="div1">
<div class="div2"></div>
</div>
</body>
</html>

其它

我们在写css的时候,有时会遇到莫名其妙的问题,这个时候可以考虑给元素加一个overflow: hidden或者overflow: auto,使元素触发BFC成为独立盒子,往往能意想不到的解决问题呢!

你可能不知道的BFC在实际中的应用的更多相关文章

  1. 你所不知道的html5与html中的那些事第三篇

    文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...

  2. 你所不知道的html5与html中的那些事(三)

    文章简介: 关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后,所有的工作 ...

  3. 你所不知道的html5与html中的那些事(五)——web图像

    文章简介:       现在的页面,一般都离不开图像,而怎么做才能让我们的页面中的图像加载的又快又好呢?在优化页面速度的时候还有什么事是你所不知道的呢?     下面看看今天我为大家带来了哪些关于we ...

  4. 你所不知道的html5与html中的那些事(四)——文本标签

    文章简介:       关于html5相信大家早已经耳熟能详,但是他真正的意义在具体的开发中会有什么作用呢?相对于html,他又有怎样的新的定义与新理念在里面呢?为什么一些专家认为html5完全完成后 ...

  5. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  6. JavaScript中你可能不知道的九件事

    今天凑巧去W3School扫了一遍JavaScript教程,发现从中看到了不少自己曾经没有注意过的细节. 我这些细节列在这里.分享给可能相同不知道的朋友: 1.使用 document.write() ...

  7. JavaScript中你所不知道的Object(二)--Function篇

    上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...

  8. Spring中你可能不知道的事(一)

    Spring作为Java的王牌开源项目,相信大家都用过,但是可能大家仅仅用到了Spring最常用的功能,Spring实在是庞大了,很多功能可能一辈子都不会用到,今天我就罗列下Spring中你可能不知道 ...

  9. [No0000194]聊聊 Chrome DevTools 中你可能不知道的调试技巧

    对于前端开发者来说,ChromeDevTools 绝对是不可或缺的调试工具,我们常用的调试方法包含一些console等,而ChromeDevTools 其实很强大,下面来聊聊一些你可能不知道的debu ...

随机推荐

  1. Delphi中Chrome Chromium、Cef3学习笔记(二)

    原文   http://blog.csdn.net/xtfnpgy/article/details/46635739   用Tchromium替换webbrowser 用惯了EmbeddedWB,不想 ...

  2. sublime3支持es6语法和vue彩色显示

    支持ES6语法设置: 首先安装nodejs 当然你可以使用其它诸如jsc之类的环境来运行js, 本文使用的是nodejs. 首先确保你的电脑已经安装好nodejs, 并已将其添加到环境变量中 (一般安 ...

  3. springboot+mybatis+freemark+oauth开发环境搭建

    一.创建springboot工程 1.环境介绍: a:jdk版本:1.7 b:Springboot版本:1.5.6(使用1.5.9的版本整合mybatis会报错:java.lang.NoClassDe ...

  4. C++中的覆盖与隐藏(详细讲解)

    C++类中覆盖与隐藏一直是一个容易理解出错的地方,接下来我就详细讲解一下区别在何处 覆盖指的是子类覆盖父类函数(被覆盖),特征是: 1.分别位于子类和父类中 2.函数名字与参数都相同 3.父类的函数是 ...

  5. Ubuntu修改时间时区

    设定时区:dpkg-reconfigure tzdata 选择Asia,Hong Kong. sudo apt-get install ntpdate // 安装时间同步工具 sudo ntpdate ...

  6. python的序列类

    1,我们常见的数据结构有哪些是序列类 序列类型的分类: ①  容器序列:list,tuple,deque(可以防止任意的类型的容器) ②  扁平序列:str,bytes,bytearray,array ...

  7. 锻造(forging)

    --九校联考24OI__D1T1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现--自己连一个史莱姆都打不过了. 勇 ...

  8. [费用流][BZOJ1070]修车

    修车 题目描述 同一时刻有位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均 ...

  9. mysql启动错误,提示crash 错误

    :: mysqld_safe Starting mysqld daemon with databases from /data/mysql_data -- :: [Note] Plugin 'FEDE ...

  10. AutoCAD开发3--修改文字图层,颜色

    Dim pText As AcadText Dim pColor1 As AcadAcCmColor Set pColor1 = Application.GetInterfaceObject(&quo ...