使用Filters濾鏡彌補CSS3的跨瀏覽器問題以及兼容低版本IE

跨瀏覽器兼容性是網頁制作永恒的難題 。別看各瀏覽器廠商都努力在自己的瀏覽器中實現新式的css3標準特性,但都是以擴展樣式的形式提供的, 所以在未來一段時間里,樣式表里的-moz-,-webkit-,(-ms-,-o-)等等前綴將長期存在 。

另外 , 雖說各家有志于擴張自己市場的瀏覽器廠商都提供了css3的新特性,但鑒于其老式版本的瀏覽器依然存在于用戶的主機上(主要是微軟旗下的ie6,7,8),除了考慮各家瀏覽器之間的兼容性外 , 我們還有必要向前兼容老式瀏覽器 。

這些老式瀏覽器(低版本ie)對于css3的不支持問題,真是阻礙我們邁向css3時代的一大障礙 。
不幸之幸,當年ie在輕視w3c標準之時 , 自成一套的Filters濾鏡卻是具備長遠眼光的 。在這些Filters濾鏡中,不少效果正是我們CSS3中目前實現的 。
對于Filters濾鏡,我們不建議單獨使用 , 只作為解決兼容性時候的一個選擇 。
下面我們將解決以下低版本瀏覽器的問題:
1. ie6下對透明png的不支持;
2. ie6,7,8下陰影(box-shadow,text-shadow)效果的不支持;
3. ie6,7,8下漸變(Gradients)效果的不支持;
4. ie6,7,8下對rgba的不支持(一般用來做半透明層) 。

1. 解決ie6對24位透明png的不支持
第一個問題非常常見,其實有兩個解決方法 ,
一個就是使用ie濾鏡:AlphaImageLoader


