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编程起步(第二课)
Feb 27 Javascript
基于jquery跨浏览器显示的file上传控件
Oct 24 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
Nov 28 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
May 04 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
Jun 22 Javascript
vue-cli入门之项目结构分析
Apr 20 Javascript
jquery+css实现简单的图片轮播效果
Aug 07 jQuery
Vue入门之animate过渡动画效果
Apr 08 Javascript
用Vue.js在浏览器中实现裁剪图像功能
Jun 18 Javascript
关于vue的列表图片选中打钩操作
Sep 09 Javascript
Node.JS如何实现JWT原理
Sep 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
php 动态添加记录
2009/03/10 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
解密效果
2006/06/23 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
python添加模块搜索路径方法
2017/09/11 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
python批量处理txt文件的实例代码
2020/01/13 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Python是什么 Python的用处
2020/05/26 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
设计师珠宝:Ylang 23
2018/05/11 全球购物
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
几个人围成一圈的问题
2013/09/26 面试题
马云的职业生涯规划之路
2014/01/01 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
2015年暑期实践报告范文
2015/07/13 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
导游词之四川武侯祠
2019/10/21 职场文书