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 相关文章推荐
一段实现页面上的图片延时加载的js代码
Feb 11 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 Javascript
详解JavaScript基于面向对象之继承
Dec 13 Javascript
JavaScript中定义类的方式详解
Jan 07 Javascript
jquery输入数字随机抽奖特效的简单实现代码
Jun 10 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
Oct 09 Javascript
js编写简单的聊天室功能
Aug 17 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
Oct 24 Javascript
解决vuecli3.0热更新失效的问题
Sep 19 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
通过实例解析js可枚举属性与不可枚举属性
Dec 02 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基本语法总结
2014/09/06 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
js实现随机数小游戏
2019/06/28 Javascript
layui中的switch开关实现方法
2019/09/03 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
[01:02:46]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Python中用pyinstaller打包时的图标问题及解决方法
2020/02/17 Python
Python matplotlib可视化实例解析
2020/06/01 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
Python实现异步IO的示例
2020/11/05 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
实体的生命周期
2013/08/31 面试题
服装设计专业毕业生求职信
2014/04/09 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
质量月活动总结
2014/08/26 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
北大自主招生自荐信
2015/03/04 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
Python实现双向链表
2022/05/25 Python