1. 程式人生 > >CSS 相容瀏覽器的方法 CSS Hack

CSS 相容瀏覽器的方法 CSS Hack

開發人員基本都知道,CSS的開發本身並不難,但是,當在不同的瀏覽器下測試程式碼時,困難就出現了。瀏覽器的 bug 和不一致的顯示方式,是大多數CSS開發人員面臨的主要難題,你的設計在一種瀏覽器上看起來很好,而在另一種瀏覽器上可能會支離破碎。

實踐證明,CSS的相容性主要有兩種情況:一種是對老版本IE的相容性,一種是使用CSS3新特性後產生的相容性。

對老版本IE的相容性,主要通過CSS Hack和客戶端指令碼來解決;對使用CSS3新特性後產生的相容性,主要通過瀏覽器私有字首來解決。

CSS Hack

由於不同廠商的瀏覽器(如IE、Chrome、Firefox、Safari),或同一瀏覽器的不同版本(如IE6~IE11),對CSS的解析不完全一樣,導致同一頁面在不同瀏覽器中的效果可能不一致。

為了得到統一的效果,就需要針對不同瀏覽器,或同一瀏覽器的不同版本,編寫不同的CSS,把這個過程就被稱作CSS Hack。

實踐證明,CSS Hack主要用來解決IE的相容性問題。雖然它是強有力的工具,但應該謹慎使用,它一般作為修復問題的最後一道屏障,在不得已的時候才會使用。因為更重要的是跟蹤、隔離和識別問題,而不是修復問題。只有真正瞭解問題背後的原理,才能找到最好的解決方案。

CSS Hack 有 3 種表現形式:

1)屬性字首或字尾法

即在定義樣式規則時,為樣式屬性新增只有特定瀏覽器,或某瀏覽器特定版本才能識別的字首或字尾。

表 10-1 常見的字首字尾說明及應用示例
字首/字尾適用版本應用示例
_IE6p { _color: blue; }
-IE6p { -color: blue; }
+IE7p { +color: blue; }
*IE6/IE7p { *color: blue; }
#IE6/IE7/IE8p { #color: blue; }
!importantIE7/IE8/IE9/IE10/IE11p { color: blue !important; }
\9IE6/IE7/IE8/IE9/IE10/IE11p { color: blue\9; }
\0IE8/IE9/IE10/IE11p { color: blue\0; }
\9\0IE9/IE10/IE11p { color: blue\9\0; }

在使用屬性字首或字尾法時,一般是將適用範圍廣、被識別能力強的寫法寫在前面,把特殊寫法寫在後面。如:

  1. div {
  2.     background: blue;
  3.     background: green\9;
  4. *background: black;
  5.     _background: orange;
  6. }

由於所有瀏覽器都識別標準寫法,而IE6/IE7/IE8/IE9/IE10/IE11可識別\9,IE6/IE7可識別*,IE6僅能識別_。根據CSS的疊加原理,後定義的屬性會覆蓋先定義的同名屬性,就實現了為IE各版本和現代瀏覽器應用不同樣式的目的。

2)選擇器字首法

即在CSS選擇器前,新增只有特定瀏覽器或某瀏覽器特定版本才能識別的字首,選擇器和字首之間用空格分隔。

常用的字首有 *html 和 *+html,*html 是IE6特有的字首,而 *+html 是IE7特有的字首。如:

  1. *html p { color: blue;}/* IE6 */
  2. *+html p { color: blue;}/* IE7 */

3)條件註釋法

條件註釋是IE瀏覽器專有的,也是微軟官方推薦的Hack方式。它是使用IE條件註釋,針對不同IE版本,編寫不同的CSS,來為不同版本的IE應用不同的樣式。

一種方法是直接在條件註釋中定義樣式。如:

  1. <style>
  2. <!--[if IE 6]>
  3. div {
  4. display: inline;
  5. }
  6. <![endif]-->
  7. </style>

雖然這種方法可以解決一些現實的問題,但這些註釋需要放在HTML檔案,而不是CSS檔案中,樣式定義散落在多個地方,不便於維護,也容易出錯。也違背了內容與表現相分離的原則,故不推薦使用。

另一種方法是,編寫不同的CSS檔案,再使用IE條件註釋,通過 <link> 標籤,有針對性的載入外部樣式表。如:

  1. <!--[if IE 6]>
  2. <link rel="stylesheet" href="css/ie6.css" />
  3. <![endif]-->

這種方法卻會增加IE使用者的HTTP請求次數,影響訪問速度。所以,在使用這種方法前,要仔細斟酌,判斷是否真的有必要在自己的網站上使用它。

