CSS中的層疊上下文和BFC是兩個很虛但極其重要的概念,影響到網頁佈局的方方面面。有幾篇博文講得很詳細,這裏稍加摘錄,便於記憶。css
張鑫旭在深刻理解CSS中的層疊上下文和層疊順序裏有深刻的講解:html
能夠建立層疊上下文的規則:web
z-index
值不爲auto
的flex項(父元素display:flex|inline-flex
)opacity
值不是1
transform
值不是none
mix-blend-mode
值不是normal
filter
值不是none
isolation
值是isolate
will-change
指定的屬性值爲上面任意一個-webkit-overflow-scrolling
設爲touch
須要注意的是:ide
z-index:auto
,可當作z:index:0
級別;z-index
值決定。夢想天空在BFC 神奇背後的原理裏解析得很到位:wordpress
BFC直譯爲"塊級格式化上下文"。它是一個獨立的渲染區域,只有Block-level box參與, 它規定了內部的Block-level Box如何佈局,而且與這個區域外部絕不相干。佈局
BFC佈局規則:flex
哪些元素會生成BFC?code
float
屬性不爲none
position
爲absolute
或fixed
display
爲inline-block
, table-cell
, table-caption
, flex
, inline-flex
其中的一項overflow
爲auto
,scroll
或hidden
張鑫旭在博文CSS深刻理解流體特性和BFC特性下多欄自適應佈局裏面生動的講解了流媒體佈局、自適應佈局,推薦進一步閱讀。orm
推薦Micro Clearfix by Nicolas Gallagherhtm
.container::before, .container::after { content:""; display:table; } .container::after { clear:both; } .container { zoom:1; /* For IE 6/7 (trigger hasLayout) */ }
注意,這裏display屬性block
和table
均有使用,區別是table
會阻止(子元素與兄弟元素的)margins重疊,也就是建立了BFC,所以不可輕易互換。
例如對於此HTML結構:
<div class="box clearfix"></div> <div class="clearfix"> <div class="box"></div> </div>
若是爲block
,兩個box之間的間距是100px
;若是爲table
,則是200px
。
但若是這麼寫,兩種狀況下都是100px
:
<div class="box clearfix"></div> <div class="box clearfix"></div>
更多內容參考這裏的討論:http://stackoverflow.com/questions/211383/what-methods-of-clearfix-can-i-use