什么是CSS hack
所謂css hack是指在css樣式中加上一些特殊的符號,讓不同的瀏覽器能夠識別不同的特殊符號,用來達到應用不同CSS樣式的目的。簡單來說,就是不同瀏覽器在解讀CSS時候,進行對網頁內容顯示差別的處理,由于各個瀏覽器的內核不相同,因此造成誤差難以避免。
瀏覽器兼容的思路
對于瀏覽器兼容的思路,首先考慮的是,要不要做?從兩個方面進行考慮,一個是產品的角度進行考慮,對于一個產品,要考慮其受眾,受眾的瀏覽器比例,是功能優先還是效果優先;
其次考慮的是要做到什么程度,讓哪些瀏覽器支持,要實現什么效果。
再者考慮的是如何做?從中要根據技術的需求選擇技術框架/庫(jquery),其中框架如下
Bootstrap (>=ie8)
jQuery 1.~ (>=ie6), jQuery 2.~ (>=ie9)
Vue (>= ie9)
根據兼容需求選擇兼容工具。然后對條件注釋,css hack,js的能力檢測做一些修補。
對于瀏覽器兼容還包括平穩退化和漸進增強。
平穩退化是指一開始就構建完整的功能,然后再針對低版本瀏覽器進行兼容。
漸進增強是指針對低版本瀏覽器進行構建頁面,保證最基本的功能,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
列舉五種以上瀏覽器兼容的寫法
- 條件注釋
<!--[if IE 7]><link rel="stylesheet" href="ie7.css" type="text/css"/><![endif]-->
- css hack 方法,這個方法又具體細分為3個方法 分別為
屬性前綴法:ie6能識別下劃線"_"和" ",ie7能識別" ",但是不能識別下劃線。IE6~IE10都認識"\9",但firefox前述三個都不能識別。
常見的屬性兼容情況:
inline-blcok:>=ie8
min-width:>=ie8
:before:after:>=ie8
div:hover>=ie8,
background-size: >=ie9
圓角:>=ie9
陰影:>=ie9
動畫漸變:>=ie10
選擇器前綴法
IE條件注釋法結合選擇器整體優化
- 利用兼容開發工具,例如Modernizr:運行的時候它會在html元素上添加一批css的class名稱,這些class名稱標記當前瀏覽器支持哪些特性和不支持哪些特性,支持的特性就直接顯示該特性的名稱作為一個class,不支持的特性的class是no-特性名稱。我們就可以直接使用modenizr在元素里生成的class的名稱,在css文件里定義相應的屬性以便支持當前的瀏覽器。
以下名詞意義以及作用
- 條件注釋:條件注釋是一種安全區分IE瀏覽器版本的語法,且被認為是取代 IE css hack,條件注釋 (conditional comment) 是于HTML源碼中被IE有條件解釋的語句。條件注釋可被用來向IE提供及隱藏代碼。
- IE hack: 針對IE瀏覽器編寫不同的CSS的讓IE能夠正常渲染的過程。
- js 檢測能力:瀏覽器的能力檢測目標不是檢測特定的瀏覽器,而是檢測瀏覽器的能力。這樣,只需要檢測瀏覽器是否支持特定的能力,就可以給出特定的解決方案。這一部分檢測是解決瀏覽器兼容問題的主要檢測。
- html5shiv.js:用于解決IE9以下版本瀏覽器對HTML5新增標簽不識別,并導致CSS不起作用的問題。
- respond.js:在做響應式網頁的時候一些瀏覽器器不支持媒體查詢等css3新特性,使用respond.js來兼容。
- css reset:重置瀏覽器的默認樣式,也就是重新定義標簽的樣式。
- normalize css:不像css reset一樣重置所有樣式,而是保留有用的樣式。而且標準化的樣式適用于更廣的元素。
- Modernizr:Modernizr幫助我們檢測瀏覽器是否實現了某個feature,如果實現了那么開發人員就可以充分利用這個feature做一些工作,反之沒有實現開發人員也好提供一個fallback。所以,我們要明白的是Modernizr只是幫我們檢測feature是否被支持,它并不能夠給瀏覽器添加那些本來不支持的feature。
- postCSS:它可以被理解為一個平臺,可以讓一些插件在上面跑,它提供了一個解析器,可以將CSS解析成抽象語法樹,通過PostCSS這個平臺,我們能夠開發一些插件,來處理CSS。熱門插件如autoprefixer,它可以幫我們處理兼容問題,只需正常寫CSS,autoprefixer可以幫我的自動生成兼容性代碼