百度空间 | 百度首页 
 
查看文章
 
display:none 与 visibility:hidden 的理解(如何获取display:none的元素大小)
2009年06月11日 星期四 下午 12:46
起初对于Display和visibility区别只是知道在于是否占据物理空间,没有很深刻的理解,直到遇到一个问题,才明白了这占据物理空间的意义。

先看区别:
display:none
CSS1   隐藏对象。与 visibility 属性的hidden值不同,其不为被隐藏的对象保留其物理空间

visibility:hidden
对象隐藏,与 display 属性不同,此属性为隐藏的对象保留其占据的物理空间。

下面引入问题:如果想要获得被指定了display=‘none’元素或者其子元素的大小,由于其不占据物理空间,因此除非指定了特定的大小,否则都不能正常获得。

当然也不是没有办法获得,可以采用如下方法:

通过元素的clientHeight属性能够得到元素的高度,如:
var height = element.clientHeight;

这种做法的局限:
1. 如果元素的display属性设置为none, 那么得到的结果为0
2. 在safari浏览器中,需要使用:element.offsetHeight得到实际高度,这是safari浏览器的bug

下面是Prototype提供的方法,能够兼容各种浏览器,同时在元素隐藏的情况下也能正确得到元素尺寸,供参考:

getDimensions: function(element) {
    element = $(element);
    var display = $(element).getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
}

因此可以通过visibility:hidden;position:absolute;来模拟display:none

虽然解决了问题,但是却不完美,如果当前页面嵌在iframe下而此iframe又被包裹在display=‘none’的div中(或者说是当外层有更多的display=‘none’的元素包裹时),就不太好解决了。

如:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<div style="display:none;">
<IFRAME class="diviframe" id="iframeID_0" src="Noname4.html" frameBorder=0 width="100%" height="100%"></IFRAME>
</div>
<div style="visibility:hidden;">
<IFRAME class="diviframe" id="iframeID_1" src="Noname4.html" frameBorder=0 width="100%" height="100%"></IFRAME>
</div>
</BODY>
</HTML>

Noname4.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<script>
window.attachEvent("onload",function(){
alert(
document.getElementById("selectID").currentStyle['width']
);
alert(
document.getElementById("selectID").style.width
);
alert(
document.getElementById("selectID").offsetWidth
);
alert(
getDimensions(document.getElementById("selectID")).width
);
})


var getDimensions=function(element) {
    //var display = element.style.display;
    //if (display != 'none' && display != null) // Safari bug
    // return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
}
</script>
<BODY>
    <select name="selectName" id="selectID" style="visibility:hidden">
    <option value="测试数据A">测试数据A</option>
    <option value="测试数据BB">测试数据BB</option>
    <option value="测试数据CCC">测试数据CCC</option>
    <option value="其它">其它</option>
</select>asdfsadf
</BODY>
</HTML>
不知道大家有什么好的办法?

类别:Js Oo | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu