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 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
改版了网上的一个js操作userdata
Apr 27 Javascript
javascript实现仿银行密码输入框效果的代码
Dec 13 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
Mar 18 Javascript
终于解决了IE8不支持数组的indexOf方法
Apr 03 Javascript
Jquery取得iframe下内容的方法
Nov 18 Javascript
Javascript判断图片尺寸大小实例分析
Jun 16 Javascript
vue.js指令v-model实现方法
Dec 05 Javascript
微信小程序 Animation实现图片旋转动画示例
Aug 22 Javascript
微信小程序视图容器(swiper)组件创建轮播图
Jun 19 Javascript
vue.js中导出Excel表格的案例分析
Jun 11 Javascript
jQuery实现验证用户登录
Dec 10 jQuery
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 Ajax乱码
2008/04/09 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
js 图片等比例缩放代码
2010/05/13 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
jQuery实现图片轮播效果代码
2016/09/27 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
python中的set实现不重复的排序原理
2018/01/24 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
2018/10/16 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
python支持多线程的爬虫实例
2019/12/21 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
顶碗少年教学反思
2014/02/21 职场文书
环保小标语
2014/06/13 职场文书
食品安全汇报材料
2014/08/18 职场文书
初级党校心得体会
2014/09/11 职场文书
民政工作个人总结
2015/02/28 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
Python实现老照片修复之上色小技巧
2021/10/16 Python