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 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
javascript生成/解析dom的CDATA类型的字段的代码
Apr 22 Javascript
解析javascript系统错误:-1072896658的解决办法
Jul 08 Javascript
jquery实现鼠标拖动图片效果示例代码
Jan 09 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
Mar 12 Javascript
原生js实现图片层叠轮播切换效果
Feb 02 Javascript
JavaScript学习笔记之取数组中最大值和最小值
Mar 23 Javascript
AngularJS实现一次监听多个值发生的变化
Aug 31 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
Oct 13 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
Dec 25 Javascript
Angular4学习笔记router的简单使用
Mar 30 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
Oct 11 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
图象函数中的中文显示
2006/10/09 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
Vue组件中的data必须是一个function的原因浅析
2018/09/03 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
浅谈Python 对象内存占用
2016/07/15 Python
python机器学习实战之树回归详解
2017/12/20 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
Numpy数组的保存与读取方法
2018/04/04 Python
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
python实现简单学生信息管理系统
2020/04/09 Python
python属于解释语言吗
2020/06/11 Python
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
syb养殖创业计划书
2014/01/09 职场文书
简单的辞职信范文
2014/01/18 职场文书
学生安全教育材料
2014/02/14 职场文书
办公室主任职责范本
2014/03/07 职场文书
质量月口号
2014/06/20 职场文书
出纳岗位职责范本
2015/03/31 职场文书