javascript获取隐藏元素(display:none)的高度和宽度的方法


Posted in Javascript onJune 06, 2014

js获取可见元素的尺寸还是比较方便的,这个可以直接使用这个方法:

function getDefaultStyle(obj,attribute){ // 返回最终样式函数,兼容IE和DOM,设置参数:元素对象、样式特性
 return obj.currentStyle?obj.currentStyle[attribute]:document.defaultView.getComputedStyle(obj,false)[attribute];
}

但是如果这个元素是隐藏(display:none)的,尺寸又是未知自适应的,哪有上面的方法就不行了!因为display:none的元素是没有物理尺寸的! 悲剧就这样发生了!

幸好css中还有visibility:hidden,不可见属性,他和display:none最大的区别就是visibility:hidden有物理尺寸。有物理尺寸就可以通过上面的方法获取尺寸,但是将display:none改成visibility:hidden后页面就有一块空白在那里,即使在你获取尺寸后在马上将visibility:hidden改成display:none页面那部分还是会抖动一下。那么最好的办法就是将这个隐藏的元素移出屏幕或者脱离文档流( position: absolute)。这样似乎非常完美了,但是悲剧又发生了,如果你要再显示这个元素的时侯这个元素是不可见的,位置也不对,因为这是这个元素visibility:hidden;position: absolute。所以在获取尺寸后还要将样式还原回去。就是将position和visibility属性设回原来的样式。

这就是js获取隐藏元素的尺寸基本实现方式,大家有兴趣可以看看《精通javascript》这本书上的方法。

我这里也做了个简单的demo,大家可以看看源代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>js获取隐藏元素的尺寸</title>
<style type="text/css">
</style>
<script type="text/javascript" src="http://www.css88.com/tool/css3Preview/jquery-1.4.2.min.js"></script>
</head>
<body>
 <div id="test_display_block" style="display:none; border:10px solid #CDCDCD; margin-left: 100px">这是test容器,可见容器<br />这是test容器,可见容器<br />这是test容器,可见容器<br />这是test容器,可见容器<br />这是test容器,<br />这是test容器,<br />这是test容器,<br />这是test容器,<br />这是test容器,<br /></div>
 <div id="test_display_none" style="display:none; border:10px solid #CDCDCD">这是test容器,这是test容器,<br />这是test容器,<br />这是test容器,<br />这是test容器,<br />这是test容器,<br />这是test容器,<br /></div>
        <div id="test_display_click">点我</div>
        <script type="text/javascript">
            //判断对象类型
 function getType(o){
            var _t;
            return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase();
        }
        //获取元素样式
 function getStyle(el, styleName) {
            return el.style[styleName] ? el.style[styleName] : el.currentStyle ? el.currentStyle[styleName] : window.getComputedStyle(el, null)[styleName];
        }
 function getStyleNum(el, styleName) {
            return parseInt(getStyle(el, styleName).replace(/px|pt|em/ig,''));
        }
 function setStyle(el, obj){
  if (getType(obj) == "object") {
   for (s in obj) {
    var cssArrt = s.split("-");
    for (var i = 1; i < cssArrt.length; i++) {
     cssArrt[i] = cssArrt[i].replace(cssArrt[i].charAt(0), cssArrt[i].charAt(0).toUpperCase());
    }
    var cssArrtnew = cssArrt.join("");
    el.style[cssArrtnew] = obj[s];
   }
  }
  else 
   if (getType(obj) == "string") {
    el.style.cssText = obj;
   }
 }
 function getSize(el) {
        if (getStyle(el, "display") != "none") {
            return { width: el.offsetWidth || getStyleNum(el, "width"), height: el.offsetHeight || getStyleNum(el, "height") };
        }
        var _addCss = { display: "", position: "absolute", visibility: 'hidden' };
        var _oldCss = {};
        for (i in _addCss) {
            _oldCss[i] = getStyle(el, i);
        }
 setStyle(el, _addCss);
        var _width = el.clientWidth || getStyleNum(el, "width");
        var _height = el.clientHeight || getStyleNum(el, "height");
        for (i in _oldCss) {
            setStyle(el, _oldCss);
        }
        return { width: _width, height: _height };
    } 
var dd=document.getElementById("test_display_block");   
alert(getSize(dd).height); 
document.getElementById("test_display_click").onclick=function(){
 dd.style.display="block";
        document.getElementById("test_display_none").style.display="block";
}
alert($("#test_display_none").height());
 </script>
</body>
</html>

题外话:一般js的框架,库都已经封装了这个方法,比如jQ,我们可以直接使用 height()和width()方法获取隐藏元素的尺寸。

Javascript 相关文章推荐
JavaScript获取客户端计算机硬件及系统等信息的方法
Jan 02 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
Aug 11 Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 Javascript
jQuery实现基本动画效果的方法详解
Sep 06 jQuery
js图片查看器插件用法示例
Jun 22 Javascript
node静态服务器实现静态读取文件或文件夹
Dec 03 Javascript
js键盘事件实现人物的行走
Jan 17 Javascript
vue 实现把路由单独分离出来
Aug 13 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
Jun 06 #Javascript
jquery数组过滤筛选方法grep()简介
Jun 06 #Javascript
js实现的标题栏新消息闪烁提示效果
Jun 06 #Javascript
IE中图片的onload事件无效问题和解决方法
Jun 06 #Javascript
jQuery插件分享之分页插件jqPagination
Jun 06 #Javascript
javascript中的return和闭包函数浅析
Jun 06 #Javascript
seaJs的模块定义和模块加载浅析
Jun 06 #Javascript
You might like
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Django自定义用户认证示例详解
2018/03/14 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
Tostadora意大利:定制T恤
2019/04/08 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
护理专业自荐信范文
2014/02/26 职场文书
教师产假请假条范文
2014/04/10 职场文书
教研活动总结
2014/04/28 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
公证书格式
2015/01/23 职场文书
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers