理解 BFC 和 IFC

常見定位方案

  • 普通流(normal flow)

在普通流中, 元素按照其HTML中的先后位置自上而下布局做祝, 在這個過程中混槐, 行內元素水平排列, 直到行內被占滿后換行翻诉; 塊級元素則會渲染為完整的新行碰煌。除非另外指定芦圾,否則所有元素默認都是普通流定位个少, 也可以說, 普通流中元素的位置由該元素在HTML文檔中的位置決定眯杏。

  • 浮動(float)

在浮動布局中夜焦,元素首先按照普通流的位置出現(xiàn), 然后根據(jù)浮動的方向盡可能的向左邊或者向右邊偏移岂贩, 其效果與印刷版中的文本環(huán)繞相似茫经。

  • 絕對定位(absolute positioning)

在絕對定位布局中, 元素會整體脫離文檔流萎津, 因此絕對定位元素不會對其兄弟元素造成影響卸伞, 而元素具體的位置由絕對定位的坐標決定。

BFC

BFC即Block Formatting Contexts(塊級格式化上下文)锉屈, 它屬于上述定位方案的普通流荤傲。
具有BFC特性的元素可以看作是隔離了的獨立容器颈渊, 容器里面的元素不會在布局上影響到外面的元素查蓉, 并且BFC具有普通容器所沒有的一些特性妹田。
通俗的說驶拱, 可以把BFC理解為一個封閉的大箱子, 箱子內的元素無論怎么折騰税迷, 都不會影響到外部元素哥牍。

1.觸發(fā)BFC
只要元素滿足下面任意一條件即可觸發(fā)BFC特性:

  • body 根元素
  • 浮動元素: float 除 none以外的值
  • 絕對定位: position(absolute/fixed)
  • display除了visible以外的值(hidden、auto、scroll)

2. BFC特性及應用

  • 同一個BFC下抠忘,外邊距會發(fā)生折疊
<section>
  <style>
    div {
      width: 100px;
      height: 100px;
      background: #f00;
      margin: 100px;
    }
  </style>
  <body>
  <div></div>
  <div></div>
  </body>
</section>

從效果上看囚灼, 因為兩個div元素都處于同一個BFC容器下(這里指的是body元素)所以第一個div的下邊距和第二個div的上邊距發(fā)生了重疊蝎抽, 因此兩個盒子之間距離只有100px养交,而不是200px。
這不是css的bug,我們可以理解為是一種規(guī)范, 如果想要避免外邊距重疊座每, 可以將其放在不同的BFC容器中。 如下:

<section>
  <style>
    .container{
      overflow: hidden;
    }
    p {
      width: 100px;
      height: 100px;
      background: #f00;
      margin: 100px;
    }
  </style>
  <div class="container">
    <p></p>
  </div>
  <div class="container">
    <p></p>
  </div>
</section>

這個時候孵运, 兩個盒子邊距就變成了200px

  • BFC可以包含浮動的元素(清除浮動)
    浮動的元素都會脫離普通文檔流:
<section>
  <style>
    .first {
      width: 100px;
      background: #f00;
      float: left;
    }
    .second {
      width: 200px;
      height: 200px;
      border: 1px #00f solid;
    }
  </style>
  <div class="first">
    我是第一個元素我是第一個元素我是第一個元素
  </div>
  <div class="second">
    我是第二個元素我是第二個元素我是第二個元素我是第二個元素我是第二個元素我是第二個元素
  </div>
</section>

這個時候第二個元素被第一個浮動元素所部分覆蓋,(文本信息不會被浮動元素覆蓋)如果想避免元素被覆蓋, 可觸發(fā)第一個元素的BFC特性俯萌, 在第二個元素中加入overflow: hidden; 就會變成如下效果:



這個方法可以用來實現(xiàn)兩列自適應布局

IFC

IFC棋恼, inline Formatting Contexts, 也就是 ”內聯(lián)格式化上下文“悦施。
符合以下任何一條件即會生成一個IFC

  • 塊級元素中僅包含內聯(lián)級別元素
    形成條件非常簡單, 需要注意的是當IFC中有塊級元素插入時, 會產生兩個匿名塊將父元素分割開來,產生兩個IFC鞋吉。

IFC布局規(guī)則:

  • 子元素水平方向橫向排列赊锚,并且垂直方向起點為元素頂部友多。
  • 子元素只會計算橫向樣式空間骗绕,(padding, border, margin), 垂直方向樣式空間不會被計算(padding, border, margin )。
  • 在垂直方向上, 子元素會以不同形式來對齊(vertical-align)棺亭。
  • 能把在一行上的框都完全包含進去的一個矩形區(qū)域岳守, 被稱為該行的行框(line box)。行框的寬度是由包含塊(containing box)和與其中的浮動來決定的。
  • IFC中的”line box“一般左右邊貼緊其包含塊, 但float元素會優(yōu)先排列。
  • IFC中的”line box“高度由css行高計算規(guī)則來確定, 同個IFC的多個line box高度可能會不同纪吮。
  • 當line-level boxes 的總寬度少于包含它們的line box時, 其水平渲染規(guī)則由 text-align屬性值來決定榔组。
  • 當一個”inline box“超過父元素的寬度時锨推, 它會被分割成多個boxes, 這些boxes分布在多個”line box“中。 如果子元素未設置強制換行的情況下慨削, ”inline box“將不可被分割, 將會溢出父元素。

