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 date格式化示例
Sep 25 Javascript
js中top的作用深入剖析
Mar 04 Javascript
jquery使用ajax实现微信自动回复插件
Apr 28 Javascript
js获取元素相对窗口位置的实现代码
Sep 28 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
Jan 20 Javascript
可以浮动某个物体的jquery控件用法实例
Jul 24 Javascript
ArtEditor富文本编辑器增加表单提交功能
Apr 18 Javascript
老生常谈Bootstrap媒体对象
Jul 06 Javascript
bootstrap multiselect下拉列表功能
Aug 22 Javascript
JS实现的全选、全不选及反选功能【案例】
Feb 19 Javascript
vue实现的上拉加载更多数据/分页功能示例
May 25 Javascript
js获取url页面id,也就是最后的数字文件名
Sep 25 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获取mysql版本的几种方法小结
2008/03/25 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
PHP7 字符串处理机制修改
2021/03/09 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
关于文本限制字数的js代码
2007/04/02 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
解决layui 三级联动下拉框更新时回显的问题
2019/09/03 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
期末考试动员演讲稿
2014/01/10 职场文书
先进班级集体事迹材料
2014/01/30 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
小学优秀教师材料
2014/12/15 职场文书
自我检讨书范文
2015/01/28 职场文书
父亲节寄语大全
2015/02/27 职场文书
撤诉状格式范本
2015/05/19 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle