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 实现导航栏悬停效果
Sep 23 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
Oct 21 Javascript
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
js实现类似菜单风格的TAB选项卡效果代码
Aug 28 Javascript
基于jquery实现图片放大功能
May 07 Javascript
JavaScript代码执行的先后顺序问题
Oct 29 Javascript
微信小程序使用wxParse解析html的方法教程
Jul 06 Javascript
小程序转发探索示例
Feb 19 Javascript
解决layUI的页面显示不全的问题
Sep 20 Javascript
es5 类与es6中class的区别小结
Nov 09 Javascript
微信小程序实现左滑删除效果
Nov 18 Javascript
JavaScript实现点击自制菜单效果
Feb 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
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
jquery获取复选框被选中的值
2014/04/10 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
js闭包用法实例详解
2016/12/13 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
window下eclipse安装python插件教程
2017/04/24 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
Python函数式编程实例详解
2020/01/17 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
Ajax主要包含了哪些技术
2014/06/12 面试题
编辑找工作求职信分享
2014/01/03 职场文书
应届毕业生通用的自荐书范文
2014/02/07 职场文书
会计岗位说明书
2014/07/29 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
Python中request的基本使用解决乱码问题
2022/04/12 Python
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
MySQL 原理与优化之Update 优化
2022/08/14 MySQL
Python find()、rfind()方法及作用
2022/12/24 Python