js获取隐藏元素宽高的实现方法


Posted in Javascript onMay 19, 2016

网上有一些js获取隐藏元素宽高的方法,但是可能会存在某些情况获取不了。

例如:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  <title>test</title>
</head>
<body>
<div id="test" style="display:none">
   我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。
</div>
<div id="test2" style="display:none">
   <div style="display:none">
     <div id="test2_child">
        我有一壶酒,足以慰风尘。尽倾江海里,赠饮天下人。
     </div>
   </div>
</div>
<div id="test3">
   <div>
     <div id="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. 返回元素宽高值。

代码实现:

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 "defaultView.getComputedStyle"
     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("style");
        //覆盖其他display样式
        noneNodes[i].setAttribute("style", "visibility:hidden;display:block !important;" + style);
        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("test-> width:" + testSize.width + " height:" + testSize.height);

var test2ChildSize2 = getSize('test2_child');
console.log("test2Child2-> width:" + test2ChildSize2.width + " height:" + test2ChildSize2.height);

var test3ChildSize = getSize('test3_child');
console.log("test3_child-> 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获取隐藏元素宽高的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript倒计时代码
Aug 12 Javascript
Javascript中匿名函数的多种调用方式总结
Dec 06 Javascript
微信小程序 教程之列表渲染
Oct 18 Javascript
COM组件中调用JavaScript函数详解及实例
Feb 23 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
Apr 28 Javascript
Vue组件之自定义事件的功能图解
Feb 01 Javascript
vue.js实现的经典计算器/科学计算器功能示例
Jul 11 Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
Jul 22 jQuery
vue使用recorder.js实现录音功能
Nov 22 Javascript
小程序中设置缓存过期的实现方法
Jan 14 Javascript
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
Apr 09 Javascript
jquery实现无刷新验证码的简单实例
May 19 #Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 #Javascript
JavaScript:Array类型全面解析
May 19 #Javascript
JavaScript:Date类型全面解析
May 19 #Javascript
javascript中对Date类型的常用操作小结
May 19 #Javascript
JS Attribute属性操作详解
May 19 #Javascript
jQuery点击输入框显示验证码图片
May 19 #Javascript
You might like
如何分别全角和半角以避免乱码
2006/10/09 PHP
PHP5 的对象赋值机制介绍
2011/08/02 PHP
CI框架表单验证实例详解
2016/11/21 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
js变换显示图片的实例
2013/04/16 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
图解JavaScript中的this关键字
2020/05/28 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
python并发和异步编程实例
2018/11/15 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
使用CSS3实现字体颜色渐变的实现
2020/08/10 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
教育项目合作协议书格式
2014/10/17 职场文书
活动总结书怎么写
2015/05/11 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书