BFC與外邊距合并烦周、瀏覽器兼容問題

BFC(Block Formatting Contex)即塊級格式化上下文。當涉及到可視化布局的時候,BFC提供了一個環(huán)境穆律,元素在這個環(huán)境中按照一定規(guī)則進行布局。一個環(huán)境中的元素不會影響到其它環(huán)境中的布局导俘。

浮動元素峦耘,絕對定位元素,非塊級盒子的塊級容器(例如inline-blocks趟畏,table-cells贡歧,and table-captions),以及overflow屬性值不是“ visible”(visible是overflow的默認值)的塊級盒子(視口除外)赋秀,這些元素就會為他們的內容創(chuàng)建一個BFC利朵。即float為 left/right,overflow為 hidden/auto/scroll猎莲,display為 table-cell/table-caption/inline-block绍弟,position為 absolute/fixed。

作用:

1.解決margin疊加問題

  • 只有同屬于一個BFC時著洼,兩個元素才有可能發(fā)生垂直Margin的重疊樟遣,這個包括相鄰元素,嵌套元素身笤,只要他們之間沒有阻擋(例如邊框豹悬,非空內容,padding等)就會發(fā)生margin重疊液荸,這時生成新的BFC讓元素在不同的BFC中就能解決疊加問題瞻佛。
    例如:解決垂直方向上兄弟元素的margin重疊,如果相鄰兄弟元素不屬于同一個BFC娇钱,就不會發(fā)生margin重疊了伤柄;

2.清除浮動。

  • BFC可以包含浮動元素文搂,讓父元素生成新的BFC就可以包圍浮動元素适刀。這樣就可以解決因子元素浮動而導致的父元素坍塌的問題。

3.創(chuàng)建自適應布局煤蹭。

  • BFC不會重疊浮動元素笔喉。利用該特性可以作為多欄布局的一種實現方式取视。

02 在什么場景下會出現外邊距合并?如何合并然遏?如何不讓相鄰元素外邊距合并贫途?給個父子外邊距合并的范例

1.在什么場景下會出現外邊距合并?

  • 同一文檔流中的兩個相鄰塊級元素待侵,會出現外邊距合并丢早。
  • 上下兩個塊級元素
  • 父子元素的外邊距合并
  • 空元素外邊距會合并

2.如何合并?

  • 元素自身疊加秧倾,當元素沒有內容(即空元素)怨酝、內邊距、邊框時那先, 它的上下邊距就相遇了农猬, 即會產生疊加(垂直方向)。 當為元素添加內容售淡、 內邊距斤葱、 邊框任何一項, 就會取消合并揖闸。
  • 相鄰元素疊加 相鄰的兩個元素揍堕, 如果它們的上下邊距相遇,即會產生合并汤纸。
  • 包含(父子)元素疊加 包含元素的外邊距隔著 父元素的內邊距和邊框衩茸, 當這兩項都不存在的時候, 父子元素垂直外邊距相鄰贮泞,產生疊加楞慈。添加任何一項即會取消合并。
  • 兩個元素之間margin發(fā)生合并啃擦,兩者距離以較大的
    (絕對值)值為準囊蓝。(考慮到margin為負數時以絕對值大的為準)

3.如何不讓相鄰元素外邊距合并?

03 什么是CSS hack? 在哪個網站查看標簽(屬性)的瀏覽器兼容情況。

不同廠商的瀏覽器或者同一個廠商的瀏覽器的不同版本言询,對CSS的解析認識會有差異,這就會導致頁面產生不一樣的效果傲宜。
所以我們需要針對不一樣的瀏覽器編寫不同的CSS代碼运杭,來實現相同的頁面效果,這個過程就叫做CSS hack函卒。

  • caniuse.com
  • CSS hack

04 如下屬性辆憔,兼容哪些瀏覽器?

inline-block:
min-width/min-height
:before,:afte:
div:hover
inline-block
background-size
圓角
陰影
動畫/漸變
inline-block: >=ie8
min-width/min-height: >=ie7
:before,:after: >=ie8
div:hover: >=ie7
inline-block: >=ie8
background-size: >=ie9
圓角: >= ie9
陰影: >= ie9
動畫/漸變: >= ie10

05 漸進增強和優(yōu)雅降級分別是什么意思?

  • 漸進增強(progressive enhancement):

針對低版本瀏覽器進行構建頁面虱咧,保證最基本的功能熊榛,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗

  • 優(yōu)雅降級 (graceful degradation):

一開始就構建完整的功能腕巡,然后再針對低版本瀏覽器進行兼容玄坦。

06 以下工具/名詞是做什么的?

條件注釋
IE Hack
js 能力檢測
html5shiv.js
respond.js
css reset
normalize.css
Modernizr
postCSS
條件注釋
這是基于HTML源碼中被IE(IE<=9)有條件解釋的語句绘沉。條件注釋可被用來向IE提供及隱藏代碼煎楣。

IE Hack
針對IE瀏覽器編寫不同的CSS(屬性前綴法、選擇器前綴法车伞、IE條件注釋法)使得頁面效果在不同版本的IE瀏覽器中達到效果一致择懂。

js 能力檢測
使用JS來檢測瀏覽器擁有的能力而不是來區(qū)分是什么瀏覽器。這樣如果瀏覽器擁有某種能力則提供一種方案另玖,沒有某種能力則提供另一種方案困曙。

html5shiv.js
針對不支持HTML5標簽的瀏覽器,創(chuàng)建并模擬HTML5的標簽的效果并使相應的CSS生效谦去。

respond.js
為不支持CSS3媒體查詢的瀏覽器(IE6-8)模擬CSS3的媒體查詢慷丽。

css reset
清除瀏覽器默認的元素樣式。

normalize.css
保護有用的瀏覽器默認樣式哪轿;一般化的樣式盈魁,修復瀏覽器自身的bug并保證各瀏覽器的一致性;優(yōu)化CSS可用性窃诉。

Modernizr
是一個JS類庫杨耙,用來檢測瀏覽器的CSS3和HTML5能力,從而解決瀏覽器的兼容問題飘痛。

postCSS
它可以被理解為一個平臺珊膜,可以讓一些插件在上面跑,它提供了一個解析器宣脉,可以將CSS解析成抽象語法樹车柠,通過PostCSS這個平臺,我們能夠開發(fā)一些插件塑猖,來處理CSS竹祷。熱門插件如autoprefixer,它可以幫我們處理兼容問題羊苟,只需正常寫CSS塑陵,autoprefixer可以幫我的自動生成兼容性代碼

07 盡可能多的列舉瀏覽器兼容的處理范例

- 條件注釋
條件注釋 (conditional comment) 是于HTML源碼中被IE有條件解釋的語句。條件注釋可被用來向IE提供及隱藏代碼蜡励。

<!--[if IE 6]>
<p>You are using Internet Explorer 6.</p>
<![endif]-->
<!--[if !IE]><!-->
<script>alert(1);</script>
<!--<![endif]-->
<!--[if IE 8]>
<link href="ie8only.css" rel="stylesheet">
<![endif]-->
使用了條件注釋的頁面在 Windows Internet Explorer 9 中可正常工作令花,但在 Internet Explorer 10 中無法正常工作阻桅。

- 屬性前綴法
.box{
color: red;
_color: blue; /ie6/
color: pink; /ie67/
color: yellow\9; /ie/edge 6-8*/
}

- 選擇器前綴法
html 前綴只對IE6生效
+html +前綴只對IE7生效
@media screen\9{...}只對IE6/7生效
@media \0screen {body { background: red; }}只對IE8有效
@media \0screen\,screen\9{body { background: blue; }}只對IE6/7/8有效
@media screen\0 {body { background: green; }} 只對IE8/9/10有效
@media screen and (min-width:0\0) {body { background: gray; }} 只對IE9/10有效
@media screen and (-ms-high-contrast: active),
(-ms-high-contrast: none) {body { background: orange; }} 只對IE10有效等等

