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中Date对象的getDay方法使用指南
Dec 22 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
Apr 27 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
jquery mobile移动端幻灯片滑动切换效果
Apr 15 Javascript
小程序实现带年月选取效果的日历
Jun 27 Javascript
微信小程序实现顶部导航特效
Jan 28 Javascript
详解在React-Native中持久化redux数据
May 22 Javascript
layui form表单提交后实现自动刷新
Oct 25 Javascript
Javascript如何递归遍历本地文件夹
Aug 06 Javascript
js数组的基本使用总结
Jan 18 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
多人战的战术与战略
2020/03/04 星际争霸
PHP新手上路(九)
2006/10/09 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
js 上传图片预览问题
2010/12/06 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
vue.js计算属性computed用法实例分析
2018/07/06 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
Python列表对象实现原理详解
2019/07/01 Python
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
营销总经理岗位职责
2014/02/02 职场文书
补充协议书
2015/01/28 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
信访维稳承诺书
2015/05/04 职场文书
珍爱生命主题班会
2015/08/13 职场文书
电力安全教育培训心得体会
2016/01/11 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书
React如何创建组件
2021/06/27 Javascript
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android