【瀏覽器CSS hack大全】
什麼是CSS hack?
由於不同廠商的流覽器或某瀏覽器的不同版本(如IE,Firefox/Safari/Opera/Chrome等),對CSS的支援、解析不一樣,導致在不同瀏覽器的環境中呈現出不一致的頁面展現效果。這時,我們為了獲得統一的頁面效果,就需要針對不同的瀏覽器或不同版本寫特定的CSS樣式,我們把這個針對不同的瀏覽器/不同版本寫相應的CSS code的過程,叫做CSS hack!
簡單的說:hack是針對不同的瀏覽器去寫不同的CSS樣式,從而讓各瀏覽器能達到一致的渲染效果。
CSS hack書寫順序
一般是將適用範圍廣、被識別能力強的CSS定義在前面。
CSS hack分類
CSS Hack大致有3種表現形式:
1、CSS屬性字首法;
2、選擇器字首法;
3、IE條件註釋法(即HTML頭部引用if IE)Hack;
實際專案中CSS Hack大部分是針對IE瀏覽器不同版本之間的表現差異而引入的。
屬性字首法(即類內部Hack):例如 IE6能識別下劃線"_"和星號" * ",IE7能識別星號" * ",但不能識別下劃線"_",IE6~IE10都認識"\9",但firefox前述三個都不能認識。
選擇器字首法(即選擇器Hack):例如 IE6能識別*html .class{},IE7能識別*+html .class{}或者*:first-child+html .class{}。
IE條件註釋法(即HTML條件註釋Hack):針對所有IE(注:IE10+已經不再支援條件註釋): ,針對IE6及以下版本: 。這類Hack不僅對CSS生效,對寫在判斷語句裡面的所有程式碼都會生效。
CSS hack方式一:條件註釋法
這種方式是IE瀏覽器專有的Hack方式,微軟官方推薦使用的hack方式。
舉例如下:
只在IE下生效
<!--[if IE]>
這段文字只在IE瀏覽器顯示
<![endif]-->
只在IE6下生效
<!--[if IE 6]>
這段文字只在IE6瀏覽器顯示
<![endif]-->
只在IE6以上版本生效
<!--[if gte IE 6]>
這段文字只在IE6以上(包括)版本IE瀏覽器顯示
<![endif]-->
只在IE8上不生效
<!--[if ! IE 8]>
這段文字在非IE8瀏覽器顯示
<![endif]-->
非IE瀏覽器生效
<!--[if ! IE]>
這段文字只在非IE瀏覽器顯示
<![endif]-->
CSS hack方式二:類內屬性字首法
屬性字首法是在CSS樣式屬性名前加上一些只有特定瀏覽器才能識別的hack字首,以達到預期的頁面展現效果。
IE hack 技術
_width: 400px; /* _是針對IE6*/
+width: 300px; /* +是針對IE6、IE7*/
*width: 400px; /* *是針對IE6、IE7*/
width: 200px\9; /* \9是針對IE6 IE7 IE8 IE9 IE10*/
width: 100px\0; /* \0是針對IE8 IE9 IE10 IE11 */
瀏覽器核心與字首
核心 核心字首 瀏覽器
Webkit -webkit- Safari、Chrome27以下
Blink -webkit- Chrome28以上、Opera15以上
Gecko -moz- 火狐瀏覽器
Trident -ms- IE系列、360安全瀏覽器
Presto -o- Opera12以下
CSS hack方式三:選擇器字首法
選擇器字首法是針對一些頁面表現不一致或者需要特殊對待的瀏覽器,在CSS選擇器前加上一些只有某些特定瀏覽器才能識別的字首進行hack。
目前最常見的是:
*html *字首只對IE6生效
*+html *+字首只對IE7生效
@media screen\9 {body { background: gray; }} 只對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有效
CSS3選擇器結合JavaScript的Hack
我們用IE10進行舉例:
由於IE10使用者代理字串(UserAgent)為:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0),所以我們可以使用Javascript將此屬性新增到文件標籤中,再運用CSS3基本選擇器匹配。
JavaScript程式碼:
var htmlObj = document.documentElement;
htmlObj.setAttribute('data-useragent',navigator.userAgent);
htmlObj.setAttribute('data-platform', navigator.platform );
CSS3匹配程式碼:
html[data-useragent*='MSIE 10.0'] #id {
color: #F00;
}
CSS hack利弊
一般情況下,我們儘量避免使用CSS hack,但是有些情況為了顧及使用者體驗實現向下相容,不得已才使用hack。
比如由於IE8及以下版本不支援CSS3,而我們的專案頁面使用了大量CSS3新屬性在IE9/Firefox/Chrome下正常渲染,這種情況下如果不使用css3pie或htc或條件註釋等方法時,可能就得讓IE8-的專屬hack出馬了。
使用hack雖然對頁面表現的一致性有好處,但過多的濫用會造成html文件混亂不堪,增加管理和維護的負擔。
補充:各瀏覽器下Hack的寫法
1、Firefox
只被Firefox瀏覽器識別的寫法,具體如下:
@-moz-document url-prefix() { .demo { color:lime; } }
/* 支援所有Firefox版本 */
寫法一:#selector[id=selector] { property: value; }
寫法二:@-moz-document url-prefix() { .selector { property: value; } }
/* 支援所有Gecko核心的瀏覽器 (包括Firefox) */
*>.selector { property: value; }
2、Webkit核心瀏覽器(chrome and safari)
以下寫法主要是針對Webkit核心的瀏覽器,如Chrome 和 Safari瀏覽器:
@media screen and (-webkit-min-device-pixel-ratio:0) { .demo { color: #f36; } }
3、Opera瀏覽器
下面是Opera瀏覽器的Hack寫法:
html:first-child>body Selector { background: green; }
或者:@media all and (min-width:0) { Selector { background: green; } }
或者:@media all and (-webkit-min-device-pixel-ratio:10000), not all and (-webkit-min-device-pixel-ratio:0) { head~body Selector { background: green; } }