使PNG图片格式在IE6中背景透明(pngfix)

分类:Web之旅 | 发布者:Tim | 发布日期: 2008-2-20 | 天气:晴  | |
很多朋友在制作网页时都会用到图片透明。使其部分透明的图片后面显示背景部分。
而现在流行的具有透明性的图片有GIF和PNG两种非常普及格式。

GIF(Graphics Interchange Format图像互换格式)可实现图像区域的部分或全局透明。现非常多的网站都将其运用到其中。
但是256色的限制GIF的使用范围。还有一个问题:譬如,当我们的图像边缘有阴影时,保存透明后会发现其边缘不是以渐变式透明显示,而是用灰度色显示而无透明而言。

解决上面GIF的缺陷方案最好方法就是使用现在网络上流行使用的另一种图像格式PNG(Portable Network Graphic Format流式网络图形格式)
但是PNG最大的问题就是,它在IE6下无法显示透明区域(Firefox、Opera、Safari均支持PNG透明),会有一种灰白色代替成为其背景色。这不是PNG这个格式图片的问题,而是IE6的BUG,没有将PNG的Alpha通道打开,造成透明PNG图片的在IE6上显示不出透明区域。

现在就有种方法是通过引入JavaScript的方式解决这个问题。

第一步:
新建一个pngfix.js文件写入以下代码(放在你网页的相同目录下):

var PIXELGIF="pngfix.gif";// 这个是个头1*1像素的透明gif图片,请自行建立并放在你网页的相同目录下

var arVersion = navigator.appVersion.split("MSIE");
var version = parseFloat(arVersion[1]);
var pngxp=/\.png$/i;
var AlphaPNGfix= "progid:DXImageTransform.Microsoft.AlphaImageLoader";
function fixPNGAll() {
        if(!document.all) return;
        if ((version >= 5.5 && version < 7) && (document.body.filters)) {
          for(var i=0; i<document.images.length; i++) {
                var img = document.images[i];
                if(img.src && pngxp.test(img.src)) {
                  var imgName = img.src;
                  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:" +AlphaPNGfix
                  + "(src='" + img.src + "', sizingMethod='scale');\"></span>";
                  if (img.useMap) {
                        strNewHTML += "<img style=\"position:relative; left:-" + img.width + "px;"
                        + "height:" + img.height + "px;width:" + img.width +"\" "
                        + "src=\"" + PIXELGIF + "\" usemap=\"" + img.useMap
                        + "\" border=\"" + img.border + "\">";
                  }
                  img.outerHTML = strNewHTML;
                  i--;
                }
          }
          /* for type=image png button */
          var kmax = document.forms.length;
          for(var k=0; k<kmax; k++) {
                var fmob = document.forms[k];
                var elmarr = fmob.getElementsByTagName("input");
                var jmax = elmarr.length;
                for(var j=0; j<jmax; j++) {
                        var elmob = elmarr[j];
                        if(elmob && elmob.type=="image" && pngxp.test(elmob.src)) {
                                var origsrc = elmob.src;
                                elmob.src = PIXELGIF;
                                elmob.style.filter = AlphaPNGfix+"(src='" +origsrc +"')";
                        }
                }
          }
        }
}

function fixPNG(img) {
        if(!document.all) return;
        var img;
    if(img && img.src && pngxp.test(img.src)) {
      var imgName = img.src;
      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:" +AlphaPNGfix
      + "(src='" + img.src + "', sizingMethod='scale');\"></span>";
      if (img.useMap) {
        strNewHTML += "<img style=\"position:relative; left:-" + img.width + "px;"
        + "height:" + img.height + "px;width:" + img.width +"\" "
        + "src=\"" + PIXELGIF + "\" usemap=\"" + img.useMap
        + "\" border=\"" + img.border + "\">";
      }
      img.outerHTML = strNewHTML;
    }
}

第二步:
在head标签中引入js文件
<script language="JavaScript" src="pngfix.js"></script>


第三步(分两种情况):
1、指定PNG图片使其在IE6下背景透明
在img标签中加入onload="fixPNG(this)"事件
<img src="Name.png" alt="Name"  onload="fixPNG(this)" />

2、页面内所有PNG图片使其在IE6下背景透明
在body表情中加入onload="fixPNGAll()"事件
<body onload="fixPNGAll()">


需要注意的是:
如果你的网页需要符合XHTML 1.0标准的话,请用第三步中的2方法,因为1方法中img标签中的onload事件是不符合XHTML 1.0标准的

特殊情况(用PNG为button按钮的背景时):
如果你要在input标签的背景中使用PNG图片,此js文件同样适用。

先在head标签中引入js文件
<script language="JavaScript" src="pngfix.js"></script>


在body标签中加入onload="fixPNGAll()"事件
<body onload="fixPNGAll()">

示例
<input type="image" src="Name.png" />


其实还有其他一些方法也能解决PNG图片格式在IE6中背景透明的问题,Tim将下次跟大家共同探讨。
文章出处:  本文为Azuresky Blog原创,转载请注明"作者"和"出处"及本声明!
Tags: ,

amigo Homepage
2008-8-5 10:51
挺好!转载一下哈,Thanks
Tim 回复于 2008-9-2 12:48
欢迎转载!~~
分页: 1/1 第一页 1 最后页