什么是BFC?
什么是BFC,听起来是不是有点蒙,听到这个词就知道它是一个简写,BFC 的全称为:块格式化上下文(Block Formatting Context),触发BFC的元素会独立出来一个渲染区域,让处于BFC内部的元素与外部的元素相隔离,使内外元素定位不会相互影响。简单来说:BFC能影响盒模型的渲染规范;
怎么触发BFC?
- 浮动元素 float属性为 left/right
- 定位元素 position属性为 absolute 和 fixed
- display为inline-block, table-cell, table-caption, flex, inline-flex
- overflow:hidden;
意外吗?都是我们每天都在用的CSS样式。以上任何属性都可以让元素触发BFC,改变该元素的渲染规范。
BFC的功能
1、清除浮动
先说常用的一点,对,你没有看错,这些属性可以清除浮动,话不多说,上实例看
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title></title>
6 <style type="text/css">
7 *{
8 margin: 0;
9 padding: 0;
10 }
11 .wrap{
12 padding: 5px;
13 border: 10px solid #000;
14 /*overflow: hidden;*/
15 }
16 .left, .right{
17 width: 200px;
18 height: 200px;
19 float: left;
20 }
21 .left{
22 background-color: pink;
23 }
24 .right{
25 background-color: red;
26 }
27 </style>
28 </head>
29 <body>
30 <!--
31 现在父元素 .wrap 还没有清除浮动,先预览一遍看看
32 然后自己把我注释哪一行 CSS 解开注释再预览一下
33 -->
34 <div class="wrap">
35 <div class="left"></div>
36 <div class="right"></div>
37 </div>
38 </body>
39 </html>
父元素的浮动已经清除,高度自适应了,不止是 overflow:hidden;可以,我上面写的那些属性都行,我就不一一写实例了,可以自己去试试。
2、可以解决margin塌陷问题
先说一下什么是margin塌陷,这可以说是一个CSS的小BUG,看下面实例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.wrap{
width: 300px;
height: 300px;
background-color: #333;
margin-top: 50px;
margin-left: 50px;
}
.wrap .sub{
width: 100px;
height: 100px;
background-color: pink;
margin-top: 20px;
margin-left: 20px;
}
</style>
</head>
<body>
<div class="wrap">
<div class="sub"></div>
</div>
</body>
</html>
上面代码预览你会发现子元素的 margin-top 竟然没用了!这种BUG就叫做 margin 塌陷,怎么解决呢,先说一个笨办法,就是给父元素加一个border 或 border-top,就可以解决这个问题,还有一个办法就是把父元素转换为BFC格式,用浮动 float 、用定位 position 什么的都行,只要把父元素转换为 BFC 就行。说了这么多办法到底用哪个好呢?其实用哪个都不好,因为这些CSS样式都有自己的功能,比如说我用的定位,虽然解决了 margin 塌陷的问题,但是新问题出现了,这个元素脱离了文档流,影响了原来的布局,这在实际开发项目中可是大问题,那是不是这个BUG就没有办法解决了???不是,虽然这些CSS样式有自己的功能,你看用那条样式不影响你原来的布局就用那个,浮动不影响就用浮动,溢出隐藏不影响就用溢出隐藏,随机应变呗。
其实 BFC 还有一些功能,这次我也就不一下子说完了,把以上两点掌握,可以说是对 BFC 有了初步了解,后期的文章我还会说到这。最后再告诉大家一个冷知识,定位和浮动可以把元素转换为 inline-block 行内块元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.wrap{
border: 5px solid #333;
padding: 5px;
position: absolute;
}
.sub{
width: 100px;
height: 100px;
background-color: pink;
}
</style>
</head>
<body>
<span class="wrap">
<div class="sub"></div>
</span>
</body>
</html>
感谢观看,批评指导