轉載自:http://www.azuresky.com.cn/post/WebJourney-PngTransparentInIE6.php#topreply
很多朋友在制作網頁時都會用到圖片透明。使其部分透明的圖片后面顯示背景部分。
而現在流行的具有透明性的圖片有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將下次跟大家共同探討。
posted on 2008-08-05 11:26
阿蜜果 閱讀(3541)
評論(3) 編輯 收藏