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 相关文章推荐
基于jQuery图片平滑连续滚动插件
Apr 27 Javascript
前端开发必须知道的JS之原型和继承
Jul 06 Javascript
JS target与currentTarget区别说明
Aug 28 Javascript
javascript制作2048游戏
Mar 30 Javascript
JS实现消息来时让网页标题闪动效果的方法
Apr 20 Javascript
node.js从数据库获取数据
May 08 Javascript
KnockoutJs快速入门教程
May 16 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
Jun 13 Javascript
清空元素html(&quot;&quot;) innerHTML=&quot;&quot; 与 empty()的区别和应用(推荐)
Aug 14 Javascript
记一次webpack3升级webpack4的踩坑经历
Jun 12 Javascript
vue中 数字相加为字串转化为数值的例子
Nov 07 Javascript
详解ES6 CLASS在微信小程序中的应用实例
Apr 24 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
[转帖]PHP世纪万年历
2006/12/06 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
php中session退出登陆问题
2014/02/27 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
php源码的使用方法讲解
2019/09/26 PHP
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
2016/04/26 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
2017/08/28 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
jQuery实现可编辑的表格
2019/12/11 jQuery
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
简单介绍Python中的struct模块
2015/04/28 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python中正则表达式详解
2017/05/17 Python
Python实现个人微信号自动监控告警的示例
2019/07/03 Python
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
区域总监的岗位职责
2013/11/21 职场文书
员工拓展培训方案
2014/02/15 职场文书
四下基层实施方案
2014/03/28 职场文书
五好关工委申报材料
2014/05/31 职场文书
农业项目合作意向书
2015/05/08 职场文书
iPhone13再次曝光
2021/04/15 数码科技
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB
详解Python中*args和**kwargs的使用
2022/04/07 Python
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers