成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

理解 CSS 布局和 BFC

miya / 2050人閱讀

摘要:布局中有一些概念,一旦你理解了它們,就能真正提高你的布局能力。我們通常有兩種方法來解決這個布局問題。是布局中的一個迷你布局你可以將看作是頁面內(nèi)的一個迷你布局。理解瀏覽器如何布置網(wǎng)頁是非?;A(chǔ)的。

CSS布局中有一些概念,一旦你理解了它們,就能真正提高你的 CSS 布局能力。本文是關(guān)于塊格式化上下文(BFC)的。你可能從未聽說過這個術(shù)語,但是如果你曾經(jīng)用CSS做過布局,你可能知道它是什么,理解什么是 BFC,怎么工作以及如何創(chuàng)建 BFC 非常有用,這些可以幫助你理解CSS中的布局是如何工作的。

在本文中,通過熟悉的示例來解釋什么是 BFC。然后說明 display 的一個新值,只有當(dāng)你理解了什么是 BFC 以及為什么需要它時,它才有意義。

想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!

什么是 BFC

在一個Web頁面的CSS渲染中,塊級格式化上下文 (Block Fromatting Context)是按照塊級盒子布局的。W3C對BFC的定義如下:

浮動元素和絕對定位元素,非塊級盒子的塊級容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不為“visiable”的塊級盒子,都會為他們的內(nèi)容創(chuàng)建新的BFC(塊級格式上下文)。

BFC是一個獨立的布局環(huán)境,其中的元素布局是不受外界的影響,并且在一個 BFC 中,塊盒與行盒(行盒由一行中所有的內(nèi)聯(lián)元素所組成)都會垂直的沿著其父元素的邊框排列。

塊格式化上下文(BFC)的行為通過一個簡單的float示例很容易理解。在下面的示例中,我有一個框,其中包含向左浮動的圖像和一些文本。如果我們有足夠多的文本,它會環(huán)繞浮動的圖像和邊框,然后環(huán)繞整個區(qū)域。

// html
I am a floated element.
I am text inside the outer box.
// css .outer { border: 5px dotted rgb(214,129,137); border-radius: 5px; width: 450px; padding: 10px; margin-bottom: 40px; } .float { padding: 10px; border: 5px solid rgba(214,129,137,.4); border-radius: 5px; background-color: rgba(233,78,119,.4); color: #fff; float: left; width: 200px; margin: 0 20px 0 0; }

如果我刪除了一些文本,那么就沒有足夠的內(nèi)容來包圍圖像,而且由于浮動被從文檔流中脫離,所以邊框會上升,并在圖像下方,直到文本的高度。

這是因為當(dāng)我們浮動一個元素時,文本所在的框的寬度保持不變,為給浮動元素騰出空間而縮短的是文本的行框。這就是為什么背景和邊框會出現(xiàn)在浮動后面的原因。

我們通常有兩種方法來解決這個布局問題。一種方法是使用 clearfix hack,它的作用是在文本和圖像下面插入一個元素,并將其設(shè)置為 clear:both。另一種方法是使用 overflow 屬性,其值不是缺省值 visible。

.outer {
  overflow: auto;
}

查看演示

overflow 以這種方式工作的原因是,使用 visible 的初值以外的任何值都會創(chuàng)建一個塊格式化上下文,而 BFC 的一個特性是它包含浮動。

BFC 是布局中的一個迷你布局

你可以將 BFC 看作是頁面內(nèi)的一個迷你布局。一旦一個元素創(chuàng)建了一個 BFC,它就包含了所有的內(nèi)容。正如我們所看到的,這包括浮動的元素,它們不再從盒子底部伸出來。BFC 還會導(dǎo)致一些其他有用的行為。

BFC 可以防止 margin 折疊

了解邊距合并是另一個被低估的 CSS 技能。在下一個示例中,假設(shè)有一個背景顏色為灰色的 div。

這個 div 包含兩個標(biāo)簽 p。外部 div 元素的 margin-bottom 為 40 像素,標(biāo)簽 p 的頂部和底部 margin 都是 20 像素。

// html

I am paragraph one and I have a margin top and bottom of 20px;

I am paragraph one and I have a margin top and bottom of 20px;

// css .outer { background-color: #ccc; margin: 0 0 40px 0; } p { padding: 0; margin: 20px 0 20px 0; background-color: rgb(233,78,119); color: #fff; }

因為 p 元素的 margin 和外部 div 上的 margin 之間沒有任何東西,所以兩個會折疊,因此 p 最終與 div 的頂部和底部齊平。 我們在 p 的上方和下方看不到任何灰色。

