塊狀格式化上下文BFC

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(absolutefixed
  • display為inline-block办桨、table-cells筹淫、flexinline-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)在的效果如圖:


未消除浮動(dòng)

按照以前的方案比规,一般會(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;
}

效果圖如下:


BFC消除浮動(dòng)
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è)置成不同的BFC

正確的姿勢(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)題就解決了抄瑟,如圖:


放入不同的BFC
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屬性的新取值

  1. 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è)屬性值

  1. 兼容性
    兼容性問(wèn)題萝毛,一般都是直接Can I use一把梭,會(huì)發(fā)現(xiàn)滑黔,其實(shí)除了firefox和chrome(當(dāng)然還有Opera)對(duì)這個(gè)屬性比較友好外笆包,其他瀏覽器還不太支持
    can i use display: flow-root

參考:

  1. 塊格式化上下文 in MDN
  2. Understanding CSS Layout And The Block Formatting Context
  3. Airen的博客 — flow-root
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市略荡,隨后出現(xiàn)的幾起案子庵佣,更是在濱河造成了極大的恐慌,老刑警劉巖汛兜,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巴粪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肛根,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門辫塌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人派哲,你說(shuō)我怎么就攤上這事臼氨。” “怎么了狮辽?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵一也,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喉脖,道長(zhǎng)椰苟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任树叽,我火速辦了婚禮舆蝴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘题诵。我一直安慰自己洁仗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布性锭。 她就那樣靜靜地躺著赠潦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪草冈。 梳的紋絲不亂的頭發(fā)上她奥,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音怎棱,去河邊找鬼哩俭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拳恋,可吹牛的內(nèi)容都是我干的凡资。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谬运,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼隙赁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起梆暖,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸳谜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后式廷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芭挽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年滑废,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝗肪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蠕趁,死狀恐怖薛闪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俺陋,我是刑警寧澤豁延,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站腊状,受9級(jí)特大地震影響诱咏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缴挖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一袋狞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧映屋,春花似錦苟鸯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瘫析,卻和暖如春砌梆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颁股。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工么库, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甘有。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓诉儒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親亏掀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忱反,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359