BFC是什么宇驾?
BFC,塊狀格式化上下文猴伶,其實(shí)是一個(gè)隔離的獨(dú)立盒子(容器)课舍,他有以下特性:
- 容器里面的子元素不會(huì)影響到外面的元素,容器外的元素也不會(huì)影響到里面
- BFC容器會(huì)一個(gè)挨著一個(gè)排列
- 計(jì)算BFC的高度時(shí)他挎,浮動(dòng)元素也參與計(jì)算
- BFC的區(qū)域不會(huì)與float box重疊
怎樣觸發(fā)(創(chuàng)建)一個(gè)BFC筝尾?
- boby的根節(jié)點(diǎn)
- 浮動(dòng)的元素:float除了none以外
- 絕對(duì)定位的元素:position(
absolute
、fixed
) - display為
inline-block
办桨、table-cells
筹淫、flex
、inline-flex
呢撞、flow-root
(沒(méi)有副作用的方案损姜,但需注意兼容性)、grid
殊霞、inline-grid
等 - overflow除了visible之外
BFC有什么用摧阅?
1. 清除浮動(dòng):因?yàn)锽FC可以包含浮動(dòng)的元素,故把浮動(dòng)元素的父元素設(shè)為BFC容器即可
<!-- html -->
<div class="box">
<div class="floatDiv">
我是一個(gè)浮動(dòng)的div绷蹲,現(xiàn)在我想讓它高一點(diǎn)棒卷,高過(guò)另外一行文字吧,對(duì)吧祝钢,這樣才能看到效果
</div>
這是一段很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)(有多長(zhǎng)隨便啦)的文字
</div>
/* CSS */
.box {
border: 5px dotted #faa509;
padding: 10px;
width: 300px;
}
.floatDiv {
float: left;
border: 2px solid #00d0ff;
width: 100px;
}
現(xiàn)在的效果如圖:
按照以前的方案比规,一般會(huì)在后面加一個(gè)空的div標(biāo)簽來(lái)清除浮動(dòng)(或者有其他各種方案)
<!-- html -->
<div class="box">
<div class="floatDiv">
我是一個(gè)浮動(dòng)的div,現(xiàn)在我想讓它高一點(diǎn)太颤,高過(guò)另外一行文字吧苞俘,對(duì)吧,這樣才能看到效果
</div>
這是一段很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)很長(zhǎng)(有多長(zhǎng)隨便啦)的文字
<div class="clearfix"></div>
</div>
/* 添加CSS */
.clearfix{
clear: both;
}
那么使用BFC特性怎么操作呢龄章?
很簡(jiǎn)單,只需要給.box
加多一個(gè)樣式使其變成BFC就可以了
/* 添加CSS */
.box{
display: flow-root;
}
效果圖如下:
2. 解決元素間上下邊距發(fā)生折疊的問(wèn)題(外邊距塌陷):把元素放入(注意:是放入乞封,不是設(shè)置成)不同的BFC容器中
<!-- html -->
<div class="container">
<p class="text">這是一堆文字</p>
<p class="text">隨便寫做裙,開心就好</p>
</div>
/* CSS */
.container {
border: 5px dotted #faa509;
width: 300px;
background: #ccc;
}
.text{
border: 1px solid #faa509;
margin: 20px;
text-align: center;
}
現(xiàn)在的效果圖為:
- 發(fā)現(xiàn)問(wèn)題:認(rèn)真看一眼,會(huì)發(fā)現(xiàn)肃晚,其實(shí)第一段文字和第二段文字中間的margin加起來(lái)應(yīng)該是40px锚贱,但是現(xiàn)在效果圖看來(lái)只有20px。這就是上下邊距折疊关串,也就是外邊距塌陷拧廊。
- 解決問(wèn)題:那么怎么解決這個(gè)問(wèn)題呢监徘?就是上面所說(shuō)的,把元素放入不同的BFC容器中
為什么這里要強(qiáng)調(diào)是放入而不是設(shè)置成吧碾,因?yàn)楸救艘婚_始只是把兩段文本設(shè)置成不同的BFC容器凰盔,然后就陷入了短暫的懵比。
/* 添加CSS */
.text{
display: flow-root;
}
添加上面css后倦春,會(huì)發(fā)現(xiàn)户敬,一點(diǎn)改變都沒(méi)有,如圖:
正確的姿勢(shì)應(yīng)該是:
<!-- 修改html -->
<div class="container">
<p class="text">這是一堆文字</p>
<div class="textBox"> <!-- 用textBox把其中一段文本包起來(lái) -->
<p class="text">隨便寫睁本,開心就好</p>
</div>
</div>
/* 添加CSS */
.textBox{
display: flow-root;
}
首先用一個(gè)div把文本包起來(lái)尿庐,再把這個(gè)div設(shè)置為BFC,這樣呢堰,上下邊距折疊的問(wèn)題就解決了抄瑟,如圖:
3. 防止元素間的重疊覆蓋,可實(shí)現(xiàn)自適應(yīng)兩列布局:左邊元素左浮動(dòng)枉疼,右邊元素設(shè)置為BFC容器
先看一下元素間重疊是怎樣的
<!-- html -->
<div class="container">
<div class="left"></div>
<div class="right"></div>
</div>
/* CSS */
.container {
border: 5px dotted #faa509;
width: 300px;
}
.left{
background: #fadc09;
height: 100px;
width: 100px;
float: left;
}
.right{
height: 300px;
background: #faa509;
}
你會(huì)發(fā)現(xiàn)皮假,浮動(dòng)的元素和不浮動(dòng)的元素重疊在一起了,利用BFC的區(qū)域不會(huì)與float box重疊的特性往衷,我們就可以簡(jiǎn)單的實(shí)現(xiàn)兩列布局了钞翔。只需要把右邊元素設(shè)置為一個(gè)BFC就行
/* 添加CSS */
.right{
display: flow-root;
}
竟然說(shuō)到了兩欄布局,那就順便介紹一種黑魔法實(shí)現(xiàn)等高兩欄布局席舍,直接上代碼
<!-- html -->
<div class="container">
<div class="left"></div>
<div class="right"></div>
</div>
/* CSS */
.container {
border: 5px dotted #faa509;
width: 300px;
overflow: hidden;
}
.container>div{
/* 注意這里 */
padding-bottom: 100000px;
margin-bottom: -100000px;
}
.left{
background: #fadc09;
height: 100px;
width: 100px;
float: left;
}
.right{
height: 300px;
background: #faa509;
display: flow-root;
}
它根據(jù)子元素的最大高度來(lái)決定整體高度布轿,可以隨意改變.left或者.right的高度來(lái)測(cè)試一下是否符合等高,也可以往里面填充內(nèi)容測(cè)試
順便提一下display:flow-root
来颤?
前面說(shuō)到display:flow-root
這種方式創(chuàng)建一個(gè)BFC是最沒(méi)有副作用的方式汰扭,那么這里就介紹一下flow-root
這個(gè)display屬性的新取值
- W3C中怎么描述
flow-root
The element generates a block container box, and lays out its contents using flow layout. It always establishes a new block formatting context for its contents. [CSS2]
直譯過(guò)來(lái)就是:該元素生成一個(gè)塊容器框,并使用流布局布置其內(nèi)容福铅。它始終為其內(nèi)容建立新的塊格式化上下文
說(shuō)明這是SS2新增的專為建立塊格式化上下文的一個(gè)屬性值
- 兼容性
兼容性問(wèn)題萝毛,一般都是直接Can I use一把梭,會(huì)發(fā)現(xiàn)滑黔,其實(shí)除了firefox和chrome(當(dāng)然還有Opera)對(duì)這個(gè)屬性比較友好外笆包,其他瀏覽器還不太支持
can i use display: flow-root
參考: