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 相关文章推荐
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
Nov 30 Javascript
javascript indexOf函数使用说明
Jul 03 Javascript
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
Sep 19 Javascript
js 取时间差去掉周六周日实现代码
Dec 25 Javascript
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
基于jquery实现弹幕效果
Sep 29 Javascript
JavaScript用构造函数如何获取变量的类型名
Dec 23 Javascript
解决JQuery全选/反选第二次失效的问题
Oct 11 jQuery
使用pm2部署node生产环境的方法步骤
Mar 09 Javascript
跟混乱的页面弹窗说再见
Apr 11 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 Javascript
JS写滑稽笑脸运动效果
May 28 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
使用phpQuery获取数组的实例
2017/03/13 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
使用node.js 获取客户端信息代码分享
2014/11/26 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
JS script脚本中async和defer区别详解
2020/06/24 Javascript
Python可跨平台实现获取按键的方法
2015/03/05 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
python贪吃蛇游戏代码
2020/04/18 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
appium+python adb常用命令分享
2020/03/06 Python
Python爬虫爬取微信朋友圈
2020/08/06 Python
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
超市创业计划书
2014/04/24 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
工作建议书范文
2019/07/08 职场文书
Python可视化学习之seaborn调色盘
2022/02/24 Python