IE浏览器下PNG相关功能


Posted in Javascript onJuly 05, 2015

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

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

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

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

<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、不要直接改变图片的透明度,而是给图片套个容器,去修改这个容器的透明度
比如原代码是:<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>

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

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

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没什么副作用)

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

Javascript 相关文章推荐
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
JavaScript中获取元素索引的函数
Sep 10 Javascript
JavaScript去掉空格的方法集合
Dec 28 Javascript
js监听输入框值的即时变化onpropertychange、oninput
Jul 13 Javascript
js document.write()使用介绍
Feb 21 Javascript
JS实现转动随机数抽奖特效代码
Apr 16 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
Oct 13 Javascript
基于jquery实现轮播焦点图插件
Mar 31 Javascript
js实现各浏览器全屏代码实例
Jul 03 Javascript
angular中如何绑定iframe中src的方法
Feb 01 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
Oct 16 Javascript
React + Threejs + Swiper 实现全景图效果的完整代码
Jun 28 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 #Javascript
javascript实现控制的多级下拉菜单
Jul 05 #Javascript
javascript遇到html5的一些表单属性
Jul 05 #Javascript
浅谈angularJS 作用域
Jul 05 #Javascript
javascript 应用小技巧方法汇总
Jul 05 #Javascript
javascript常用功能汇总
Jul 05 #Javascript
最新最热最实用的15个jQuery插件汇总
Jul 05 #Javascript
You might like
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
合格的PHP程序员必备技能
2015/11/13 PHP
Smarty模板配置实例简析
2019/07/20 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
javascript中this做事件参数相关问题解答
2013/03/17 Javascript
js对象与打印对象分析比较
2013/04/23 Javascript
Jquery搜索父元素操作方法
2015/02/10 Javascript
C++中的string类的用法小结
2015/08/07 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
2017/03/01 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
JavaScript中关于base64的一些事
2019/05/06 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
python flask实现分页效果
2017/06/27 Python
python 读入多行数据的实例
2018/04/19 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
Python3使用Selenium获取session和token方法详解
2021/02/16 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
如何启动时不需输入用户名与密码
2014/05/09 面试题
管理科学大学生求职信
2013/11/13 职场文书
房地产员工找工作的自我评价
2013/11/15 职场文书
产品销售员岗位职责
2013/12/18 职场文书
应届毕业生求职信
2014/05/26 职场文书
优质服务口号
2014/06/11 职场文书
电子专业求职信
2014/06/19 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python