浅谈BFC与应用
什么是BFC
BFC(Block formatting context)的中文翻译我们一般叫做块级格式化上下文。它是一个独立渲染的区域,规定了内部如何布局,同时不受外界的影响。我们的根元素本身就是一个BFC
BFC的特性
BFC的特性有很多,但是这里主要说到四点,也是我们常用的。
BFC内部的margin会发生折叠,即是我们常说的margin collasping。
BFC内部的浮动元素也参与高度计算,我们常利用此点解决高度塌陷的问题。
BFC的区域不会与float box重叠,我们可以利用这点来做到自适应两栏布局。
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
怎么生成一个BFC
根元素。因为根元素本身就是一个BFC
设置
float属性position为absolute或者fixedoverflow不为visible,一般而言我们都是设为hiddendisplay为inline-block, table-cell, table-caption, flex, inline-flex
BFC的用处或者解释
1. 边距折叠问题
前面我们说过,根元素本身就是一个BFC,所以我们经常提到的边距折叠,即是垂直方向上margin不会相加,而是选择较大的一个值作为margin,就像这个例子
<div style="width:200px;height: 200px;background-color: red;margin-bottom: 10px;"></div>
<div style="width:200px;height: 200px;background-color: green;margin-top: 20px;"></div>
看到上面的结果我十分感动啊,实在是没想到markdown真的能直接编译代码,那这样我以后还截个毛图,有代码直接在这里做实验行了。
说回正题,这里我们的上下边距是20px的而不是20+10=30px。这就是因为我们上文提到的BFC内部的正常块级元素(注意是正常)会发生垂直边距折叠。但是有时候我们不需要这种边距折叠,有没有什么办法去掉吗?这就需要用到我们上面提过的另一个特性
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
意思很明确了,所以我们要想避免这种折叠那么我们就可以新建一个BFC,也就是这样
<div style="overflow: hidden">
<div style="width:200px;height: 200px;background-color: red;margin-bottom: 10px;overflow:hidden"></div>
</div>
<div style="width:200px;height: 200px;background-color: green;margin-top: 20px;overflow:hidden"></div>
由于外部的盒子设了overflow:hidden,所以这个时候新建了一个BFC,而因为BFC里外是不能互相影响的,所以margin就无法折叠。
2.解决高度塌陷
<style>
.par {
border: 5px solid #fcc;
width: 300px;
}
.child {
border: 5px solid #f66;
width:100px;
height: 100px;
float: left;
}
</style>
<body>
<div class="par">
<div class="child"></div>
<div class="child"></div>
</div>
</body>
.par {
border: 5px solid #fcc;
width: 300px;
}
.child {
border: 5px solid #f66;
width:100px;
height: 100px;
float: left;
}
从效果中我们可以看出,父盒子此时并没有高度,因为正常情况下就算高度是不会把浮动元素也算进去的,但是很多时候我们为了达到高度自适应,不能手动给父元素定高而是应该让子元素撑起来,所以面对这种情况我们就可以用到BFC的这一特性
BFC内部的浮动元素也参与高度计算,我们常利用此点解决高度塌陷的问题。
所以这里我们只需要给父元素加一个overflow:hidden使父元素变成BFC便可。
3.两栏自适应布局
<style>
.wrap{
width: 800px;
height:200px;
}
.aside {
width: 300px;
height: 150px;
float: left;
background: #f66;
}
.main {
height: 200px;
background: #fcc;
}
</style>
<div class="wrap">
<div class="aside"></div>
<div class="main"></div>
</div>
.wrap{
width: 800px;
height:200px;
}
.aside {
width: 300px;
height: 150px;
float: left;
background: #f66;
}
.main {
height: 200px;
background: #fcc;
}
对于这段代码出来的效果应该没什么问题,我们把aside浮动了,而main的宽度随着wrap变化,所以此时aside浮在main上面。
BFC的区域不会与float box重叠,我们可以利用这点来做到自适应两栏布局。
我们利用这个特点,把我们的main元素变成BFC,这样它就不会与我们的浮动元素进行重叠,然后我们便实现了一个两栏自适应布局的效果。
<style>
.wrap{
width: 800px;
height:200px;
}
.aside {
width: 300px;
height: 150px;
float: left;
background: #f66;
}
.main {
height: 200px;
background: #fcc;
}
.main{
overflow:hidden;
}
</style>
<div class="wrap">
<div class="aside"></div>
<div class="main"></div>
</div>
当然,对于两栏自适应布局,除了采用BFC之外,我之前还写过一篇文章说过两栏自适应布局,那种方式就做圣杯布局的方法。
浅谈BFC与应用的更多相关文章
- 【css】浅谈BFC
定义: 块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视化CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域. BFC的布 ...
- 浅谈BFC
Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由很多个 Box 组成的.元素的类型和 display属性,决定了这个 Box 的类型. 不同类型的 Box, 会参与不同的 Fo ...
- 浅谈BFC的理解
在 web 页面布局中,有三种控制元素版式布局的模型: 普通流 (Flow) 元素在 HTML 中按照先后位置从上至下的流式排列方式布局. 浮动流(Float) 在浮动布局中,元素首先按照普通流的位置 ...
- 浅谈BFC和IFC
先说说FC,FC的含义就是Fomatting Context.它是CSS2.1规范中的一个概念. 它是页面中的一块渲染区域.而且有一套渲染规则,它决定了其子元素将怎样定位.以及和其它元素的关系和相互作 ...
- 浅谈BFC与高度塌陷
这个概念我大概是去年时候接触到的吧,略略记录了一下,没有深入研究,恰逢最近秋招,在这里写一写,顺便加深自己的印象. 什么是BFC? 页面中的元素都隐含一个属性Block Formatting Cont ...
- BFC 浅谈
写在前面 Block formatting context (块级格式化上下文) 页面文档由块block构成 每个block在页面上占据自己的位置使用新的元素构建BFC overflow:hidden ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
随机推荐
- centOS下恢复win8引导
正题(非原创): shutdown两次以后确信我的win8引导没有了 百度后找到一个修改grub.cfg文件的方法 这个文件在普通用户下是没有修改的权利的 要在sudo su之后用root权限 vi ...
- 动态弹球的实现 加入了多线程技术--javaSE游戏准备工作
任务描述:实现了动态弹球的功能,对于有弹球功能的SE游戏奠定了基础. package 运用线程技术的小球; import java.awt.*; import java.awt.event.*; im ...
- H面试程序(15): 冒泡排序法
#include<stdio.h> #include<assert.h> void display(int * a, int n) { for(int i = 0; i < ...
- 淘宝PK京东:哥刷的不是广告,刷的是存在
冯强/文 (昨晚看阿根廷vs瑞士时手机上敲的,看完太激动忘发了,现配了图发上来) 这两天,关于京东.淘宝渠道下沉的新闻中,两家略带喜感的农村墙体广告在互联网上传播,例如以下图: 京东这图片,越看越像P ...
- iOS开发中NSDate时间戳的转换--
NSTimeInterval time =(NSTimeInterval )[model.day floatValue]; NSDate *date = [NSDate dateWithTimeInt ...
- unity学习中经常要碰到的几种数据结构
常碰到的几种数据结构:1.Array,2.ArrayList,3.List<T>,4.LinkedList<T>,5.Queue<T>,6.Stack<T&g ...
- pChart图表插件使用
<?php /* 柱形图 */ #引入库文件 include("../class/pData.class.php"); include("../class/pDra ...
- sqlite可视化工具以及django-South
在linux系统下想要可视化sqlite的办法 一:安装sqlitebrowser: sudo apt-get install sqlitebrowser 二:在终端提示符后输入sqlitebrows ...
- 使用DiskGenius对虚拟机磁盘进行压缩
使用虚拟机的用户是否感觉到您的虚拟磁盘文件越来越大,都快把宝贵的磁盘空间(宿主机物理硬盘)占满了呢? 有人会想到,我直接启动虚拟机,然后把里面没用的数据删除了,不就行了吗?实际测试发现,这样删除后,存 ...
- android蓝牙的调试(博通蓝牙工作 and 低功耗模式)
首先结合项目从整体上去把握这部分: 蓝牙模块中一个比较核心的文件是bluetooth.c, 在我们上电的时候, 会调用这个文件中bt_enable()这个函数, 在这个函数里面先调用set_bluet ...