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 相关文章推荐
总结AJAX相关JS代码片段和浏览器模型
Aug 15 Javascript
jquery实现div拖拽宽度示例代码
Jul 31 Javascript
jquery控制display属性为none或block
Mar 31 Javascript
基于Arcgis for javascript实现百度地图ABCD marker的效果
Sep 12 Javascript
JavaScript 函数模式详解及示例
Sep 07 Javascript
Node.js Sequelize如何实现数据库的读写分离
Oct 23 Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 Javascript
小试SVG之新手小白入门教程
Jan 08 Javascript
Vue响应式原理Observer、Dep、Watcher理解
Jun 06 Javascript
微信小程序全局变量的设置、使用、修改过程解析
Sep 24 Javascript
JavaScript动画实例之粒子文本的实现方法详解
Jul 28 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网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
js分页代码分享
2014/04/28 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
基于JavaScript实现熔岩灯效果导航菜单
2017/01/04 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
浅析Python多线程下的变量问题
2015/04/28 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
统计员岗位职责
2013/11/14 职场文书
社区健康教育实施方案
2014/03/18 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
企业金融服务方案
2014/06/03 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python