相對于BFC, IFC的規(guī)則一大推, 很少會有人耐心看下去夺欲, 舉個例子大概明白其特性纸泄。
很多時候弓千,上下間距不生效可以使用IFC來解釋

<section>
  <style>
    .wrap {
      display: inline-block;
      border: 1px #f00 solid;
    }
    span {
      margin: 20px;
      background: #00f;
    }
  </style>
  <div class="wrap">
    <span>文本一</span>
    <span>文本二</span>
  </div>
</section>

上里可以看出鹊碍, span左右margin撐開器紧, 上下margin未撐開, 符合IFC規(guī)范:只計算橫向樣式空間士飒, 不計算縱向樣式空間。

多個元素水平居中

<section>
  <style>
    .wrap{
      border: 1px #f00 solid;
      width: 200px;
      text-align: center;
    }
    span{
      background: #00f;
    }
  </style>
  <div class="wrap">
    <span>文本一</span>
    <span>文本二</span>
  </div>
</section>

水平排列規(guī)則根據(jù)IFC容器的text-align值來排列,可以用來實現(xiàn)多個子元素的水平居中袱瓮。

float元素優(yōu)先排列

<section>
  <style>
    .wrap{
      border: 1px #f00 solid;
      width: 200px;
    }
    span{
      background: #00f;
    }
    .fl{
      float: left;
    }
  </style>
  <div class="wrap">
    <span>文本一</span>
    <span>文本二</span>
    <span class="fl">文本三</span>
  </div>
</section>

IFC中具備float屬性值的元素優(yōu)先排列瘫里, 在很多場景中用來在文章段落開頭添加”tag“可以用到拨脉。

利用IFC還可以做很多其他的事情箕昭,例如:解決元素垂直居中积暖、多個文本元素行高不一致排列的混亂

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末纫雁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羞海,更是在濱河造成了極大的恐慌简十,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件半沽,死亡現(xiàn)場離奇詭異怎燥,居然都是意外死亡,警方通過查閱死者的電腦和手機蜜暑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門铐姚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肛捍,你說我怎么就攤上這事隐绵。” “怎么了拙毫?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵依许,是天一觀的道長。 經常有香客問我恬偷,道長悍手,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任袍患,我火速辦了婚禮,結果婚禮上竣付,老公的妹妹穿的比我還像新娘诡延。我一直安慰自己,他們只是感情好古胆,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布肆良。 她就那樣靜靜地躺著,像睡著了一般逸绎。 火紅的嫁衣襯著肌膚如雪惹恃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天棺牧,我揣著相機與錄音巫糙,去河邊找鬼。 笑死颊乘,一個胖子當著我的面吹牛参淹,可吹牛的內容都是我干的醉锄。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼浙值,長吁一口氣:“原來是場噩夢啊……” “哼恳不!你這毒婦竟也來了?” 一聲冷哼從身側響起开呐,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤烟勋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后筐付,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體神妹,經...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年家妆,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸵荠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡伤极,死狀恐怖蛹找,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情哨坪,我是刑警寧澤庸疾,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站当编,受9級特大地震影響届慈,放射性物質發(fā)生泄漏。R本人自食惡果不足惜忿偷,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一苫亦、第九天 我趴在偏房一處隱蔽的房頂上張望地回。 院中可真熱鬧,春花似錦、人聲如沸厂财。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽令境。三九已至,卻和暖如春贮喧,著一層夾襖步出監(jiān)牢的瞬間筒狠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工箱沦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辩恼,地道東北人。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像运挫,于是被迫代替她去往敵國和親状共。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內容

  • 深入理解BFC與IFC 正常的流中就是如何把文檔中的元素呈現(xiàn)出來 谁帕,而布局呈現(xiàn)的規(guī)則就是BFC峡继、IFC和相對位移,...
    moyi_gg閱讀 4,971評論 2 1
  • 基本慨念 內容區(qū)域(content)是包含元素真實內容的區(qū)域。它通常包含背景肴捉、顏色或者圖片等腹侣,位于內容邊界的內部,...
    晴天的晴q閱讀 2,192評論 0 0
  • BFC是什么 BFC全稱是Block Formatting Context齿穗,即塊格式化上下文傲隶。它是CSS2.1規(guī)范...
    南場41號閱讀 356評論 0 1
  • BFC BFC(Block Formatting Contexts),塊級格式化上下文 盒模型 CSS盒模型描述了...
    杉虎閱讀 294評論 0 0
  • 一窃页、FC(Formatting Context) 他是頁面中的一塊渲染區(qū)域跺株,并且有一套渲染規(guī)則,他決定了他的子元素...
    李丹linda閱讀 974評論 0 3