一個好訊息是,從IE10版本開始,不再支援條件註釋。這標誌著IE從此走向成熟、走向標準,Web設計師再也不必為IE的相容性問題所困擾了。

願望是美好的,現實卻是殘酷的。很多WEB設計師仍然發現,相同的CSS,在IE9/10/11上的渲染效果,和其它現代瀏覽器還是不一樣。

也就是說,我們仍然需要條件註釋。那麼,在不支援條件註釋的IE10/11上,能夠實現條件註釋的效果呢?

答案是肯定的。並且,有多種方法可以實現條件註釋的替代效果。並且,它們有各自的應用場景,可以根據需要選擇使用。

方法一:使用IE = EmulateIE9屬性,指示瀏覽器採用IE9渲染模式:

  1. <metahttp-equiv="X-UA-Compatible"content="IE=EmulateIE9">

因為IE9是支援條件註釋的,在頁面的頭部加入以上的元資料後,IE10/11就使用IE9的渲染模式,自然就能識別條件註釋了。

很顯然,這樣做的弊端是,瀏覽器使用的是IE9的渲染模式,而不是最新的IE10/11的渲染模式。

方法二:使用媒體查詢語句的 +-ms-high-contrast 屬性,為不同瀏覽器應用不同的樣式。

CSS 的媒體查詢語句是一種高階的CSS條件語句,它能根據一些屬性和屬性值的計算結果,來判斷CSS是否可以生效。

由於只有IE10/11實現了 -ms-high-contrast 屬性,取值為active或none。因此,就可以使用以下媒體查詢語句:

  1. @media all and(-ms-high-contrast: none),(-ms-high-contrast: active){
  2. /* IE10+ CSS styles go here */
  3. }

Firefox瀏覽器、Chrome瀏覽器不能識別這個屬性,這個語句中的CSS就不會生效,便間接實現了條件註釋的效果。

方法三:使用Javascript判斷瀏覽器的型別,來為不同瀏覽器定義不同的樣式。

先用Javascript 判斷瀏覽器的型別,如果是IE瀏覽器,就在頁面的 <html> 標籤上新增一個 ie 的類名:

  1. <script>
  2. var ms_ie =false;
  3. var ua = window.navigator.userAgent;
  4. var old_ie = ua.indexOf("MSIE");
  5. var new_ie = ua.indexOf("Trident/");
  6. if((old_ie >-1)||(new_ie >-1)){
  7.     ms_ie =true;
  8. }
  9. if( ms_ie ){
  10.    document.documentElement.className +="ie ";
  11. }
  12. </script>

有了這個標誌性 class 後,就可以在CSS中,區分不同的瀏覽器,並專門針對IE編寫不同的CSS程式碼。如:

  1. .testClass{
  2. /* 這裡寫通用的css */
  3. }
  4. .ie .testClass{
  5. /* 這裡寫專門針對IE的css */
  6. }

事實上,這個方法還能區分老IE和新IE。因此,也可以區分老IE和新IE,並有針對性的編寫不同的CSS程式碼。

方法四:使用IE10/11私有的條件編譯特性,來區分IE6-9 和IE10/11。

  1. <!--[if !IE]>
  2. <script>
  3. if (/*@[email protected]*/false)  {
  4.     document.documentElement.className += "ie10  ";
  5. }
  6. </script>
  7. <!--<![endif]-->

上述指令碼中,先使用條件註釋 !IE來排除IE,以確保IE6-9不承認它。然後,再執行@ cc_on功能檢測。

相關推薦

CSS 相容瀏覽器方法 CSS Hack

開發人員基本都知道,CSS的開發本身並不難,但是,當在不同的瀏覽器下測試程式碼時,困難就出現了。瀏覽器的 bug 和不一致的顯示方式,是大多數CSS開發人員面臨的主要難題,你的設計在一種瀏覽器上看起來很好,而在另一種瀏覽器上可能會支離破碎。實踐證明,CSS的相容性主要有兩種情

常用瀏覽器相容問題 及css hack總結

由於市場上瀏覽器種類眾多,而不同瀏覽器其核心亦不盡相同,所以各個瀏覽器對網頁的解析就有一定出入,這也是導致瀏覽器相容問題出現的主要原因,我們的網頁需要在主流瀏覽器上正常執行,就需要做好瀏覽器相容。 使用Trident核心的瀏覽器:IE、Maxthon、TT;

CSS瀏覽器相容方法