在CSS當(dāng)中,相鄰的兩個盒子(可能是兄弟關(guān)系也可能是祖先關(guān)系)的外邊距可以結(jié)合成一個多帶帶的外邊距。這種合并外邊距的方式被稱為折疊,并且因而所結(jié)合成的外邊距稱為折疊外邊距。折疊的結(jié)果按照如下規(guī)則計算:

兩個相鄰的外邊距都是正數(shù)時,折疊結(jié)果是它們兩者之間較大的值。

兩個相鄰的外邊距都是負數(shù)時,折疊結(jié)果是兩者絕對值的較大值。

兩個外邊距一正一負時,折疊結(jié)果是兩者的相加的和。

產(chǎn)生折疊的必備條件:margin必須是鄰接的!

如果我們把盒子設(shè)為 BFC,它現(xiàn)在包含了標(biāo)簽 p 和它們的邊距,這樣它們就不會折疊,我們可以看到邊距后面容器的灰色背景。

.outer {
  background-color: #ccc;
  margin: 0 0 40px 0;
  overflow: auto;
}

查看演示

再一次,BFC 的工作是把東西裝在盒子里,防止它們從盒子里跑出來。

BFC 可以阻止元素被浮動元素覆蓋

你將熟悉 BFC 的這種行為,因為使用浮動的任何列類型布局都是這樣工作的。如果一個項目創(chuàng)建了一個 BFC,那么該項目將不會包裹任何浮動元素。在下面的例子中,有如下 html 結(jié)構(gòu):

I am a floated element.
I am text

帶有 float 類的項被向左浮動,因此 div 中的文本在它環(huán)繞 float 之后。

我可以通過將包裹文本的 div 設(shè)置為 BFC 來防止這種包裹行為。

.text {
  overflow: auto;
}

這實際上是我們創(chuàng)建具有多個列的浮動布局的方法。浮動項還為該項創(chuàng)建了一個 BFC,因此,如果右邊的列比左邊的列高,那么我們的列就不會相互環(huán)繞。

查看演示

在多列布局中使用 BFC

如果我們創(chuàng)建一個占滿整個容器寬度的多列布局,在某些瀏覽器中最后一列有時候會掉到下一行。這可能是因為瀏覽器四舍五入了列寬從而所有列的總寬度會超出容器。但如果我們在多列布局中的最后一列里創(chuàng)建一個新的BFC,它將總是占據(jù)其他列先占位完畢后剩下的空間。

例如:

column 1
column 2
column 3

對應(yīng)的CSS:

.column {
    width: 31.33%;
    background-color: green;
    float: left;
    margin: 0 1%;
}
.column:last-child {
  float: none;
}

未創(chuàng)建 BFC 之前:

添加以下樣式創(chuàng)建一個 BFC:

.column:last-child {
  float: none;
  overflow: hidden; 
}

現(xiàn)在盡管盒子的寬度稍有改變,但布局不會打破。當(dāng)然,對多列布局來說這不一定是個好辦法,但能避免最后一列下掉。這個問題上彈性盒或許是個更好的解決方案,但這個辦法可以用來說明元素在這些環(huán)境下的行為。

還有什么能創(chuàng)建 BFC?

除了使用 overflow 創(chuàng)建 BFC 外,其他一些 CSS 屬性還創(chuàng)建 BFC。正如我們所看到的,浮動元素創(chuàng)建了 BFC。你的浮動項將包含它里面的任何東西。

使用以下方式都能創(chuàng)建 BFC

float 的值不是 none。

position 的值不是 static 或者 relative。

display 的值是 inline-block、table-cell、flex、table-caption 或者inline-flex

overflow 的值不是 visible

創(chuàng)建 BFC 的新方式

使用overflow或其他的方法創(chuàng)建BFC時會有兩個問題。首先,這些方法本身是有自身的設(shè)計目的,所以在使用它們創(chuàng)建BFC時可能會產(chǎn)生副作用。例如,使用overflow創(chuàng)建BFC后在某些情況下可能會看到出現(xiàn)一個滾動條或者元素內(nèi)容被裁切。

這是由于overflow屬性的設(shè)計是用來讓你告訴瀏覽器如何定義元素的溢出狀態(tài)的。瀏覽器執(zhí)行了它最基本的定義。

即使在沒有任何不想要的副作用的情況下,使用 overflow 也可能會讓其他開發(fā)人員感到困惑。為什么 overflow 設(shè)置為 autoscroll?最初的開發(fā)者的意圖是什么?他們想要這個組件上的滾動條嗎?

最安全的做法應(yīng)該是創(chuàng)建一個 BFC 時并不會帶來任何副作用,它內(nèi)部的元素都安全的呆在這個迷你布局中,這種方法不會引起任何意想不到的問題,也可以理解開發(fā)者的意圖。CSS 工作組也十分認同這種想法,所以他們定制了一個新的屬性值:display:flow-root。

