ie8下jquery改變PNG的opacity出現黑邊,ie6下png透明解決辦法

目前互聯網對於網頁效果要求愈來愈高,不可避免的用到PNG圖片,PNG分爲幾種格 式,PNG8 PNG24 PNG32,其中最經常使用的,也是顯示效果和大小比較適中的則是PNG24,支持半透明,透明,顏色也很是豐富,但因爲我們國人使用IE系列或以IE爲內核系列的瀏覽器佔大多數,而且因爲 WINDOWS XP在國內市場份額比較大,而且XP上好多人還在用IE6 IE7 IE8等瀏覽器,而這些瀏覽器對於PNG支持或多或少都有差距,IE6徹底不支持PNG,IE7 IE8支持PNG不徹底,在IE7 IE8下面對圖片改變透明圖的時候,延PNG透明區域的地方會有一條黑色的邊框,若是有半透明的,則整個半透明區域都是黑色,這點對於要求美觀的頁面是不能接受的,研究了下,發現把PNG當背景,用微軟特有的濾鏡加載圖片,能夠解決IE6不支持PNG的問題,而且也能夠解決IE7和IE8下面使用JQUERY動畫透明效果時出現黑邊的問題,有代碼有真像,以下:javascript

function correctPNG() {
    var arVersion = navigator.appVersion.split("MSIE")
    var version = parseFloat(arVersion[1])
    if ((version >= 5.5) && (document.body.filters)) {
        var lee_i = 0;
        var docimgs=document.images;
        for (var j = 0; j < docimgs.length; j++) {
            var img = docimgs[j]
            var imgName = img.src.toUpperCase();
            if (imgName.substring(imgName.length - 3, imgName.length) == "PNG" && !img.getAttribute("usemap")) {
                lee_i++;
                var SpanID = img.id || 'ra_png_' + lee_i.toString();
                var imgData = new Image();
                imgData.proData = SpanID;
                imgData.onload = function () {
                    $("#" + this.proData).css("width", this.width + "px").css("height", this.height + "px");
                }
                imgData.src = img.src;
                var imgID = "id='" + SpanID + "' ";
                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;
            }
        }
    }
}
//判斷是否爲IE8及如下瀏覽器,其實除了這三個瀏覽器不支持addEventListener,其它瀏覽器都沒問題
if (typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined") {
    window.attachEvent("onload", correctPNG);
}

在頁面的/body的結束標記以前先引用jquery1.8類庫,再加入以上代碼,IE6 7 8 顯示PNG24都沒有問題了,若是須要執行animate動畫或獲取圖片時,發如今ie 6 7 8下找不到PNG圖片了,或找到了改變其位置和透明圖沒有反應,這緣由是correctPNG將頁面上全部的PNG的IMG標籤都替換成了SPAN標籤,而後在SPAN標籤上使用filter: progid:DXImageTransform.Microsoft.AlphaImageLoader 將PNG圖片加載進來,因此,建議作法是在將圖片用DIV包括起來,此DIV中只容許有一個IMG標籤,而後對DIV進行位置或透明度的相關操做,例:css

<div id='test'><img src='xxxx.png'/></div>
<script>
$("#test").animate({opacity:0.2,marginLeft:500},1000,function(){alert('run complete');});
</script>

還有一種狀況是,我對這個圖片除了要作透明和位移,還要改變其寬度和高度,對於這種狀況,我建議採用如下方法:java

<div id='test'><img src='xxxx.png'/></div>
<script>
$($("#test span")[0]||$("#test img")[0]).animate({opacity:0.2,marginLeft:500,width:'500px',height:'500px'},1000,function(){alert('run complete');});
</script>

BUG:在IE7和IE8下若是你動態修改png圖片的透明度,好比說你應用一個fadeIn,將圖片的透明度調到25%,這時候就會出現很是詭異的bug,png的透明信息沒了!變成了很是難看的黑色!jquery

IE7和IE8下png圖片背景變黑的bug解決方案:

一、不要直接改變圖片的透明度,而是給圖片套個容器,去修改這個容器的透明度

好比原代碼是:<img src="style/images/icon-shadow.png" class="share-list-icon-shadow"  />瀏覽器

修改爲:<div class="share-list-icon-shadow"><img src="style/images/icon-shadow.png" /></div>app

二、給這個容器加個背景顏色

很是重要,解決bug的關鍵就在這一步,好比:動畫

.share-list-icon-shadow{ 
    width:60px;height:21px; 
    position:absolute;bottom:8px;left:0px;z-index: 1; 
    margin: 0 auto; 
    display:block; 
    background:#FAFDEF; 
} 

通常狀況下,到此bug就解決了,若是仍是有問題,請看下面:this

三、給容器加個zoom: 1

zoom: 1起到什麼做用呢?爲何IE會存在這個bug呢?

這是二個問題,實際上是一個答案。 IE修改透明度,不是經過css屬性,而是經過filter濾鏡,因此想要理解這個bug,就要從filter濾鏡上找緣由。 filter做用於一個對象時,這個對象必須是有形體,也就是必須是layout,而IE存在一個很特殊的屬性:hasLayout ,這個屬性能夠賦予容器成layout,hasLayout這個屬性有些詭異,你沒法經過直接寫css啓動,而必須經過javascript啓動,其實還有一種方法能夠啓動,就是使用特殊的css屬性,變相將hasLayout啓動,這個css屬性就是 zoom(其餘的屬性好比display:inline-block、float:left等也行,而只有zoom沒什麼反作用)spa

相關文章
相關標籤/搜索