IE浏览器下PNG相关功能

   本文给大家汇总了一下png在IE浏览器下出现的各种问题的解决方法,十分的实用,有需要的小伙伴可以参考下。

  目前互联网对于网页效果要求越来越高,不可避免的用到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动画透明效果时出现黑边的问题,有代码有真像,如下:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

<script>
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);
}
</script>

  在页面的/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进行位置或透明度的相关操作,例:

  ?

1
2
3
4

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

  还有一种情况是,我对这个图片除了要做透明和位移,还要改变其宽度和高度,对于这种情况,我建议采用以下方法:

  ?

1
2
3
4

<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的透明信息没了!变成了非常难看的黑色!

  IE7和IE8下png图片背景变黑的bug解决方案:

  1、不要直接改变图片的透明度,而是给图片套个容器,去修改这个容器的透明度

  比如原代码是:

  修改成:


 

  2、给这个容器加个背景颜色

  非常重要,解决bug的关键就在这一步,比如:

  ?

1
2
3
4
5
6
7

.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就解决了,如果还是有问题,请看下面:

  3、给容器加个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没什么副作用)

  以上所述就是本文的全部内容了,希望大家能够喜欢。

时间: 2024-08-04 06:04:21

IE浏览器下PNG相关功能的相关文章

IE浏览器下PNG相关功能_javascript技巧

目前互联网对于网页效果要求越来越高,不可避免的用到PNG图片,PNG分为几种格 式,PNG8 PNG24 PNG32,其中最常用的,也是显示效果和大小比较适中的则是PNG24,支持半透明,透明,颜色也非常丰富,但由于咱们国人使用IE系列或以IE为内核系列的浏览器占大多数,并且由于 WINDOWS XP在国内市场份额比较大,并且XP上好多人还在用IE6 IE7 IE8等浏览器,而这些浏览器对于PNG支持或多或少都有差距,IE6完全不支持PNG,IE7 IE8支持PNG不完全,在IE7 IE8下面对

360浏览器下加入收藏夹功能失效的问题

  测试同学那边提交了一个bug,是360浏览器下无法使用加入收藏夹功能.我简单的看了下,在ie浏览器下,加入收藏夹的功能是正常的,而360显然用的是ie内核,理论上没理由不行的. 不过还是下载了360自己试了一下,没想到真的不行.. 于是开始了这次的调式: 首先上测试代码 事实证明,360使用的ie的内核,但是也确实没有得到预想的效果. 由于在360下,即时有错也看不到错误提示,所以简单的判断就是,window.external.AddFavorite这里是不是有问题呢. alert(wind

Ajax请求过程中下载文件在FireFox(火狐)浏览器下的兼容问题_AJAX相关

需求很简单,点击一个文件链接下载该文件,同时向后台发送请求.需求很常见,用户点击下载后通常要进行下载量的统计,统计的话可以利用 script标签 或者 img标签(图片ping) 的跨域能力,将它们的 src 属性指向统计地址,但是这次用了 ajax 进行统计,遂出现了这个问题. demo 代码如下: <a id="a" href="http://c758482.r82.cf2.rackcdn.com/Sublime Text 2.0.2 x64 Setup.exe&q

各浏览器下字体排版一致的问题

  我们知道同一种字体在不同浏览器上的表现有可能是不同的,除了浏览器,还有哪些导致表现不同的因素呢?不同系统下字形的渲染也是不一样的,根本原因是什么呢?我们希望各浏览器下字体排版一致,实现的话有完美的方案吗? 带着这些问题我们来看看字体渲染的过程: 解码 了解解码之前,我们稍微先简单回顾下编码的一些知识,常见的名词有:ASCII .GB2312.Big5.Unicode.UTF-8,它们之前有什么区别或联系呢?简单来说,起初美国国家标准协会ANSI制定了一个标准,规定了常 用字符的集合以及每个字

JS+CSS实现模仿浏览器网页字符查找功能的方法

 这篇文章主要介绍了JS+CSS实现模仿浏览器网页字符查找功能的方法,实例分析了javascript实现查找功能的样式及相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JS+CSS实现模仿浏览器网页字符查找功能的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <html> <head> <title>JS+CSS模仿的网页字符查找功能</title> <style type=text/css> BODY

Android仿UC浏览器左右上下滚动功能_Android

本文要解决在侧滑菜单右边加个文本框,并能实现文本的上下滑动和菜单的左右滚动.这里推荐可以好好看看android的触摸事件的分发机制,这里我就不详细讲了,我只讲讲这个应用.要实现的功能就像UC浏览器(或其它手机浏览器)的左右滚动,切换网页,上下滚动,拖动内容. 本文的效果:   一.功能要求与实现1.功能要求:(1)手指一开始按着屏幕左右移动时,只能左右滚动菜单,如果这时手指一直按着,而且上下移动了,那么菜单显示部分保持不变,但文本框也不上下移动!                       (2

jquery 实现输入邮箱时自动补全下拉提示功能_javascript技巧

记得去年做某个项目的时候,用到了邮箱输入自动提示功能,于是网上搜了一下,发现了这个写得不错,现在回想起来,转载一下,方便查阅. 邮箱的广泛使用得益于它的免费,因此很多网站在注册的时候都会直接使用邮箱作为账号名 为了提高用户的体验,很多网站都会实现邮箱输入的自动提示功能. 实现效果如图所示: 核心代码(需要jquery的支持): (function($){ $.fn.mailAutoComplete = function(options){ var defaults = { boxClass: "

三星Note5如何使用浏览器的网络搜索功能?(N9200)

1.在待机页面下,点击[互联网].    2.打开某个网页.    3.以长按网页上的内容“Note5”为例,可以看到弹出一个选项列表,包括全选.复制.共享等六个功能.      4.点击[网络搜索],则可以在网页上搜索有关“Note5”的相关信息.        以上就是我们给各位总结了Note5使用浏览器的网络搜索功能?(N9200)的方法了,过程操作都是非常的人性化并且简单的.  

setTimeout与setInterval在不同浏览器下的差异

setTimeout与setInterval是window对象的两个非常神奇方法,用于实现定时 或延时调用一个函数或一段代码. (新手可能认为setTimeout与setInterval是javascript函数,这是错误的. 新手容易将javascript对象函数与DOM对象方法混淆.) 先来一段代码,大家猜猜在各种浏览器下的结果会是怎么样的呢? function f(){ var s = 'arguments.length:'+arguments.length+'; '; for(var i