!DOCTYPE html htmlhead meta charset="utf-8" / title使用AlphaImageLoader濾鏡支持ie6的透明png/title style .pngBg{ width:160px;height:240px;background: url(//imgup01.經驗啦網.net/經驗啦網/2018-03/29/10/15222906636564_0.png); _background:none; _filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=https://www.questions.com.cn/dnjc/’//imgup01.經驗啦網.net/經驗啦網/2018-03/29/10/15222906636564_0.png’,sizingMethod=’scale’); /* sizingMethod參數還可以是image,crop */ } /style /head body div class=’pngBg’ 請嘗試使用ie6 /div /body /html
ffcod = delpost.runcode24 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode24 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
使用這個濾鏡之后,仍然是有一些問題沒法彌補的,比如圖片的repeat等等 。
之前 , 我曾極力推薦過另外一個解決方法:使用VML,稱之為完美解決方案 。在這個js里已經封裝好代碼DD_belatedPNG
但是后來發現,使用VML效率問題比AlphaImageLoader更甚,君當慎之 。

2. 解決ie6,7,8下對陰影(box-shadow,text-shadow)效果的不支持
現在很多網站為求美觀采用了很多css3的樣式,其中box-shadow和text-shadow的使用率最高 。
下面我們就利用Blur和dropShadow濾鏡在ie6,7,8中實現這種效果:


!Doctype html html head meta charset="UTF-8" / titleBlur濾鏡模擬box-shadow,dropShadow濾鏡模擬text-shadow/title style type="text/css" body{ position:relative; color:#c00; font-family:’黑體’; font-size:20px; background:#cfc; } .shadow{ width:200px;height:100px; background:#fff; border:1px solid #ccc; } .shadow span{zoom:1;filter:progid:DXImageTransform.Microsoft.dropShadow( Color=cccccc,offX=2,offY=1,positive=true); } .ieShadow{ position:absolute;width:200px;height:100px;z-index:-1; background: #333; top:-5px;left:-5px; filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=’6’, MakeShadow=’true’, ShadowOpacity=’0.3’); } /style /head body div class="wrap" div class=’ieShadow’/div div class=’shadow’ span文字shadow/span /div /div /body /html
ffcod = delpost.runcode25 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode25 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
ie的濾鏡是必須要在觸發haslayout情況下才能生效的(ie8除外 , 它已經拋棄了haslayout這個私有屬性) , 這就是為什么我們在那里加了個zoom:1;
另外,當使用dropShadow濾鏡做文字陰影時 , 就不應該使用background,否則陰影效果是對背景起作用了,所以我們將dropShadow濾鏡加在了span上而不是class=shadow層上 。
做box-shadow效果,我們還多加了一層class=ieShadow,然后使用blur濾鏡來模擬的 。其實濾鏡中還有個Shadow濾鏡,可以不需要這個額外層 , 但是效果并不好,所以我們并沒有采用 。
下面,我們做一個兼容所有瀏覽器的demo 。


!Doctype html html head meta charset="UTF-8" / title塊陰影(Firefox,Safari, Chrome,opera)與文字陰影(Firefox 3.1,Safari,Opera,chrome)/title style type="text/css" body{ position:relative; color:#c00; font-family:’黑體’; font-size:20px; background:#cfc; } .shadow{ width:200px;height:100px; background:#fff; border:1px solid #ccc; box-shadow: 1px 1px 10px rgba(200,200,200,0.9); -webkit-box-shadow:1px 1px 10px rgba(200,200,200,0.9) ; -moz-box-shadow: 1px 1px 10px rgba(200,200,200,0.9) ; } .shadow span{ zoom:1;filter:progid:DXImageTransform.Microsoft.dropShadow( Color=cccccc,offX=2,offY=1,positive=true); text-shadow: 2px 1px 2px #ccc; } .ieShadow{ display:none; display:block9; position:absolute;width:200px;height:100px;z-index:-1; background: #ccc; top:-5px;left:-5px; filter:progid:DXImageTransform.Microsoft.Blur(PixelRadius=’6’, MakeShadow=’true’, ShadowOpacity=’0.2’); } /style /head body div class="wrap" div class=’ieShadow’/div div class=’shadow’ span文字shadow/span /div /div /body /html
ffcod = delpost.runcode26 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode26 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
3. 解決ie6,7,8下漸變(Gradients)效果的不支持
自從有了gradient漸變這個css3屬性后,很多設計效果我們就不需要去切圖了,直接使用代碼就能實現,并且相對圖片來說局限性更小 。
為了彌補ie低版本下對gradient的不支持,我們可以使用Gradient濾鏡 。
ie的Gradient濾鏡只支持線性漸變,且只能設置兩個漸變色,不過這里注意一下,這個漸變顏色可以設置alpha透明度 。


!Doctype html html head meta charset="UTF-8" / titleie6下的gradient濾鏡線性漸變/title style type="text/css" .Box{ width:300px;height:200px; filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 0, startColorstr = #FEFEFE, endColorstr = #E0E0E2); } /style /head body div class=’Box’漸變背景/div /body /html
ffcod = delpost.runcode27 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode27 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
我們在看一下各瀏覽器兼容性的寫法 , 遺憾的是opera并未支持 。


!Doctype html html head meta charset="UTF-8" / title線性漸變(未支持opera)/title style type="text/css" .Box{ width:300px;height:200px; background:linear-gradient(top, #FEFEFE, #E0E0E2 ); background:-moz-linear-gradient(top, #FEFEFE, #E0E0E2 ); background:-webkit-gradient(linear, 50% 0, 50% 100%, from(#FEFEFE), to(#E0E0E2)); /* webkit老式寫法 */ background:-webkit-linear-gradient(0, #FEFEFE, #E0E0E2 ); /* webkit新式寫法 */ filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 0, startColorstr = #FEFEFE, endColorstr = #E0E0E2); } /style /head body div class=’Box’漸變背景/div /body /html
ffcod = delpost.runcode28 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode28 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
4. 解決ie6,7,8下對rgba的不支持(一般用來做半透明層)
這第四個問題,非常普遍,而且ie低版本下的解決方法在網上也是隨處可見 , 就是半透明層的效果 。
因為ie不支持rgba色,所以我們一般都使用ie的alpha濾鏡來達到半透明效果,但是,同我們上面舉的box-shadow的模擬例子一樣,這個alpha濾鏡和上面的blur濾鏡都是針對層元素內所有子元素且包括文本節點的 。所以,一旦使用了alpha濾鏡 , 那么這個元素下面的所有東西都透明了,這常常和我們要的效果不一致 。
網上一般的解決方法同上面的模擬box-shadow的blur濾鏡一樣 , 將透明層單獨提取成一個層 。


!Doctype html html head meta charset="UTF-8" / titleie半透明層/title style type="text/css" body{background:#fee;} .Box{ position:relative;width:300px;height:200px;border:1px solid #ccc; } .ieAlpha{ position:absolute;z-index:-1;top:0;left:0;width:300px;height:200px;background:#333; filter:alpha(opacity=30); } /style /head body div class=’Box’ div class=’ieAlpha’/div 透明背景 /div /body /html
ffcod = delpost.runcode29 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode29 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
這種方法使用的比較普遍,但是多加的一層實在有些多余,并且有時候控制起來還比較麻煩 。
我們可以換一個濾鏡方法:在上面的漸變的濾鏡里,我們提到了漸變色也可以使用alpha半透明值,并且這個漸變濾鏡是針對于元素背景的,元素內容并不會受其影響 。
那么我們可以這樣實現:


!Doctype html html head meta charset="UTF-8" / title利用gradient實現半透明層/title style type="text/css" body{background:#fee;} .Box{ position:relative;width:300px;height:200px;border:1px solid #ccc; filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 1,startColorstr = #66000000,endColorstr = #66000000); } /style /head body div class=’Box’ 透明背景 /div /body /html
ffcod = delpost.runcode30 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode30 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
顯然結構,樣式簡單多了,再做一下其他瀏覽器的兼容性:


!Doctype html html head meta charset="UTF-8" / title半透明層/title style type="text/css" body{background:#fee;} .Box{ position:relative;width:300px;height:200px;border:1px solid #ccc; background:rgba(0,0,0,0.35); /* 這里也不獨立使用opacity了 */ filter:progid:DXImageTransform.Microsoft.gradient(gradientType = 1,startColorstr = #66000000,endColorstr = #66000000); } /style /head body div class=’Box’ 透明背景 /div /body /html
ffcod = delpost.runcode31 .value; ffcod = ffcod.replace(/
/g,’’); delpost.runcode31 .value = https://www.questions.com.cn/dnjc/ffcod; 提示:您可以先修改部分代碼再運行
雖然我們以上解決了四種ie低版本下的不足,但在解決的過程中某些地方還是稍顯繁復了,且在具體應用當中的情況或許并沒有這么簡單,讀者當理解之后再做延伸 。
除了以上四種問題被解決之外,還是有太多的css3效果在ie低版本下是無法實現的,我們不得不(在低版本瀏覽器中)放棄之,其中最最最遺憾的就是css3圓角效果了 , 當然使用VML也是能解決,封裝的方法:Curved corner,同DD_belatedPNG一樣,我還是建議讀者謹慎采用 。
ie各個Filters靜態濾鏡演示Demo:DXTidemo

相關經驗推薦