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 相关文章推荐
use jscript List Installed Software
Jun 11 Javascript
页面内容排序插件jSort使用方法
Oct 10 Javascript
js正则表达式验证邮件地址
Nov 12 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
Jun 21 Javascript
浅谈angularJS中的事件
Jul 12 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
超详细的JS弹出窗口代码大全
Apr 18 Javascript
谈谈target=_new和_blank的不同之处
Oct 25 Javascript
快速掌握jQuery插件WebUploader文件上传
Nov 07 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
Vue.js 事件修饰符的使用教程
Nov 01 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 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
laravel安装zend opcache加速器教程
2015/03/02 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
vue.js中$watch的用法示例
2016/10/04 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
浅谈Vue.set实际上是什么
2019/10/17 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
全面解析Vue中的$nextTick
2020/12/24 Vue.js
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
Django用内置方法实现简单搜索功能的方法
2020/12/18 Python
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
优秀应届毕业生自荐信
2013/11/16 职场文书
运动会广播稿200米
2014/01/27 职场文书
班主任新年寄语
2014/04/04 职场文书
学习之星事迹材料
2014/05/17 职场文书
争先创优演讲稿
2014/09/15 职场文书
国王的演讲观后感
2015/06/03 职场文书
安全伴我行主题班会
2015/08/13 职场文书
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA