IE6,IE7下设置透明度Opacity的Bug

IE6,IE7下设置透明度Opacity的Bug

时间:发生在 2010年01月6日 的那天 去打手印哦 (3)

今天在写一个跨浏览器的setOpacity设置HTML元素的透明度函数的时候,函数代码如下:

var setOpacity = function(elem, l){
   if (elem.filters) {
    elem.style.filter = "alpha(opacity="+l+ ")";
  } else {
    elem.style.opacity = l / 100;
  }
}
//Example:
οnlοad= function(){
  setOpacity(document. getElementById( "div"),20);
}

发现在IE6,IE7下总是没有效果,郁闷了一些时间,后来经过测试,无意中设置了元素的width和height样式,IE6,IE7出来效果 了。惊奇了一下,之后又测试了只声明width或者只声明height的情况下,也有效果。现在发现问题了,可能是IE6、7下的Bug,也或者 Microsoft有意这样设置。
问题找到了也就好对症下药了,可以按照这样的思路来解决这个问题:第一是根据需要在css里声明width或者 height;第二是在Javascript里动态获取HTML元素潜在的width或者height,重新给它的width或者height赋值,这样 就相当于“显示”声明了它的width或者height。下面是获取HTML元素潜在width和height的两个方法:

var Style = {
   //获取HTML元素最终样式的辅助函数
  getFinalStyle: function(elem, css){
     if (window.getComputedStyle) { //W3C
       return window.getComputedStyle(elem, null)[css];
    } else if (elem.currentStyle) { //IE
       return elem.currentStyle[css];
    } else {
       return elem.style[css];
    }
  },
  height: function(elem){
     //首先检查HTML元素是否隐藏,因为display='none'的元素是获取不到高度和宽度的
     if ( this.getFinalStyle(elem, "display") !== "none") {
       return elem.offsetHeight || elem.clientHeight;
    } else {
       //获取隐藏掉的函数的高度,先让它显示,获取到高度之后再隐藏,下同
      elem.style.display = "block";
       var h = elem.offsetHeight || elem.clientHeight;
      elem.style.display = "none";
       return h;
    }
  },
  width: function(elem){
     if ( this.getFinalStyle(elem, "display") !== "none") {
       return elem.offsetWidth || elem.clientWidth;
    } else {
      elem.style.display = "block";
       var w = elem.offsetWidth || elem.clientWidth;
      elem.style.display = "none";
       return w;
    }
  }
}

通过上面Style对象的height和width就可以获取任何HTML元素的height和width。这样就可以在IE下在给元素设置透明度之前,获得它的width和height并赋值给它的style.height或者style.width:

var setOpacity = function(elem, l){
   if (elem.filters) {
     //在IE下给elem的height重新赋值
    elem.style.height=Style.height(elem, "height")+ "px";
    elem.style.filter = "alpha(opacity="+l+ ")";
  } else {
    elem.style.opacity = l / 100;
  }
}

利用上面修改过后的方法,在IE6,IE7下运行正常了,问题得到了解决。不过值得说明的是,这个问题在IE8版本中似乎得到了修正,没有显示声明width或者height也都可以设置透明度,这是件好事。

转载于:https://www.cnblogs.com/xmyy/articles/2152242.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值