js获取隐藏元素的宽高


Posted in Javascript onFebruary 24, 2017

获取隐藏元素(display:none)的物理尺寸

问题及场景

假如我们有这样一个输入框,点击能展开选择。如下图:

js获取隐藏元素的宽高

js获取隐藏元素的宽高js获取隐藏元素的宽高

在这里输入框和下方的展开区域是分离的,独立的两个控件!初始状态下面的可选框是隐藏的(ng-show=false)

展开区域中可折叠组件accordion(对应图中省份,排序字段,短消息部分)的高度是随着数据自适应撑开,点击accordion折叠收缩时有一个高度变化的动画效果!

在计算accordion的高度时却无法获取数据节点元素的高度,导致accordion的高度为0,无法折叠!

原因

在一个隐藏的div元素节点中无法获取它子元素的物理尺寸!即输入框下面的展开区域还是隐藏时,accordion控件无法获取数据DOM节点元素的高度.

解决方案

JQuey中height()和width()方法获取隐藏元素的尺寸。但是这只能获取隐藏元素的高度,无法获取内部子元素的高度!!!

解决方案:JS控制css设置元素的隐藏与显示

代码思路:显示隐藏元素(去掉元素的隐藏方式,css属性display:none或者某些样式类) ---> 计算目标元素高度 ---> 还原隐藏元素的样式

存在问题:

1.元素在切换显示与隐藏时会闪烁 ----> 解决办法:利用css中visibility:hidden不可见属性,visibility:hidden隐藏的元素有物理尺寸。

 如果高度的计算能在极短的时间内完成,此闪烁现象可以忽略不计!

2.元素显示后会占据物理尺寸可能影响其它元素位置 ----> 解决办法:将这个隐藏的元素移出屏幕或者脱离文档流( position: absolute)。

示例代码如下:

调用getSize方法传入被隐藏元素element,以及需要获取尺寸的目标元素就能返回targetEl的尺寸了!!!

//获取元素的物理尺寸,参数:element隐藏的元素节点;targetEl需要获取尺寸的目标元素
this.getSize = function(element,targetEl) {
 //增加隐藏,防止element在取消隐藏时闪烁; position: absolute;和display:none看需要是否加上
 var _addCss = { visibility: 'hidden' };
 var _oldCss = {};
 var _width;
 var _height;
 if (this.getStyle(element, "display") != "none") {
  return { width: !!targetEl ? targetEl.offsetWidth : element.offsetWidth , height: !!targetEl ? targetEl.offsetHeight : element.offsetHeight };
 }
 for (var i in _addCss) {
  _oldCss[i] = this.getStyle(element, i);
 }
 this.setStyle(element, _addCss);
 //这里是通过angularjs的ng-show指令隐藏元素的,去掉ng-hide样式类就可以取消隐藏
 var _isNgHide = element.classList.contains("ng-hide");
 _isNgHide && element.classList.remove("ng-hide");
 _width = !!targetEl ? targetEl.offsetWidth : element.offsetWidth;
 _height =!!targetEl ? targetEl.offsetHeight : element.offsetHeight;
 //还原之前的样式,class
 this.setStyle(element, _oldCss);
 _isNgHide && element.classList.add("ng-hide");
 return { width: _width, height: _height };
};
this.getStyle = function(element, styleName) {
 return element.style[styleName] ? element.style[styleName] : element.currentStyle ? element.currentStyle[styleName] : window.getComputedStyle(element, null)[styleName];
};
this.setStyle = function(element, obj){
 if (angular.isObject(obj)) {
  for (var property in obj) {
   var cssNameArr = property.split("-");
   for (var i = 1,len=cssNameArr.length; i < len; i++) {
    cssNameArr[i] = cssNameArr[i].replace(cssNameArr[i].charAt(0), cssNameArr[i].charAt(0).toUpperCase());
   }
   var cssName = cssNameArr.join("");
   element.style[cssName] = obj[property];
  }
 }
 else if (angular.isString(obj)) {
  element.style.cssText = obj;
 }
};

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
用dom+xhtml+css制作的一个相册效果代码打包下载
Jan 24 Javascript
JS刷新当前页面的几种方法总结
Dec 24 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
Dec 18 Javascript
js控制网页前进和后退的方法
Jun 08 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
利用Node.JS实现邮件发送功能
Oct 21 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
vue配置接口域名方法总结
May 12 Javascript
vue.js中ref和$refs的使用及示例讲解
Aug 14 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
Sep 27 Javascript
Angular之jwt令牌身份验证的实现
Feb 14 Javascript
js css自定义分页效果
Feb 24 #Javascript
jQuery快速高效制作网页交互特效
Feb 24 #Javascript
Angular.js自定义指令学习笔记实例
Feb 24 #Javascript
利用原生JS与jQuery实现数字线性变化的动画
Feb 24 #Javascript
JavaScript和jQuery制作光棒效果
Feb 24 #Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
Feb 24 #Javascript
微信小程序实现实时圆形进度条的方法示例
Feb 24 #Javascript
You might like
PHP的SQL注入过程分析
2012/01/06 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
关于flash遮盖div浮动层的解决方法
2010/07/17 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
jQuery实现tab标签自动切换的方法
2015/02/28 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
Puppet的一些技巧
2018/09/17 Javascript
Vue父组件如何获取子组件中的变量
2019/07/24 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
django中模板的html自动转意方法
2018/05/27 Python
Django之模板层的实现代码
2019/09/09 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
Ejb技术面试题
2015/04/29 面试题
研究生自荐信
2013/10/09 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
售后客服个人自我评价
2014/09/14 职场文书
2019年工作总结范文
2019/05/21 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS