下面小编就为大家带来一篇js获取隐藏元素宽高的实现方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。
网上有一些js获取隐藏元素宽高的方法,但是可能会存在某些情况获取不了。 例如:
<!DOCTYPE html> <html lang=\ <head>
<meta http-equiv=\ <title>test</title> </head> <body>
<div id=\
我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </div>
<div id=\ <div style=\ <div id=\
我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </div> </div> </div>
<div id=\ <div>
<div id=\
我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </div> </div> </div> </div> </body> </html>
test获取得了,但是test2_child是获取不到的。鉴于这种情况,于是自己写了一个方法解决。
解决思路:
1. 获取元素(拿宽高那个)所有隐藏的祖先元素直到body元素,包括自己。 2. 获取所有隐藏元素的style的display、visibility 属性,保存下来。
3. 设置所有隐藏元素为 visibility:hidden;display:block !important;(之所以要important是避免优先级不够)。
4. 获取元素(拿宽高那个)的宽高。
5. 恢复所有隐藏元素的style的display、visibility 属性。 6. 返回元素宽高值。 代码实现:
function getSize(id){ var width, height,
elem = document.getElementById(id), noneNodes = [], nodeStyle = [];
getNoneNode(elem); //获取多层display:none;的元素 setNodeStyle();
width = elem.clientWidth; height = elem.clientHeight; resumeNodeStyle(); return {
width : width, height : height }
function getNoneNode(node){
var display = getStyles(node).getPropertyValue('display'), tagName = node.nodeName.toLowerCase(); if(display != 'none'
&& tagName != 'body'){ getNoneNode(node.parentNode); } else {
noneNodes.push(node); if(tagName != 'body')
getNoneNode(node.parentNode); } }
//这方法才能获取最终是否有display属性设置,不能style.display。 function getStyles(elem) {
// Support: IE<=11+, Firefox<=30+ (#15098, #14150) // IE throws on elements created in popups
// FF meanwhile throws on frame elements through \
var view = elem.ownerDocument.defaultView; if (!view || !view.opener) { view = window; }
return view.getComputedStyle(elem); };
function setNodeStyle(){ var i = 0;
for(; i < noneNodes.length; i++){
var visibility = noneNodes[i].style.visibility, display = noneNodes[i].style.display,
style = noneNodes[i].getAttribute(\ //覆盖其他display样式 noneNodes[i].setAttribute(\\ nodeStyle[i] = {
visibility :visibility, display : display }
} }
function resumeNodeStyle(){ var i = 0;
for(; i < noneNodes.length; i++){
noneNodes[i].style.visibility = nodeStyle[i].visibility; noneNodes[i].style.display = nodeStyle[i].display; } } }
例子演示:
var testSize = getSize('test');
console.log(\ var test2ChildSize2 = getSize('test2_child');
console.log(\width:\+ test2ChildSize2.width + \height:\+ test2ChildSize2.height);
var test3ChildSize = getSize('test3_child');
console.log(\width:\+ test3ChildSize.width + \height:\+ test3ChildSize.height); //打印值如下
test-> width:417 height:18
test2Child2-> width:417 height:18 test3_child-> width:417 height:18 注意事项:
1. 打开显示所有隐藏祖先元素,然后获取元素的宽高值,可能在某些情况下获取值是不正确的。
PS:不过这个不用担心,真正出错时再hack方法就行。
2. 之所以要保存隐藏祖先元素display、visibility 属性,是为了后面可以设置回来,不影响其本身。
3. 另外getStyles方法是从jquery源码中摘取出来,这方法才能获取最终是否有display属性设置。
PS:不能从style.display获取。
以上这篇js获取隐藏元素宽高的实现方法就是小编分享给大家的全部内容了,希望能
给大家一个参考