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 相关文章推荐
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
Feb 14 Javascript
js绑定事件this指向发生改变的问题解决方法
Apr 23 Javascript
jquery获取当前点击对象的value方法
Feb 28 Javascript
Javascript非构造函数的继承
Apr 27 Javascript
在Mac OS下使用Node.js的简单教程
Jun 24 Javascript
js实现鼠标点击左上角滑动菜单效果代码
Sep 06 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
JSON对象转化为字符串详解
Aug 11 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
Nov 26 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
Apr 08 Javascript
详解VUE项目中安装和使用vant组件
Apr 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
php中大括号作用介绍
2012/03/22 PHP
PHP实现合并discuz用户
2015/08/05 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
[01:35]2014DOTA2西雅图邀请赛 专访狐狸妈青春献给刀塔
2014/07/08 DOTA
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
python中定义结构体的方法
2013/03/04 Python
python函数装饰器用法实例详解
2015/06/04 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
python的slice notation的特殊用法详解
2019/12/27 Python
python机器学习库xgboost的使用
2020/01/20 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
python SOCKET编程基础入门
2021/02/27 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
英语文学专业学生的自我评价
2013/10/31 职场文书
优秀毕业大学生推荐信
2013/11/13 职场文书
股权转让协议书
2014/04/12 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
高考升学宴主持词
2019/06/21 职场文书
Python基础详解之描述符
2021/04/28 Python
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