- 條件注釋結合類選擇器整體優(yōu)化

<!DOCTYPE html>
<!--[if IEMobile 7 ]> <html dir="ltr" lang="en-US"class="no-js iem7"> <![endif]-->
<!--[if lt IE 7 ]> <html dir="ltr" lang="en-US" class="no-js ie6 oldie"> <![endif]-->
<!--[if IE 7 ]> <html dir="ltr" lang="en-US" class="no-js ie7 oldie"> <![endif]-->
<!--[if IE 8 ]> <html dir="ltr" lang="en-US" class="no-js ie8 oldie"> <![endif]-->
<!--[if (gte IE 9)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html dir="ltr" lang="en-US" class="no-js"><!--<![endif]--

- 利用Modernizr工具
運行的時候它會在html元素上添加一批CSS的class名稱,這些class名稱標記當前瀏覽器支持哪些特性和不支持哪些特性兼都,支持的特性就直接顯示該天特性的名稱作為一個class(例:canvas,websockets)嫂沉,不支持的特性顯示的class是“no-特性名稱”。以下是IE9下生成的特征類型扮碧。

<html class=" js no-flexbox canvas canvastext no-webgl no-touch geolocation postmessage no-websqldatabase no-indexeddb hashchange no-history draganddrop no-websockets rgba hsla multiplebgs backgroundsize no-borderimage borderradius boxshadow no-textshadow opacity no-cssanimations no-csscolumns no-cssgradients no-cssreflections csstransforms no-csstransforms3d no-csstransitions fontface generatedcontent video audio localstorage sessionstorage no-webworkers no-applicationcache svg inlinesvg smil svgclippaths">

可以直接使用Modernizr在元素里生成的class名稱趟章,在你的css文件里定義相應的屬性以便支持當前瀏覽器。例如芬萍,下面的代碼可以屬性尤揣,在支持shadow陰影的瀏覽器顯示shadow,不支持的瀏覽器顯示標準的邊框:

.boxshadow #MyContainer {
border: none;
-webkit-box-shadow: #666 1px 1px 1px;
-moz-box-shadow: #666 1px 1px 1px;
}
.no-boxshadow #MyContainer {
border: 2px solid black;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末柬祠,一起剝皮案震驚了整個濱河市北戏,隨后出現的幾起案子,更是在濱河造成了極大的恐慌漫蛔,老刑警劉巖嗜愈,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異莽龟,居然都是意外死亡蠕嫁,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門毯盈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剃毒,“玉大人,你說我怎么就攤上這事搂赋∽阜В” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵脑奠,是天一觀的道長基公。 經常有香客問我,道長宋欺,這世上最難降的妖魔是什么轰豆? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮齿诞,結果婚禮上酸休,老公的妹妹穿的比我還像新娘。我一直安慰自己祷杈,他們只是感情好斑司,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吠式,像睡著了一般陡厘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上特占,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天糙置,我揣著相機與錄音,去河邊找鬼是目。 笑死谤饭,一個胖子當著我的面吹牛,可吹牛的內容都是我干的懊纳。 我是一名探鬼主播揉抵,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗤疯!你這毒婦竟也來了冤今?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤茂缚,失蹤者是張志新(化名)和其女友劉穎戏罢,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體脚囊,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡龟糕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了悔耘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讲岁。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衬以,靈堂內的尸體忽然破棺而出缓艳,到底是詐尸還是另有隱情,我是刑警寧澤泄鹏,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布郎任,位于F島的核電站,受9級特大地震影響备籽,放射性物質發(fā)生泄漏舶治。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一车猬、第九天 我趴在偏房一處隱蔽的房頂上張望霉猛。 院中可真熱鬧,春花似錦珠闰、人聲如沸惜浅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坛悉。三九已至伐厌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裸影,已是汗流浹背挣轨。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轩猩,地道東北人卷扮。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像均践,于是被迫代替她去往敵國和親晤锹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354