前言
关于BFC,很多人可能很熟悉,但有些人可能第一次听说。对于熟悉的人无妨也可以温习一下查缺补漏。对于还不是很了解的人认真阅读完后,应该都能够比较深入的理解BFC这个概念、作用以及用法。希望对大家有所收获。
BFC是什么?
BFC
全称为 block formatting context
,中文为“块级格式化上下文”。它是一个独立的渲染区域,规定了内部如何进行布局,并且内外部的元素之间互不影响。相对应的还有 IFC
, 也就是inline formatting context
,中文为“内联格式化上下”。它不是本文的重点,感兴趣的童鞋可以自行查阅了解。
如何形成BFC?
-
<html>
根元素 -
float
的值不为none
-
overflow
的值为auto
、scroll
或hidden
-
display
的值为table-cell
、table-caption
和inline-block
中的任何一个 -
position
的值不为relative
和static
其中,最常见的就是overflow:hidden
、float:left/right
、position:absolute
。也就是说,每次看到这些属性的时候,就代表了该元素以及创建了一个BFC
了。
BFC作用有哪些?
- 利用
BFC
可以阻止垂直外边距重叠 - 利用
BFC
可以清除浮动 - 利用
BFC
进行自适应布局 - 利用
BFC
可以阻止被浮动元素覆盖
BFC有什么特性?
特性1: BFC中元素会在垂直方向,从顶部开始一个接一个地放置。
我们平常说的盒子是由 margin
、border
、padding
、content
组成的,实际上每种类型的四条边定义了一个盒子,如图分别是content box
、padding box
、border box
、margin box
,这四种类型的盒子一直存在,即使他们的值为0。而决定块盒在包含块中与相邻块盒的垂直间距的便是margin-box
。从顶部一个接一个放置可以理解为平时div
一行一行块级放置的样式。
特性2: BFC中两相邻元素会发生折叠
元素垂直方向的距离由margin
决定。属于同一个BFC
的两个相邻元素的margin
会发生叠加
实例代码如下:
<p>ABC</p>
<p>abc</p>
p {
color: #fff;
background: #f66;
width: 200px;
line-height: 100px;
text-align:center;
margin: 100px;
}
效果图:
上面例子中两个P之间的距离本该为100px
,然后实际却为50px
,主要原因是发生了margin
折叠了。如果遇到这种情况,只需要将两个P
给其中一个P
外面包一个div
,然后通过触发外面这个div
的BFC
,就可以阻止这两个P
的margin
重叠。即利用BFC可以阻止垂直外边距重叠。
特性3: BFC中父子之间是margin box
与border box
左边相接触。
每个元素的margin box
的左边,与包含块border box
的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
实例代码如下:
<div class="wrap">
<div class="child">ABC</div>
</div>
.child {
color: #fff;
background: #f66;
width: 200px;
line-height: 50px;
text-align:center;
}
.wrap {
float: left;
border: 10px solid #fcc;
margin: 50px;
}
效果图:
给子div
加浮动,浮动的结果,如果没有清除浮动的话,父div
不会将子div
包裹,但还是在父div
的范围之内,子div
的两边边接触父div
的border box
的两边,除非设置margin
来撑开距离,否则一直是这个规则。
特性4: BFC的区域不会与float box
叠加。
实例代码如下:
<div class="aside"></div>
<div class="wrap">
<div class="child"></div>
</div>
.aside {
width: 100px;
height: 150px;
float: left;
background: #f66;
}
.child {
height: 200px;
overflow: hidden; //触发main盒子的BFC
background: #fcc;
}
.wrap {
width: 500px;
}
效果图:
上面aside
盒子有一个浮动属性,覆盖了child
盒子的内容,child
盒子没有清除 aside
盒子的浮动。只做了一个动作,就是触发自身的BFC,然后就不再被aside
盒子覆盖了。所以,BFC
的区域不会与float box
重叠。即利用BFC可以阻止被浮动元素覆盖
特性5: BFC内外元素互不影响
BFC
就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。
实例代码如下:
<div class="main">
<div class="child">ABC</div>
</div>
<div class="wrap">
<p>content</p> <p>content</p> <p>content</p> <p>content</p> <p>content</p>
</div>
.wrap {
height: 200px;
background: #AAA;
}
.main {
float: left;
width: 100px;
height: 100px;
background: #f66;
}
.child {
color: #fff;
padding-left: 200px;
line-height: 50px;
}
效果图:
上面例子中,main
盒子形成了BFC
,BFC
是一个独立的渲染区域里面ABC
元素不管如何的位移变化都不会影响到外元素。
特性6: 计算BFC的高度时,浮动元素也参与计算。
实例代码如下:
<div class="wrap">
<div class="child">ABC</div>
<div class="child">abc</div>
</div>
.wrap {
overflow: hidden;
width: 250px;
border: 5px solid #f66;
}
.child {
float: left;
width: 100px;
border: 5px solid #fcc;
line-height: 100px;
}
效果图:
上面例子可以看出,为达到清除内部浮动,我们可以触发wrap
生成BFC
,即利用BFC来清除浮动。
那么wrap
在计算高度时,wrap
内部的浮动元素child
也会参与计算。
最后
如果本文对你有所帮助,欢迎点赞关注!!!大家加油。。
更多优质文章可以访问GitHub博客,欢迎帅哥美女前来Star!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。