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 相关文章推荐
Javascript中的window.event.keyCode使用介绍
Apr 26 Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 Javascript
thinkphp中常用的系统常量和系统变量
Mar 05 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
原生js更改css样式的两种方式
Mar 15 Javascript
20行JS代码实现网页刮刮乐效果
Jun 23 Javascript
JavaScript实现图片切换效果
Aug 12 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
Sep 15 Javascript
vue切换菜单取消未完成接口请求的案例
Nov 13 Javascript
解决vue项目中出现Invalid Host header的问题
Nov 17 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/05 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
raphael.js绘制中国地图 地图绘制方法
2014/02/12 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
Python 多进程和数据传递的理解
2017/10/09 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
工作疏忽检讨书
2014/01/25 职场文书
优秀党员获奖感言
2014/02/18 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
2014年党员整改措施范文
2014/09/21 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
公司开除员工通知
2015/04/22 职场文书
整改通知书格式
2015/04/22 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书