BFC基础分析
W3C官方对于BFC的描述只有3小段,强烈建议想理解BFC的朋友先去看看,链接见文末。
常见的文档流分为:定位流、浮动流、普通流3种。BFC是普通流中的一种。
本文提出3个问题并给出使用BFC来解决这些问题的方法,这3个问题是:
- 外边距折叠(Collapsing Margins)
- 让一个没有设置高度的容器包含浮动元素
- 阻止文字环绕
什么是BFC
根据W3C对BFC的描述,可以总结出:BFC是一个具有特殊CSS样式的HTML盒子,比如div
标签就经常用来当盒子用。
这些特殊样式如下,下面的样式只要满足一项,就说明这个盒子是BFC
- float: left | right
- position: fixed | absolute
- display: inline-block | table-cell | table-caption | flex | inline-flex
- overflow: hidden | scroll | auto
外边距折叠
外边距折叠有很多种情况,最简单的就是上下两个盒子,上面的设置了margin-bottom
,
下面的设置了margin-top
,这时候总的外边距并不是两者相加,而是取最大的外边距作
为总的外边距。(假设外边距的设置为正值)
下面的代码发生了外边距折叠。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>外边距折叠</title>
<style>
.container { background-color: red; width: 200px; }
p { background-color: lightgreen; margin: 10px 0; }
</style>
</head>
<body>
<div class="container">
<p>Sibling 1</p>
<p>Sibling 2</p>
</div>
</body>
</html>
下面的代码通过使用overflow: hidden;
新创建一个BFC,从而实现阻止外边距折叠。
(overflow: hidden;
本来的含义是:如果盒子的内容超出盒子,则这部分内容隐藏。)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>使用BFC阻止外边距折叠</title>
<style>
.container { background-color: red; width: 200px; }
p { background-color: lightgreen; margin: 10px 0;}
.newBFC {overflow: hidden; /* 这条样式专门用来创建BFC */}
</style>
</head>
<body>
<div class="container">
<p>Sibling 1</p>
<div class="newBFC">
<p>Sibling 2</p>
</div>
</div>
</body>
</html>
发生了外边距折叠(左),使用BFC阻止外边距折叠(右)。
容器无高度包含浮动元素
先看以下无BFC,容器无高度包含浮动元素会发生什么。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>无BFC容器无高度包含浮动元素</title>
<style>
.container {
width: 200px;
background-color: green;
outline: 1px dashed red;
}
.container div {
float: left;
background-color: lightgreen;
margin: 10px;
}
</style>
</head>
<body>
<div class="container">
<div>Sibling 1</div>
<div>Sibling 2</div>
</div>
</body>
</html>
上述代码运行效果如下:
可以看到,由于浮动元素是脱离普通文档流的,所以.container
盒子发生了塌陷,高度
变为0。如何阻止这种情况发生呢,请看下面的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>有BFC容器无高度包含浮动元素</title>
<style>
.container {
width: 200px;
background-color: blueviolet;
outline: 1px dashed red;
overflow: hidden; /* 创建BFC */
}
.container div {
float: left;
background-color: lightgreen;
margin: 10px;
}
</style>
</head>
<body>
<div class="container">
<div>Sibling 1</div>
<div>Sibling 2</div>
</div>
</body>
</html>
上面的代码给.container
盒子添加了一条样式overflow: hidden;
,解决了容器盒子
塌陷的问题。运行效果图如下:
阻止文字环绕
左图右文,文字环绕图片,代码实现如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>左图右文 - 文字环绕图片</title>
<style>
.container {
background-color: gainsboro;
width: 500px;
min-height: 400px;
padding: 10px
}
.pic {
float: left;
margin-right: 10px;
}
</style>
</head>
<body>
<div class="container">
<div class="pic">
<img src="5.jpg" alt="小王子">
</div>
<div class="text">
《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
</div>
</div>
</body>
</html>
运行效果如下:
有时候我们不需要文字环绕,就想让文字老老实实待在右边。
左图右文,文字不环绕图片代码实现如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>左图右文 - 文字不环绕图片</title>
<style>
.container {
background-color: gainsboro;
width: 500px;
min-height: 400px;
padding: 10px
}
.pic {
float: left;
margin-right: 10px;
}
.text {
overflow: hidden;
}
</style>
</head>
<body>
<div class="container">
<div class="pic">
<img src="5.jpg" alt="小王子">
</div>
<div class="text">
《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
从自己星球出发前往地球的过程中,所经历的各种历险。作者以小王子的孩子式的眼光,
透视出成人的空虚、盲目,愚妄和死板教条,用浅显天真的语言写出了人类的孤独寂寞、
没有根基随风流浪的命运。同时,也表达出作者对金钱关系的批判,对真善美的讴歌。
《小王子》是法国作家安托万·德·圣·埃克苏佩里于1942年写成的著名儿童文学短篇小说。
本书的主人公是来自外星球的小王子。书中以一位飞行员作为故事叙述者,讲述了小王子
</div>
</div>
</body>
</html>
运行效果如下:
总结
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素是不会影响到外面的元素。
- BFC的区域不会与其它float的元素区域重叠。
- 计算BFC的高度时,浮动子元素也参与计算。
如果有帮助,亲,点个赞奥!不胜感激。
参考资料
https://www.w3.org/TR/CSS22/visuren.html#block-formatting
https://www.sitepoint.com/understanding-block-formatting-contexts-in-css/
http://www.cnblogs.com/xiaohuochai/p/5248536.html#undefined
BFC基础分析的更多相关文章
- BFC(Block Formatting Context)基础分析
W3C官方对于BFC的描述只有3小段,强烈建议想理解BFC的朋友先去看看,链接见文末. 常见的文档流分为:定位流.浮动流.普通流3种.BFC是普通流中的一种. 本文提出3个问题并给出使用BFC来解决这 ...
- 深入理解BFC
定义 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上 ...
- “fixed+relative==absolute”——对BFC的再次思考
好久没写博客了,刚好今天跨年夜没约到什么妹子,在家宅着不如写点东西好了. 需求 昨天晚上,给公司年会做一个移动端的投票页面,遇到一个UI优化的问题: · 正文内容少于一屏时,投票提交按钮固定显示在页面 ...
- 关于CSS inline-block、BFC以及外边距合并的几个小问题
CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...
- 我对BFC的理解
最初这篇文章打算回答寒冬大神的第一问,谈谈CSS布局.本来呢我以为布局主要涉及float跟display相关属性,以及他们的包含框.静态位置等等.后来看了大神的一片面试文章,嗯?这里怎么还有个BFC, ...
- CSS3与页面布局学习总结(三)——BFC、定位、浮动、7种垂直居中方法
一.BFC与IFC 1.1.BFC与IFC概要 BFC(Block Formatting Context)即“块级格式化上下文”, IFC(Inline Formatting Context)即行内格 ...
- 前端精选文摘:BFC 神奇背后的原理
BFC 已经是一个耳听熟闻的词语了,网上有许多关于 BFC 的文章,介绍了如何触发 BFC 以及 BFC 的一些用处(如清浮动,防止 margin 重叠等).虽然我知道如何利用 BFC 解决这些问题, ...
- BFC的形成条件和特性分析
初学CSS时,我们学到很多有意思的CSS规则,比如外边距塌陷,还有浮动元素的一些特性等,其实这些规则背后都是BFC这个东西在控制,下面我们来看下BFC到底是什么. 什么是BFC BFC(Block f ...
- BFC布局
这几天都没有写博客,自己的懒惰又要跑出来了,发觉不能再这样下去了,不然就什么都不想干了,然后将之前已经写得差不多的博客重新检视了一遍.这篇博客已经写得挺久的了,但是一直没有发布,现在补充了一些,也让自 ...
随机推荐
- ntopng-一款流量审计框架的安装以及应用
核心交换机镜像流量审计对于企业应急响应和防患于未然至关重要,本文想通过介绍ntopng抛砖引玉讲一讲流量审计的功能和应用. 安装 安装依赖环境: sudo yum install subversion ...
- EF架构~Migration数据迁移的执行顺序
回到目录 对于单个分支项目来说,只要你生成一个migration的版本,就会有一个时间戳文件的对应,而在update-database时,会从最小的时间开始,一直执行到当前版本的migration,而 ...
- Silverlight将Excel导入到SQLserver数据库
最近纠结于读取Excel模板数据,将数据导入SQLServer的Silverlight实现,本文将实现代码贴出,作为一个简单的例子,方便各位: 1.先设计前台界面新建Silverlight5.0应用程 ...
- php中的date函数
一.带零 echo date('Y-m-d');2012-08-08二.不带零 echo date('Y-n-j');2012-8-8
- 如何简单的实现新手引导之UGUI篇
一个完整的游戏项目肯定是要做新手引导的,而引导做的好坏可能会影响玩家的留存.那么怎么简单的实现个简有效的引导呢!先不说废话,先看看效果,这是一个基于UGUI做的一个简单的引导! 怎么样,看着是那么回事 ...
- 从 JavaScript 到 TypeScript
本文首发在我的个人博客:http://muyunyun.cn/posts/66a54fc2/ 文中的案例代码已经上传到 TypeScript TypeScript 并不是一个完全新的语言, 它是 Ja ...
- Linux文件属性上
文件属性概述(ls -lhi) linux里一切皆文件Linux系统中的文件或目录的属性主要包括:索引节点(inode),文件类型,权限属性,链接数,所归属的用户和用户组,最近修改时间等内容: 解释: ...
- script标签跨域的缺点
1,只支持GET,不支持其他例如:put,delete,post等 2,想拿到数据需要服务器端做出相应处理,必须在window域下面有对应的执行函数.例如:window.callbackHandler ...
- 浙江省新高中信息技术教材,将围绕Python进行并增加编程相关知识点
2017年初消息: 浙江省信息技术新教材,即将在2017级(2017年9月入学)高中新生中开始使用. 据了解,与目前的选考(可以理解为高考科目)要求的信息技术教材由3本<信息技术基础>.& ...
- Spring AOP的注解实现
适用场景: 记录接口方法的执行情况,记录相关状态到日志中. 注解类:LogMark.java package com.lichmama.spring.demo.annotation; import j ...