js获取隐藏元素宽高的实现方法
网上有一些js获取隐藏元素宽高的方法,但是可能会存在某些情况获取不了。
例如:
<!DOCTYPEhtml> <htmllang="en"> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/> <title>test</title> </head> <body> <divid="test"style="display:none"> 我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </div> <divid="test2"style="display:none"> <divstyle="display:none"> <divid="test2_child"> 我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </div> </div> </div> <divid="test3"> <div> <divid="test3_child"> 我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。 </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.返回元素宽高值。
代码实现:
functiongetSize(id){ varwidth, height, elem=document.getElementById(id), noneNodes=[], nodeStyle=[]; getNoneNode(elem);//获取多层display:none;的元素 setNodeStyle(); width=elem.clientWidth; height=elem.clientHeight; resumeNodeStyle(); return{ width:width, height:height } functiongetNoneNode(node){ vardisplay=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。 functiongetStyles(elem){ //Support:IE<=11+,Firefox<=30+(#15098,#14150) //IEthrowsonelementscreatedinpopups //FFmeanwhilethrowsonframeelementsthrough"defaultView.getComputedStyle" varview=elem.ownerDocument.defaultView; if(!view||!view.opener){ view=window; } returnview.getComputedStyle(elem); }; functionsetNodeStyle(){ vari=0; for(;i<noneNodes.length;i++){ varvisibility=noneNodes[i].style.visibility, display=noneNodes[i].style.display, style=noneNodes[i].getAttribute("style"); //覆盖其他display样式 noneNodes[i].setAttribute("style","visibility:hidden;display:block!important;"+style); nodeStyle[i]={ visibility:visibility, display:display } } } functionresumeNodeStyle(){ vari=0; for(;i<noneNodes.length;i++){ noneNodes[i].style.visibility=nodeStyle[i].visibility; noneNodes[i].style.display=nodeStyle[i].display; } } }
例子演示:
vartestSize=getSize('test'); console.log("test->width:"+testSize.width+"height:"+testSize.height); vartest2ChildSize2=getSize('test2_child'); console.log("test2Child2->width:"+test2ChildSize2.width+"height:"+test2ChildSize2.height); vartest3ChildSize=getSize('test3_child'); console.log("test3_child->width:"+test3ChildSize.width+"height:"+test3ChildSize.height); //打印值如下 test->width:417height:18 test2Child2->width:417height:18 test3_child->width:417height:18
注意事项:
1.打开显示所有隐藏祖先元素,然后获取元素的宽高值,可能在某些情况下获取值是不正确的。
PS:不过这个不用担心,真正出错时再hack方法就行。
2.之所以要保存隐藏祖先元素display、visibility属性,是为了后面可以设置回来,不影响其本身。
3.另外getStyles方法是从jquery源码中摘取出来,这方法才能获取最终是否有display属性设置。
PS:不能从style.display获取。
以上这篇js获取隐藏元素宽高的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。