IE8下jQuery改变png图片透明度时出现的黑边


Posted in Javascript onAugust 30, 2015

png24格式的图片在用jQuery添加显示隐藏动画时发现,图片的半透明区域出现黑边?

IE8下jQuery改变png图片透明度时出现的黑边

在网上搜了搜主要有以下几种办法:

1、把图片保存成PNG-8格式。

2、把背景色一起切入并保存为JPG格式。

以上两种方法我试了试,好像效果并不好png8格式仍就会有黑边。

解决方法:

1、不要直接改变图片的透明度,而是给图片套个容器,去修改这个容器的透明度
2、给这个容器加个颜色相近的背景颜色(非常重要,解决bug的关键就在这一步,)
一般情况下,到此bug就解决了,如果还是有问题,请看下面:

3、给容器加个zoom: 1
(个人觉得这种办法只不过是一个障眼法,没有从根本上解决问题,看来目前只能这样了,期待有更好的方法)

目前互联网对于网页效果要求越来越高,不可避免的用到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代码

<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>

有问题欢迎共同探讨

Javascript 相关文章推荐
js tab 选项卡
Apr 26 Javascript
jQuery DOM操作小结与实例
Jan 07 Javascript
30个最佳jQuery Lightbox效果插件分享
Apr 11 Javascript
基于jquery的代码显示区域自动拉长效果
Dec 07 Javascript
jquery进行数组遍历如何跳出当前的each循环
Jun 05 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
AngularJS基础 ng-if 指令用法
Aug 01 Javascript
js正则表达式校验指定字符串的方法
Jul 23 Javascript
关于AOP在JS中的实现与应用详解
May 06 Javascript
jQuery弹框插件使用方法详解
May 26 jQuery
javascript canvas封装动态时钟
Sep 30 Javascript
Javascript执行上下文顺序的深入讲解
Nov 04 Javascript
javascript中sort() 方法使用详解
Aug 30 #Javascript
javascript中的正则表达式使用详解
Aug 30 #Javascript
jQuery鼠标事件汇总
Aug 30 #Javascript
简单谈谈javascript中的变量、作用域和内存问题
Aug 30 #Javascript
jquery专业的导航菜单特效代码分享
Aug 29 #Javascript
js实现基于正则表达式的轻量提示插件
Aug 29 #Javascript
js精美的幻灯片画集特效代码分享
Aug 29 #Javascript
You might like
PHP判断图片格式的七种方法小结
2013/06/03 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
小程序实现多列选择器
2019/02/15 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
Django contenttypes 框架详解(小结)
2018/08/13 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
python与idea的集成的实现
2020/11/20 Python
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
仓库班组长岗位职责
2013/12/12 职场文书
爱与责任演讲稿
2014/05/20 职场文书
五四青年节演讲稿
2014/05/26 职场文书
教师节领导致辞
2015/07/29 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
Golang实现AES对称加密的过程详解
2021/05/20 Golang
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
Python如何将list中的string转换为int
2022/07/15 Ruby