網頁中PNG透明背景圖片的完美應用


PNG 圖片在網站設計中是不可或缺的部分,最大的特點應該在於 PNG 可以無損壓縮,而且還可以設置透明,對於增強網站的圖片色彩效果有重要的作用。

但為什么 PNG 圖片卻沒有 GIF 和 JPG 圖片的使用來得廣泛呢,這個禍因應歸屬於微軟的 IE 瀏覽器(Firefox 和 Opera 對 PNG 支持的比較好,而現在瀏覽器的主流IE6 卻無法很好的支持)。不過微軟在最近也開始改過自新了,新出的的 IE7 可以很好的支持 PNG,可以想象在未來的網絡世界,PNG 圖片的重要性將會更加凸顯。

    但在大家還在絕大多數的使用 IE6 的時候,我們又怎樣在 IE6 的世界去完美使用 PNG 圖片呢(PNG 圖片的時候最重要的地方在於 PNG 透明背景圖片的運用)。我們應該慶幸我們是幸福的!IE5.5+ 的 AlphaImageLoader 濾鏡為通向 png 提供了一個道路,如果他載入的是 PNG(Portable Network Graphics) 格式,則 0%-100% 的透明度也被提供。但 IE5.0 無法支持屬性,那只有完全絕望了,不過絕望的只是幾個,得到是絕大數,我們應該知足,知足才會常樂。

    現在我們將通過 Hack 和 AlphaImageLoader 濾鏡來實現 IE6 下的 PNG 透明背景圖片,不過由於 filter 的使用存在一定的性能問題,所以盡量少用。

    先熟悉下濾鏡的語法:

    filter : progid:DXImageTransform.Microsoft.AlphaImageLoader ( enabled=bEnabled , sizingMethod=sSize , src=sURL )

    屬性:

    enabled:可選項。布爾值(Boolean)。設置或檢索濾鏡是否激活。true | false
    true:默認值。濾鏡激活。
    false:濾鏡被禁止。
    sizingMethod:可選項。字符串(String)。設置或檢索濾鏡作用的對象的圖片在對象容器邊界內的顯示方式。

    crop:剪切圖片以適應對象尺寸。
    image:默認值。增大或減小對象的尺寸邊界以適應圖片的尺寸。
    scale:縮放圖片以適應對象的尺寸邊界。
    src:必選項。字符串(String)。使用絕對或相對 url 地址指定背景圖像。假如忽略此參數,濾鏡將不會作用。

    Firefox、Opera、IE7 等完全支持 PNG 透明圖片的瀏覽器,而 IE6 不能很好識別,所有我們可以通過這來定義Firefox、Opera、IE7 等瀏覽器中 PNG 圖片的樣式。如下:


#png {background: url(絕對路徑/images/bg.png) repeat;}

 

    而對於 IE6,我們都通過濾鏡的方法來定義。我們通過只有 IE6 才識別的下划線(_),來定義 IE6 瀏覽器中的濾鏡。如下:


#png {
_filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true', sizinMethod='scale', src="絕對路徑/images/bg.png");
_background:none;
}

 

    這樣綜合起來的最后方法就是:


#png {
background: url(絕對路徑/images/bg.png) repeat;
_filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true', sizingMethod='scale', src="絕對路徑/images/bg.png");
_background:none;
}

 

    不過需要注意的一個地方:使用 AlphaImageLoader 后該區域的超鏈接和按鈕會失效,解決的方法:對鏈接或按鈕直接設置相對位置,讓它們浮動於濾鏡區域的上面。


 

 

PNG透明 IE6 (三種解決方法)

 

FF和IE7已經直接支持透明的png圖了,下面這個主要是解決IE6下透明PNG圖片有灰底的

 

第 1 種方法:定義一個樣式,給某個div應用這個樣式后,div的透明png背景圖片自動透明了。(注意兩處圖片的路徑寫法不一樣,本例中,icon_home.png圖片與html文件在相同目錄)

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>
<style type="text/css">
<!--
.qq {
height: 90px;
width: 90px;
background-image: url(icon_home.png)!important;
background-repeat: no-repeat;

_filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icon_home.png');
_ background-image: none;
}
-->
</style>
</head>

<body>

<div class="qq"></div>

</body>
</html>

 

 

第 2 種方法: 給img定義樣式,頁面上所有透明png即自動透明了。(這方法只對直接插入的圖片有效,對背景圖無效)注意,要准備一個透明的小圖片transparent.gif,大小不限。必須放在和html相同的目錄
請勿大量使用,否則會導致頁面打開很慢!!!)

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>
<style type="text/css">
.mypng img {
azimuth: expression_r(
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 = "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);
}

</style>
</head>

<body>
換成你的png圖片
<div class="mypng">
<img src="icon_face_07.png" width="30" height="30" />
<img src="icon_face_10.png" width="30" height="30" />
<img src="icon_face_08.png" width="30" height="30" />
</div>
</body>
</html>

 

第 3 種方法:用JS實現,加上一段js代碼后,所有插入的透明png自動透明了.(注意,這方法也是只對直接插入的圖片有效,對背景圖無效)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無標題文檔</title>
<script language="JavaScript">
function correctPNG() // correctly handle PNG transparency in Win IE 5.5 & 6.
{
    var arVersion = navigator.appVersion.split("MSIE")
    var version = parseFloat(arVersion[1])
    if ((version >= 5.5) && (document.body.filters))
    {
       for(var j=0; j<document.images.length; j++)
       {
          var img = document.images[j]
          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
             j = j-1
          }
       }
    }   
}
window.attachEvent("onload", correctPNG);
</script>
<style type="text/css">
<!--
body {
background-color: #9999CC;
}
-->
</style></head>

<body>
把圖片換成你自己的圖片
<img src="img/icon_face_03.png" width="30" height="30" /><!--把圖片換成你自己的圖片 -->
<img src="img/icon_face_05.png" width="30" height="30" />
<img src="img/menu_title_over.png" width="130" height="36" />
</body>
</html>

 
 


免責聲明!

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



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