作為 Web 設計師,你的網站在各種瀏覽器中有完全一樣的表現是很多人的目標,然而這是一個永遠無法真正實現的目標,很多人認為,完美的跨瀏覽器相容並不必要,這樣說雖然沒錯,但在很多情形,一種近似的相容還是很容易實現的,本文講的是各種跨瀏覽器相容的 CSS 編碼準則和技巧。

火狐瀏覽器CSS相容的解決方法

DOCTYPE 影響 CSS 處理 2.FF: div 設定 margin-left, margin-right 為 auto 時已經居中, IE 不行 3.FF: body 設定 text-align 時, div 需要設定 margin: auto(主要是 margin-

div+css 兼容ie6 ie7 ie8 ie9和FireFox Chrome等瀏覽器方法(非原創)

需要 通過 是我 point 一定的 oba 對象 important not div+css 兼容ie6 ie7 ie8 ie9和FireFox Chrome等瀏覽器方法 1.DOCTYPE 影響 CSS 處理 2.FF: div 設置 margi

div css Firefox和IE瀏覽器相容問題 用CSS實現cellSpacing屬性效果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

IE瀏覽器下常見的CSS相容問題

寬高bug   【1】IE6-瀏覽器下子元素能撐開父級設定好的寬高 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Do

CSS相容IE6/IE7/IE8/IE9/IE10的通用方法

一、CSS HACK 以下兩種方法幾乎能解決現今所有HACK. 1, !important 隨著IE7對!important的支援, !important 方法現在只針對IE6的HACK.(注意寫法.記得該宣告位置需要提前.) 以下為引用的內容: <style> #wrapper { width

低版IE常見相容問題與css hack

 一、常見IE低版相容解決方式  1、通過html頁面條件註釋  2、css 選擇器字首法  3、css 屬性字首法(親測) \0 ie8+ \9 ie10- \9\0 ie9

CSS —— 相容各個瀏覽器的select的樣式

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

各個瀏覽器css hack的寫法

下面是我收集有關於各瀏覽器下Hack的寫法 1、Firefox @-moz-document url-prefix() { .selector { property: value; } } 上面是僅僅被Firefox瀏覽器識別的寫法,具體如: @-moz-document

ie相容響應式佈局的實現總結 和 針對ie瀏覽器CSS

ie瀏覽器hack .demo { padding:10px; padding:9px\9; /* all ie */ padding:8px\0; /* ie8-9 目前應用於IE8的單獨hack,情況比較少 */ *padding:5px; /* ie6

CSS固定視窗發現IE6下不相容,下面是解決position:fixed在IE6下不相容方法

.fixed-top /* 頭部固定 */{position:fixed;bottom:auto;top:0px;} .fixed-bottom /* 底部固定 */{position:fixed;bottom:0px;top:auto;} .fixed-left /* 左側固定

css相容瀏覽器強制換行與不換行

相容多瀏覽器強制換行與不換行 強制不換行,多餘的部分用省略 overflow:hidden;white-space:nowrap;text-overflow:ellipsis; 1. word-break:break-all;只對英文起作用,以字母作為換行依據 2.

css相容ie瀏覽器下面圓形問題

網上搜到的,這個辦法確實可行的,原理就是做一張遮罩圖片(中間是圓形,其他顏色根據背景色設定),然後設定浮動到要顯示的圖片上,設定個z-index就可以了。 html程式碼 <div class="user-img">               <im

IE6,IE7,FireFox相容CSS的解決方法CSS差別

一、CSS HACK以下兩種方法幾乎能解決現今所有HACK.1, !important    隨著IE7對!important的支援, !important 方法現在只針對IE6的HACK.(注意寫法.記得該宣告位置需要提前.)<style>#wrapper{    width: 100px!im

CSS RESET —— 瀏覽器樣式重置

ack tex 1.5 現實 兼容性 add body blog 高效 CSS Reset 1. CSS Reset為什麽存在? 只要您的客戶存在使用不同瀏覽器(ie,firefox,chrome等)的可能,那你就不得不從完美的理想狀態回到現實,因為不同核心的瀏覽器對CS

js寫css()方法,記得加引號“ ”,除非是數字

pos 引號 index size z-index roi absolut fff dex js寫css()方法,記得加引號“ ”,除非是數字。如: $("#android").css({ "position": "absolute", "z-index":

CSS清除浮動方法

pla 處理 adding ges 元素 高度 height css pre HTML結構 1 <div class="wrap"> 2 <div class="div1">1</div> 3 <div clas

css修改瀏覽器默認的滾動條樣式

box idt ica inset wid log class 滑動 llb //滾動條樣式 ::-webkit-scrollbar { width: 10px; } /* 垂直滾動條的滑動塊 */ ::-webkit-scrollbar-thumb:vertical