西红柿爱番茄

Feed Rss

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

01.06.2010, Javascript, by .

今天在写一个跨浏览器的setOpacity设置HTML元素的透明度函数的时候,函数代码如下:
[javascript]
var setOpacity = function(elem, l){
if (elem.filters) {
elem.style.filter ="alpha(opacity="+l+")";
} else {
elem.style.opacity = l / 100;
}
}

//Example:
onload=function(){
setOpacity(document.getElementById("div"),20);
}
[/javascript]
发现在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的两个方法:
[javascript]
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;
}
}
}
[/javascript]
通过上面Style对象的height和width就可以获取任何HTML元素的height和width。这样就可以在IE下在给元素设置透明度之前,获得它的width和height并赋值给它的style.height或者style.width:
[javascript]
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;
}
}
[/javascript]
利用上面修改过后的方法,在IE6,IE7下运行正常了,问题得到了解决。不过值得说明的是,这个问题在IE8版本中似乎得到了修正,没有显示声明width或者height也都可以设置透明度,这是件好事。

IE6,IE7下设置透明度Opacity的Bug 有 3 条回应

  1. 这个问题不需要这么麻烦来解决,ie6,7下是因为haslayout的原因,
    给元素声明width和height也是为了触发haslayout属性,更简单的办法就是直接用js给它设置zoom:1;即可,而且没有任何副作用。

    var setOpacity = function(elem, l){
    if (elem.filters) {
    elem.style.filter =”alpha(opacity=”+l+”)”;
    elem.style.zoom =1;
    } else {
    elem.style.opacity = l / 100;
    }
    }

  2. 2010-01-07 在 09:39 Supersha

    @番茄, Good!!学到一招……

  3. 2011-03-03 在 15:48 喔喔兒

    不知道1.5修复了没,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>