flow-root 瀏覽器支持情況

你可以使用display:flow-root安全的創(chuàng)建BFC,來解決上文中提到的各種問題:包裹浮動元素、阻止外邊距疊加和阻止圍繞浮動元素。

瀏覽器對該屬性的支持目前還是有限的,如果你覺得這個屬性值很方便,請投票去讓Edge也支持它。不過無論如何,你現(xiàn)在應(yīng)該已經(jīng)理解了什么是 BFC,以及如何使用 overflow 或其他方法來包裹浮動,以及知道了 BFC 可以阻止元素去環(huán)繞浮動元素,如果你想使用彈性或網(wǎng)格布局可以在一些不支持他們的瀏覽器中使用 BFC 的這些特性做降級處理。

理解瀏覽器如何布置網(wǎng)頁是非?;A(chǔ)的。 雖然有時看起來無關(guān)緊要,但是這些小知識可以加快創(chuàng)建和調(diào)試 CSS 布局所需的時間。

你的點贊是我持續(xù)分享好東西的動力,歡迎點贊!

交流

干貨系列文章匯總?cè)缦?,覺得不錯點個Star,歡迎 加群 互相學(xué)習(xí)。

https://github.com/qq44924588...

我是小智,公眾號「大遷世界」作者,對前端技術(shù)保持學(xué)習(xí)愛好者。我會經(jīng)常分享自己所學(xué)所看的干貨,在進階的路上,共勉!

關(guān)注公眾號,后臺回復(fù)福利,即可看到福利,你懂的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/116019.html

相關(guān)文章

  • 深入理解cssBFC

    摘要:屬性,會破壞文檔流,與非定位元素很難結(jié)合起來用,因此也不適合自適應(yīng)布局。,其對無感,無法自適應(yīng)剩余瀏覽器空間??偨Y(jié)的定義,就如同結(jié)界一樣,完全封閉對外無任何影響。引起的各種屬性與自適應(yīng)布局自適應(yīng)布局與屬性說明 BFC的定義 BFC的全稱是block formatting context(塊狀格式化上下文),當(dāng)BFC起作用的時候,其元素內(nèi)部無論怎么翻江倒海都不會影響到外部元素,同樣,外部...

    姘擱『 評論0 收藏0
  • 關(guān)于CSSBFC特性的理解應(yīng)用

    摘要:它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。而,塊級格式化上下文,就是一個塊級元素的渲染顯示規(guī)則。定位和清除浮動的樣式規(guī)則只適用于處于同一塊格式化上下文內(nèi)的元素。 什么是BFC(Block Formatting Context) Formatting context(格式化上下文) 是 W3C CSS2.1 規(guī)范中的一個概念...

    shixinzhang 評論0 收藏0
  • 關(guān)于CSSBFC特性的理解應(yīng)用

    摘要:它是頁面中的一塊渲染區(qū)域,并且有一套渲染規(guī)則,它決定了其子元素將如何定位,以及和其他元素的關(guān)系和相互作用。而,塊級格式化上下文,就是一個塊級元素的渲染顯示規(guī)則。定位和清除浮動的樣式規(guī)則只適用于處于同一塊格式化上下文內(nèi)的元素。 什么是BFC(Block Formatting Context) Formatting context(格式化上下文) 是 W3C CSS2.1 規(guī)范中的一個概念...

    vspiders 評論0 收藏0
  • CSS中重要的BFC

    摘要:中有個重要的概念,搞懂可以讓我們理解中某些原本詭異的地方。簡介在解釋之前,先說一下文檔流。我們常說的文檔流其實分為定位流浮動流普通流三種。使用包含浮動元素注意,這里觸發(fā)并不能阻止其它形式的脫離文檔流的元素覆蓋正常流元素。 CSS中有個重要的概念BFC,搞懂BFC可以讓我們理解CSS中某些原本詭異(??)的地方。 1. 簡介 在解釋BFC之前,先說一下文檔流。我們常說的文檔流其實分為定位...

    plus2047 評論0 收藏0
  • CSS布局相關(guān)基本概念

    摘要:當(dāng)一個元素從正常文檔流中抽出后,仍然在文檔流中的其他元素將忽略該元素并填補他原先的空間基于文檔流,理解定位模式相對定位,即相對于元素在文檔流中位置進行偏移。絕對定位,即完全脫離文檔流,相對于屬性非值的最近父級元素進行偏移。 主要參考文檔:http://www.zhangxinxu.com/wor...https://www.cnblogs.com/dojo-... 測試例子:https...

    wangxinarhat 評論0 收藏0

發(fā)表評論

0條評論

miya

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<