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 相关文章推荐
js获取select默认选中的Option并不是当前选中值
May 07 Javascript
网站基于flash实现的Banner图切换效果代码
Oct 14 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
jQuery实现摸拟alert提示框
May 22 Javascript
jQuery实现的模拟弹出窗口功能示例
Nov 24 Javascript
jQuery中用on绑定事件时需注意的事项
Mar 19 Javascript
Bootstrap Table使用整理(一)
Jun 09 Javascript
JS设置随机出现2个数字的实例代码
Jul 19 Javascript
浅谈node中的exports与module.exports的关系
Aug 01 Javascript
Vue2.0 事件的广播与接收(观察者模式)
Mar 14 Javascript
Vue组件间通信 Vuex的用法解析
Aug 05 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
Dec 07 Vue.js
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
深入PHP curl参数的详解
2013/06/17 PHP
神盾加密解密教程(三)PHP 神盾解密工具
2014/06/08 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
php异常处理捕获错误整理
2019/09/23 PHP
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
seajs中模块依赖的加载处理实例分析
2017/10/10 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
使用JS获取页面上的所有标签
2018/10/18 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
python实现自动重启本程序的方法
2015/07/09 Python
Python实现针对中文排序的方法
2017/05/09 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
京东国际站:JOYBUY
2017/11/23 全球购物
地球鞋加拿大官网:Earth Shoes Canada
2020/11/17 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
销售员自我评价怎么写
2013/09/19 职场文书
《自选商场》教学反思
2014/02/14 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
法人身份证明书
2015/06/18 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python