BFC是什么?
第一次看到這個(gè)名詞,我是拒絕的,css什么時(shí)候還有這個(gè)東西?于是迫不及待的google了一下,才發(fā)現(xiàn)原來(lái)它無(wú)時(shí)無(wú)刻不在我們的css當(dāng)中,只不過(guò)它并不是一個(gè)屬性,不需要我們平常使用手寫罷了。但是它的重要性確是杠杠的,可以這么說(shuō),沒(méi)有它就就沒(méi)有什么css布局 BFC,全稱 Block Formatting Context,翻譯成塊級(jí)格式化上下文,它就是一個(gè)環(huán)境,HTML元素在這個(gè)環(huán)境中按照一定規(guī)則進(jìn)行布局。一個(gè)環(huán)境中的元素不會(huì)影響到其它環(huán)境中的布局。
看一大堆文字可能有點(diǎn)抽象,現(xiàn)在拿個(gè)js函數(shù)來(lái)比喻說(shuō)明一下吧,我們現(xiàn)在有一個(gè)叫做bfc的函數(shù),而一個(gè)函數(shù)就是一個(gè)塊級(jí)作用域,這里面所有的變量申明、運(yùn)行都在這個(gè)塊級(jí)作用域內(nèi)進(jìn)行。理所當(dāng)然,一個(gè)環(huán)境中的變量不會(huì)影響到其它環(huán)境變量。
CSS Code復(fù)制內(nèi)容到剪貼板
var box =1;
function bfc(){
var box = "2";
console.log(box);
}
bfc();//2
console.log(box)//1
所以,我們是不是可以這樣理解:所謂的BFC就是css屬性的執(zhí)行域?
BFC的生成
既然js可以通過(guò)函數(shù)等方法來(lái)實(shí)現(xiàn)塊級(jí)作用域,我想那css肯定也是可以通過(guò)一些手段來(lái)實(shí)現(xiàn)BFC的。
這里BFC的官方文檔寫到:
Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with ‘overflow’ other than ‘visible’ (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.
從這段描述可以清楚知道,以下方法可以創(chuàng)建一個(gè)新的塊級(jí)執(zhí)行上下文(BFC):
1.浮動(dòng)元素、
2.絕對(duì)定位元素,
3.塊級(jí)元素以及塊級(jí)容器(比如inline-block、table-cell、table-capation)
4.overflow值不為visible的塊級(jí)盒子
當(dāng)然,root元素會(huì)自動(dòng)生成一個(gè)BFC,這個(gè)應(yīng)該很好理解,畢竟需要一個(gè)根BFC來(lái)布局
執(zhí)行規(guī)則
既然存在了執(zhí)行環(huán)境,那肯定會(huì)存在執(zhí)行規(guī)則。BFC的
1.在一個(gè)塊級(jí)排版上下文中,盒子是從包含塊頂部開(kāi)始,垂直的一個(gè)接一個(gè)的排列的。每個(gè)盒子的左外邊是觸碰到包含塊的左邊的(對(duì)于從右向左的排版,則相反)
這個(gè)應(yīng)該不難理解。就是我們?nèi)绻诶飳憥讉€(gè)<div>,它會(huì)依次垂直排列,并且都是在頁(yè)面的最左邊(對(duì)于從右向左的排版,則相反)。
2.相鄰兩個(gè)盒子之間的垂直的間距是被margin屬性所決定的,在一個(gè)塊級(jí)排版上下文中相鄰的兩個(gè)塊級(jí)盒之間的垂直margin是折疊的。
新聞熱點(diǎn)
疑難解答
圖片精選