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 相关文章推荐
表单提交时自动复制内容到剪贴板的js代码
Mar 16 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
Jan 23 Javascript
javascript验证上传文件的类型限制必须为某些格式
Nov 14 Javascript
JS常用表单验证方法总结
May 22 Javascript
Javascript模块化编程详解
Dec 01 Javascript
实例详解jQuery结合GridView控件的使用方法
Jan 04 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
Jan 31 jQuery
在Vant的基础上实现添加表单验证框架的方法示例
Dec 05 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
React更新渲染原理深入分析
Dec 24 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
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
Javascript代码实现仿实例化类
2015/04/03 Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
2015/05/11 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
Python 绘图和可视化详细介绍
2017/02/11 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
Python定义一个函数的方法
2020/06/15 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
一套Java笔试题
2016/08/20 面试题
软件设计的目标是什么
2016/12/04 面试题
介绍下Lucene建立索引的过程
2016/03/02 面试题
大学生大二自我鉴定
2013/10/28 职场文书
广告宣传策划方案
2014/05/21 职场文书
企业安全生产标语
2014/06/06 职场文书
关爱留守儿童标语
2014/06/18 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python