完美解決IE中PNG格式透明背景圖片顯示異常的各種方法【Z】

liuchang0001發表於2011-02-17


NG半透明背景圖片效果
PNG圖片在網頁設計中扮演著一個很重要的角色,利用PNG圖片的特點可以製作出實用,絢麗的效果,可是對於PNG圖片的支援卻不是很理想,Firefox和Opera對PNG支援的比較好,特別是Firefox瀏覽器。可是IE卻不理PNG,使得設計者無法很隨意的使用png圖片。

IE5.5+的 AlphaImageLoader濾鏡為通向png提供了一個道路,如果他載入的是PNG(Portable Network Graphics)格式,則0%-100%的透明度也被提供。我們就利用這個濾鏡和hack來設計一個半透明png背景圖片的模型。

經過多方面的實驗比較了2種方法:css控制和js控制。總結如下:

css中鑲入如下程式碼控制:

#png{background-image:url(images/jzz_02.png) no-repeat !important;
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled="true", sizingMethod="scale", src="images/jzz_02.png");
background:none;}

    比較累,需要一個個新增程式碼。而且用了濾鏡後背景圖片不支援background-position定位

    具體程式碼:

//總css檔案 style.css

#png{

background:url(image.png) no-repeat center !important;
}

//CSS程式碼中鑲入ie6配置CSS配置檔案 ie6.css

#png{

background:none;
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png',enabled='true', sizingMethod='scale');

}

//html格式

<head>
...
<link href="style.css" rel="stylesheet" type="text/css" />
<!--[if IE 6]>
<link href="ie6.css" rel="stylesheet" type="text/css" />
<![endif]-->
</head>
...

注:style.css檔案裡的圖片url是相對於css檔案的路徑,ie6.css檔案裡src是相對於html檔案的路徑

JS控制:

比較方便,適合懶人- -!,但bug比較多,效率相對於css要低

比較常用的js程式碼:

1.

correctpng.js

// JavaScript Document

function correctPNG()
   {
   for(var i=0; i<document.images.length; i++)
      {
     var img = document.images[i]
     var imgName = img.src.toUpperCase()
     if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
        {
       var imgID = (img.id) ? "id='" + img.id + "' " : ""
       var imgClass = (img.className) ? "class='" + img.className + "' " : ""
       var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
       var imgStyle = "display:inline-block;" + img.style.cssText
       if (img.align == "left") imgStyle = "float:left;" + imgStyle
       if (img.align == "right") imgStyle = "float:right;" + imgStyle
       if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle   
       var strNewHTML = "<span " + imgID + imgClass + imgTitle
       + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
        + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
       + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
       img.outerHTML = strNewHTML
       i = i-1
        }
      }
   }
function alphaBackgrounds(){
   var rslt = navigator.appVersion.match(/MSIE (d+.d+)/, '');
   var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5);
   for (i=0; i<document.all.length; i++){
      var bg = document.all[i].currentStyle.backgroundImage;
      if (bg){
         if (bg.match(/.png/i) != null){
            var mypng = bg.substring(5,bg.length-2);
   //alert(mypng);
            document.all[i].style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+mypng+"', sizingMethod='crop')";
            document.all[i].style.backgroundImage = "url('')";
   //alert(document.all[i].style.filter);
         }                                             
      }
   }
}

html

<head>
...
<script type="javascript" src="correctpng.js"></script>

<!--[if IE 6]>

<script>

if (navigator.platform == "Win32" && navigator.appName == "Microsoft Internet Explorer" && window.attachEvent) {
window.attachEvent("onload", correctPNG);
window.attachEvent("onload", alphaBackgrounds);
}


</scrpit>

<![endif]-->

</head>

注 這個js方法不支援重複背景,如果背景重複的話就只能顯示一個,別的都支援。

2.

使用先人寫好的iepngfix類

這個類裡面有3個檔案

blank.gif替換為空白的圖片

