[轉]使IE瀏覽器支持CSS3屬性(圓角、陰影、漸變)


原文:http://www.wondye.com/the-hair-is-sent-to-satan-where-satan-made-three.html

一、PIE之簡述

CSS3 PIE 張鑫旭-鑫空間-鑫生活在國外,CSS3的盛行與普及,探討與研究要比國內領先不知多少個身位。相比之下,國內似乎如一潭死水,為何?我覺得國內領先的前端團隊應該通過自身的影響力,帶動國內整個前端領域與時俱進。然而,可以理解,我們都是要養家糊口或是談情說愛的,我們不都是聖人,有着以天下興亡為己任的責任心與使命感,所以呢,要么等着別人喂,要么閉門造車。這,不說也罷。
我們都知道,IE瀏覽器暫不支持CSS3的一些屬性。國外的工程師們,不安於此現狀,他們總是盡量使用一些手段使IE瀏覽器也能支持CSS3屬性,我覺得這些都是很有意義,很有價值的工作,可以推動整個技術領域的進步的。都目前為止,有不少可以讓IE支持部分CSS3屬性的工具。例如: 1. Dean Edwards的IE7.js (以及 IE8.js, IE9.js) 這個玩意估計是試圖讓IE支持CSS3屬性的鼻祖,還算蠻強大,就是性能開銷較大,要解析很多文件腳本,給DOM添加大量的元素以及ClassName。 2. Aaron Gustafson的 eCSStender 此方法支持@font-face, CSS3 選擇器, 以及 CSS3 Backgrounds 和 Borders。 3. Drew Diller的 DD_roundies 這是一個基於IE VML實現一些CSS3效果的。 4. Remiz Rahnas的border-radius.htc 此方法使用htc文件,配合VML實現,缺點在於不能自動適應目標元素的位置和大小,所以不能適用於動態腳本環境。 5. Nick Fetchak的 ie-css3.htc 關於此方法,我在前面的“讓IE6/IE7/IE8瀏覽器支持CSS3屬性”這篇文章中已經做過介紹。我是建議您看看這篇文章,倒不是ie-css3.htc這個玩意多么好,而是文中對htc文件以及VML預言做了些介紹,對於您了解IE下實現類似CSS3效果原理有所了解。 6. Keith Clark的ie-css3.js 這是個與IE7.js類似的項目,其選擇器可借助其他JavaScript庫,所以其本身較小。 7. zoltandulac的cssSandpaper 關於此方法,我在“cssSandpaper-兼容IE的CSS3 JavaScript庫”一文中有過介紹,這是一個使用IE濾鏡實現一些CSS3屬性的方法。這里就不再具體展開了。
而本文要展示的這個方法名為PIE,在白雲黃鶴BBS上有個pie版,就是一個專門征婚,征男女朋友,征K歌,旅游玩版的版塊。所以pie有尋找朋友之意,顯然,在這里這樣解釋有些牽強,還有種說法,說PIE有“工藝整合工程師或者制程整合工程師”的意思(Process Integration Engineer),這種解釋似乎更為貼切,整合一些CSS3屬性使IE瀏覽器得以支持。恩恩……
這里PIE實際上是指的是一個名為pie的htc文件,即pie.htc,使用CSS的behavior行為,可以調用此文件,然后讓IE也能實現一些常見的CSS3效果,如圓角(border-radius),盒陰影(box-shadow),背景漸變(gradient),多圖片背景(multiple background images)。具體如何使用,都有哪些效果呢?不要走開,廣告之后,馬上回來!……
(廣告開始……護舒寶……婦炎潔……維達紙巾……腦白金……XXX點讀機……霸王生發液……廣告結束)

二、效果預覽、綜合demo以及源文件下載

您可以狠狠地點擊這里:控制面板綜合demo 下為IE7瀏覽器下該面板及效果截圖,您可以修改上面的參數以動態查看效果: 綜合效果截圖 張鑫旭-鑫空間-鑫生活 例如,修改漸變的起始顏色為紅色,結果如下圖所示: 修改起始顏色為紅色后的效果圖 張鑫旭-鑫空間-鑫生活 下載 該項目詳盡原始的下載資源在這里:http://github.com/lojjic/PIE/downloads

三、PIE支持的主要CSS3屬性詳解

PIE方法的使用與平時我們使用CSS3屬性一樣,基本上沒有什么特殊的樣式名稱,只要鏈接pie.htc文件即可。 1. border-radius圓角 關於CSS3 border-radius的基本屬性,您可以參見這里
CSS代碼如下:

.pie_radius{
    width:360px;
    height:200px;
    background-color:#34538b;
    -moz-border-radius:8px;
    -webkit-border-radius:8px;
    border-radius:8px;
    position:relative;
    behavior:url(pie.htc);
}

 

相應的html代碼如下:

<div></div>

 

結果在IE6瀏覽器下的效果如下截圖: IE6下border-radius效果截圖 張鑫旭-鑫空間-鑫生活您可以狠狠地點擊這里:PIE使IE實現CSS3圓角demo 2. box-shadow 盒陰影 關於CSS3 box-shadow 盒陰影的基本屬性,您可以參見這里
CSS代碼如下:

