以前在做动画脚本的时候,遇到过这样的一个问题:当DOM元素display:none;之后,你将得不到它的实际高度和宽度。这个在fadein等类似效果的时候就有些问题了。这个问题困扰了一些时间,最后觉得还是元素隐藏导致的结果,因此采用了这样的方法:将隐藏的元素的display暂时设置为block,获取到真实的高度和宽度之后,再还原隐藏元素。下面是我封装好的获取元素的真实高度和宽度的对象:
[javascript]
var Style = {
//获取元素最终的样式
getFinalStyle: function(elem, css){
if (window.getComputedStyle) {
return window.getComputedStyle(elem, null)[css];
} else if (elem.currentStyle) {
return elem.currentStyle[css];
} else {
return elem.style[css];
}
},
height: function(elem){
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;
}
}
};
//Usage:
onload = function(){
alert(Style.height(document.getElementById("div")));
}
[/javascript]
不错,不过会不会获取高度的时候导致元素闪烁一下?
这个瞬间的操作,我们视觉效果应该感知不到的了
为什么不采用另外的方式,clonenode 这个dom 对象, 将visibility:visible;display:block; 然后给予position;absolute,将他定位到负的左上角去. 这样可以得到真实的dom的宽,和高, 然后再删除这个复制的 dom对象,即可. 可以解决屏幕的闪动问题.
哦,还没试过,有时间试试,呵呵。
多谢多谢~