iepngfix.htc核心檔案

iepngfix_tilebg.js貌似是控制重複背景的檔案,不過我用了以後直接頁面都顯示不出- -!

具體用法:

在css檔案里加入

img,div{

behavior: url("iepngfix.htc") ;

}

在html裡head之間呼叫iepngfix_tilebg.js

注意最好blank.gif和htc檔案放一個資料夾裡 習慣都放在image資料夾裡

總結:我個人認為使用css檔案會比較好點,這對程式美觀度和效率都會有一定的提高。

總結完畢。

==================================================================

 

 

 

另外的方法

新建一個叫png_fix.css的檔案,內容如下:

* html img,* html .png {
	behavior: expression(( this.runtimeStyle.behavior = "none") &&(
		this.pngSet ? this.pngSet = true :( this.nodeName ==   "IMG" &&  
		this.src.toLowerCase ( ) . indexOf('.png') > -1 ?(
		this.runtimeStyle.backgroundImage =   "none", this.runtimeStyle.filter
		=   "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +  
		this.src +   "', sizingMethod='image')", this.src =  
		"image/transparent.gif" ) :( this.origBg =   this.origBg ?   this.origBg :
		this.currentStyle.backgroundImage.toString ( ) . replace('url("', '')
		. replace('")', ''), this.runtimeStyle.filter =  
		"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +  
		this.origBg +   "', sizingMethod='crop')",
		this.runtimeStyle.backgroundImage =   "none" ) ), this.pngSet = true )
		);
}

 然後在HTML檔案的<LINK>部分加入<> 最後自己做一個1×1畫素的透明gif圖片,存為transparent.gif。 使用的時候是這樣: 1、如果是在HTML裡面直接插入的PNG圖片,就直接會處理掉; 2、如果是在css裡面寫的用作背景的圖片,需要在

裡面加上class="png",最後就是
; 3、如果是連結,需要加上cursor: pointer; 測試下來使用沒有問題,非常完美。

=========================================================================
親測成功的方法

把下面的程式碼放在head區就可以解決問題了。
<!--[if gte IE 5.5000]><script type="text/javascript" src="js/pngfix.js"></script><![endif]-->
pngfix.js檔案的程式程式碼
function  correctPNG() 
{
for ( var  i = 0 ; i < document.images.length; i ++ )
{
 
var  img  =  document.images[i]
 
var  imgName  =  img.src.toUpperCase()
 
if  (imgName.substring(imgName.length - 3 , imgName.length)  ==   " PNG " )
 {
  
var  imgID  =  (img.id)  ?   " id=' "   +  img.id  +   " "  :  ""
  
var  imgClass  =  (img.className)  ?   " class=' "   +  img.className  +   " "  :  ""
  
var  imgTitle  =  (img.title)  ?   " title=' "   +  img.title  +   " "  :  " title=' "   +  img.alt  +   " "
  
var  imgStyle  =   " display:inline-block; "   +  img.style.cssText 
  
if  (img.align  ==   " left " ) imgStyle  =   " float:left; "   +  imgStyle
  
if  (img.align  ==   " right " ) imgStyle  =   " float:right; "   +  imgStyle
  
if  (img.parentElement.href) imgStyle  =   " cursor:hand; "   +  imgStyle  
  
var  strNewHTML  =   " <span  "   +  imgID  +  imgClass  +  imgTitle
  
+   "  style=\ ""  +  " width: "  + img.width +  " px; height: "  + img.height +  " px; "  + imgStyle +  " ; "
 + 
" filter:progid:DXImageTransform.Microsoft.AlphaImageLoader "
  + 
" (src = \ ' " + img.src + "\ ' , sizingMethod = ' scale ' );\ " ></span> "  
  img.outerHTML 
=  strNewHTML
  i 
=  i - 1
 }
}
}
window.attachEvent(
" onload " , correctPNG);

相關文章