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 相关文章推荐
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
JavaScript 直接操作本地文件的实现代码
Dec 01 Javascript
Javascript表达式中连续的 &amp;&amp; 和 || 之赋值区别
Oct 17 Javascript
15条JavaScript最佳实践小结
Aug 09 Javascript
js克隆对象、数组的常用方法介绍
Sep 26 Javascript
table行随鼠标移动变色示例
May 07 Javascript
javascript数组去重方法终极总结
Jun 05 Javascript
director.js实现前端路由使用实例
Feb 03 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
Nov 30 Javascript
JavaScript中的 new 命令
May 22 Javascript
用vue写一个日历
Nov 02 Javascript
JavaScript 中的六种循环方法
Jan 06 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简单生成缩略图相册的方法
2015/07/29 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
简单理解JavaScript中的封装与继承特性
2016/03/19 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
python简单实现操作Mysql数据库
2018/01/29 Python
python中单下划线_的常见用法总结
2018/07/10 Python
Python for循环中的陷阱详解
2018/07/13 Python
python实现矩阵打印
2019/03/02 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
微软中国官方商城:Microsoft Store中国
2018/10/12 全球购物
怎样写留学自荐信
2013/11/11 职场文书
高一自我鉴定
2013/12/17 职场文书
班队活动设计方案
2014/01/30 职场文书
技校毕业生自荐信范文
2014/03/07 职场文书
新学期国旗下演讲稿
2014/05/08 职场文书
欢迎家长标语
2014/10/08 职场文书
铁路安全反思材料
2014/12/24 职场文书
运动会班级前导词
2015/07/20 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
JavaScript中10个Reduce常用场景技巧
2022/06/21 Javascript