.pie_box_shadow{
    width:360px;
    height:200px;
    background-color:#34538b;
    -moz-box-shadow:1px 3px 3px #666;
    -webkit-box-shadow:1px 3px 3px #666;
    box-shadow:1px 3px 3px #666;
    position:relative;
    behavior:url(pie.htc);
}

 

相應的HTML代碼如下:

<div></div>

 

結果在IE7瀏覽器下的效果如下: PIE盒陰影效果在IE7下的截圖 張鑫旭-鑫空間-鑫生活 您可以狠狠地點擊這里:PIE使IE實現CSS3盒陰影效果demo 3. gradient漸變 關於CSS3的漸變屬性,我在“CSS漸變之CSS3 gradient在Firefox3.6下的使用 ”、“CSS gradient漸變之webkit核心瀏覽器下的使用 ”、“CSS實現兼容性的漸變背景(gradient)效果”中做了相當詳細的介紹,您有興趣可以去看看。
如果使用PIE實現IE餓漸變背景,該如何呢?需要用到一個自定義的CSS屬性,-pie-background,后面的寫法與火狐瀏覽器類似。CSS部分代碼如下:

.pie_gradient{
    width:360px;
    height:200px;
    background-color:#9F9;
    background:-webkit-gradient(linear, 0 0, 0 bottom, from(#9F9), to(#393));
    background:-moz-linear-gradient(#9F9, #393);
    -pie-background:linear-gradient(#9F9, #393);
    position:relative;
    behavior:url(pie.htc);
}

 

相應的html代碼如下:

<div></div>

 

結果如下圖(截自IE8瀏覽器): IE8瀏覽器下漸變背景截圖 張鑫旭-鑫空間-鑫生活 您可以狠狠地點擊這里:PIE使IE實現CSS3漸變背景色效果demo 4. multiple background images多背景 此CSS3屬性接觸較少,尚未詳細研究過,此處略!

四、已知的一些問題

此方法並不是萬能的,也有一些局限性和需要注意的地方。 1. z-index相關問題 IE下這些CSS3效果實現是借助於VML,由VML繪制圓角或是投影效果的容器元素,然后這個容器元素作為目標元素的后兄弟節點插入,如果目標元素position:absolute 或是 position:relative,則這個css3-container元素將會設置與之一樣的z-index值,在DOM tree中,同級的元素總是后面的覆蓋前面的,所以這樣就實現了覆蓋,又避免了可能有其他元素正好插入其中。
所以,問題來了,如果目前元素的position屬性為static,也就是默認屬性,則z-index屬性是沒有用的,無覆蓋可言,所以此時IE瀏覽器下CSS3的渲染是不會成功的。要解決也很簡單,設置目標元素position:relative或是設置祖先元素position:relative並賦予一個z-index值(不可為-1) 2. 相當路徑的問題 IE瀏覽器的behavior 屬性是相對於HTML文檔而言的,與CSS其他的屬性不一樣,不是相對於CSS文檔而言的。這使得使用pie.htc文件不怎么方面。如果絕對路徑於根目錄,則CSS文件不方便移動;如果相對路徑與HTML文檔,則pie.htc文件在不同HTML頁面見的重用性大大降低。同時,諸如border-image后面的URL屬性路徑也不好處理。 3. 縮寫的問題 使用PIE實現IE下的CSS3渲染(其他方法也是一樣),只能使用縮寫的形式,例如圓角效果,我們可以設置border-top-left-radius表示左上圓角,但是PIE確實不支持這種寫法的,只能是老老實實的縮寫。 4. 提供正確的Content-Type 要想讓IE瀏覽器支持htc文件,需要一個有着”text/x-component” 字樣的content-type 頭部,否則,會忽視behavior。絕大數web服務器提供了正確的content-type,但是還有一部分則有問題。例如的我的空間域名商就沒有”text/x-component” 字樣的content-type,可能是出於安全的考慮。
如果您發現在您的機子上PIE方法無效,也就是htc文件這里指pie.htc文件無效,檢查您的服務器配置,可能其需要更新到最新的content-type。例如對於Apache,您可以在.htaccess文件中左如下處理:

AddType text/x-component .htc

 

但是,由於某種原因,您無法修改服務器配置(例如公用主機,或是空間服務商提供的服務器),您可以用一個PHP文件來間接調用htc文件。我只要給你看下這個PHP文件的代碼您就知道什么意思了,如下:

<?php
header( 'Content-type: text/x-component' );
include( 'pie.htc' );
?>

 

通過PHP文件來增加一個含有“text/x-component”字樣的Content-type頭,同時調用pie.htc文件。
關於上面所示的php文件,您可以狠狠地點擊這里:pie.php(右鍵 – [目標|鏈接另存為]),或者您可以直接新建一個php文件,把上面的兩行代碼復制進去。或者在本文提供的原始打包資源的wrappers文件夾里面也有此php文件,不過名稱是大寫的。 wrappers文件夾示意 張鑫旭-鑫空間-鑫生活 如果您使用上述php文件,您需要將pie.php和pie.htc放在同一個文件夾目錄下,同時CSS中的behavior寫法應該是:

behavior: url(pie.php);

 

以上為一些常見的主要的問題,當然,在復雜的頁面情況下,還會有其他意想不到的情況,這里,我只能祝您好運了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM