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 事件处理函数间的Event物件是否全等
Apr 08 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
Jan 29 Javascript
js控制表单奇偶行样式的简单方法
Jul 31 Javascript
js 绑定键盘鼠标事件示例代码
Feb 12 Javascript
javascript中Date()函数在各浏览器中的显示效果
Jun 18 Javascript
浅析Jquery操作select
Dec 13 Javascript
薪资那么高的Web前端必看书单
Oct 13 Javascript
Vue前端开发规范整理(推荐)
Apr 23 Javascript
JS中的JSON对象的定义和取值实现代码
May 09 Javascript
微信小程序canvas实现刮刮乐效果
Jul 09 Javascript
记录一次开发微信网页分享的步骤
May 07 Javascript
解决vue中provide inject的响应式监听
Apr 19 Vue.js
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 email邮箱正则
2008/10/08 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
写JQuery插件的基本知识
2013/11/25 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
Python pickle模块用法实例
2015/04/14 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
应届大学生求职信
2013/12/01 职场文书
电子商务个人自荐信
2013/12/12 职场文书
绿化工程实施方案
2014/03/17 职场文书
投资入股合作协议书
2014/10/28 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电