CSS BFC和Float

實在是在面試中,倒了太多次CSS的栽,所以透過這次自己的筆記來重新學習一下CSS的基本原理。
這篇文章回講到基礎以及自己解釋的BFC(Block formating context),另外提出float跟bfc之間的互動。最後放上一個在面試遇到的問題,並提供自己的解法。

BFC(Block formating context)

來個MDN上面的基本解釋 : 塊格式化上下文(block formatting context) 是頁面 CSS 視覺渲染(visual CSS rendering)這個過程中的一個概念。它是決定塊盒子的佈局及浮動元素相互影響的一個因素。
下列情況將創建一個塊格式化上下文:

  1. 根元素或其它包含它的元素
  2. 浮動 (元素的 float 不為 none)
  3. 絕對定位元素 (元素的 position 為 absolute 或 fixed)
  4. 行內塊 inline-blocks (元素的 display: inline-block)
  5. 表格單元格 (元素的 display: table-cell,HTML表格單元格默認屬性)
  6. 表格標題 (元素的 display: table-caption, HTML表格標題默認屬性)
  7. overflow 的值不為 visible的元素
  8. 彈性盒子 flex boxes (元素的 display: flex 或 inline-flex)

或許很難記,大概常用的就是float、position:absolute/ fixed、display:inline-block、overflow: 不為visible。
當然這樣講完BFC是怎麼運作還是很茫然,依據葵中劍大大的文中所說[https://swordair.com/css-positioning-schemes-normal-flow/] ,BFC就是在展示元素時,提供一個新的容器包覆著這個元素以及其子元素。而這個BFC對容器內的布局,以及對外的互動有它的規則。
來舉個範例

<body>
<div >
  <div style="background-color:green; float:right; width:100px; margin: 5px 0 0 0 ;">b</div>
  <div style="background-color:red;">a</div>
</div>
</body>
圖1

發現b跳脫文件普通流,但是卻不影響div a的寬度。如果這時候,你將div a的overflow設定成auto,div a 就會產生新的BFC,而BFC的特性就會出現,兩個不同的BFC,邊框會分離。原本div b 的外邊框會緊黏著root(最原始的根元素也會產生BFC唷!)的BFC的邊框,現在出現新的BFC在同一層級,他就只能黏著這新來的BFC的邊框。

<div >
  <div style="background-color:green; float:right; width:100px; margin: 5px 0 0 0 ;">b</div>
  <div style="background-color:red; overflow:auto;">a</div>
</div>
圖2

Float與BFC的巧妙關係

時常子元素設定成Float以後,父元素因為子元素float跳脫普通流,而沒有內容,所以高度變為0。以往最常見的做法就是,多設一個div並設定clear:both,來清除float產生的作用。但其實BFC本身是可以包容float的(這也解釋為什麼float沒有讓整個頁面變成0,因為root有建立一個BFC,以及float可以包住float的故事)
下面就是用overflow來建立BFC來解釋這個特性。

首先,先來看最原始的狀態,子元素設定float,讓父元素的高度變成0。

<body>
<div style="background-color:red;">
  <div style="background-color:green; float:right; width:100px; margin: 5px 0 0 0 ;">b</div>
</div>
</body>
圖3

這時候,其實只要設定overflow,來讓他建立時,同時建立出BFC,就可以讓他包住這個float。

<body>
<div style="background-color:red; overflow:auto;">
  <div style="background-color:green; float:right; width:100px; margin: 5px 0 0 0 ;">b</div>
</div>
</body>
圖4

慘痛的面試題目

這是一個我實際遇到的面試題目,其實很簡單,但我當時菜菜的,就是回答不出來。
題目: 請敘述如何實作一個三欄的頁面,最左跟最右欄要緊貼著邊框,固定大小(如100px),而中間那一欄則依據頁面大小,自適應的變動框度。

大家想一想吧XD

我把我的解法放下面,解法千百種,可以自己解解看。
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />

<body>
  <div style="background-color:green; float:left; width:100px;">left</div>
  <div style="background-color:green; float:right; width:100px;">right</div>
  <div style="background-color:red; overflow:auto;">middle</div>
</body>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容