原生JS获取元素宽高实践详解
开篇的话
任何不是亲身实践中求得的知识,都不是属于你的。
任何求得的知识不去时常温习运用,也不是属于你的。
记录由来
在做个上拉广告功能中遇到了一个“理所当然”觉得对的用法,慢慢才排查出是获取元素高度那里出了问题,这个问题记忆在书上或视频中看到过,许久没用,用的时候就想当然了。遂决定深入剖析用法,增加记忆,记录发表出来,也能给各位前端同行、求学者增加印象。
出错之处
秉承结构、样式、行为分离的宗旨,每次不管大小案例都是分开写html、css、js。这也算抛砖引出了我犯错的玉。
原css:
原js获取DOM元素高度:
var adcon = document.getElementById('adcon');
var maxH = parseInt(adcon.style.height);
这样写之后在console的时候发现:
返回值为NaN。 Orz...
排查错误,找出原因
写个例子测试一下:
仔细查找CSSStyleDeclaration发现height对应值为空
这样就知道为什么会返回NaN了。
那为什么会是""的,百一下谷一下测试一下发现:
这个test.style.xxx
这里只能获取的值是标签元素行内样式的值。
也就是说如果这样写:
CSSStyleDeclaration里才会包括:
这种方式就会取得到值:
扩展需求解决办法,找到各个环境下的最优方法
关于原生JS取dom元素宽高的方法,我总结了以下五种方法,有遗漏的望各位网友提出,谢谢~
- window.getComputedStyle(dom元素,'伪类').属性名
- dom元素.clientHeight/clientWidth
- dom元素.offsetHeight/offsetWidth
- dom元素.scrollHeight/scrollWidth
- dom元素.style.height/width
光说不练假把式,直接上codes来解释:
getComputedStyle()方法
这个方法是只读的,具体语法和应用的详细讲解可以参见张鑫旭大佬的这篇:传送门
由此可见,这个方法取得值是内容content区域的值,与padding、margin和边框无关。
dom元素.clientHeight/clientWidth方法
可见这是内容区域+上下padding的值。
dom元素.offsetHeight/offsetWidth
可见这是内容区域+两个padding+两个border的值
dom元素.style.height/width
这一开始分析过了,取得是元素行内样式的height值(内容区域的值)
dom元素.scrollHeight/scrollWidth
我给例子加了很多内容,出现滚动条:
测试结果:
由此可见,scrollHeight方法返回的还是content内容区域+两个padding的值。
scrollWidth方法返回的是正文内容的总宽度
以上是通过实际测试得出来的结论,个人认为比看一大片干巴巴的文字更容易理解。下一次在实战中遇见应该不会再犯错了。
小白一枚,浅面记录,如有错误、建议、缺漏,恳请指出。
原生JS获取元素宽高实践详解的更多相关文章
- JS获取元素宽高的两种情况
JS获取元素宽高分两种情况, 一.内联样式,也就是直接把width和height写在HTML元素中的style里: 这种情况使用 document.getElementById('xxx'). ...
- js 获取元素宽高
可以用源生js的.offsetHeight .offsetWidth属性 document.getElementById("temp_form").offsetHeight // ...
- js获取元素宽高、位置相关知识汇总
常见clientWidth.clientHeight.offsetWidth.offsetLeft,clientX.scrollTop等词语,比较混乱,现在总结下他们的区别. 1. clientWid ...
- 原生JS获取网页宽高
网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...
- 原生js获取元素的样式信息
工作中经常会需要获取DOM元素的样式,之前都是通过jquery的css()方法,现在总结一下通过原生js获取元素样式的方法. obj.style js var _width = obj.style.w ...
- js 获取元素宽
第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. 第 ...
- JS获取网页宽高方法集合
JS获取网页宽高等方法的集合:document.body.clientWidth - 网页可见区域宽document.body.clientHeight - 网页可见区域高 document.body ...
- 原生js获取元素的各种位置(大全)
加给元素: offsetLeft (距离定位父级的距离) offsetTop (距离定位父级的距离) offsetWidth (可视宽度) offsetHeight (可视高度) clientLeft ...
- 微信小程序之动态获取元素宽高
我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...
随机推荐
- Ubuntu 16.04简单配置备忘录
1.几个安装包的地址 1.Linux QQ:https://im.qq.com/linuxqq/index.html 2.网易云音乐:http://s1.music.126.net/download/ ...
- [Git] 023 Re:从零开始的 rebase 命令
1. 开门见山 我新建了一个本地仓库,并进行了一些操作 当前情况 查看(直观但不明了) 上图的第二条 "log" 命令详见 [Git] 024 log 命令的补充 的 " ...
- Centos中使用Docker部署Apollo
采用微服务开发框架开发项目时会涉及多个系统,如果要更改配置参数需要在多个系统间逐一更改,比较费时,而且容易遗漏,效率低下,次问题可以采用Apollo配置中心的方式解决,下面将介绍如何配置: 准备环境: ...
- ^A '\001' 分隔符
^A 分隔符符号\001,使用组合按键“ctrl+V+A”获得
- Dp test solution
Dp test solution 按照难易程度排序题解: Problem B Problem Description Tarzan 现在想要知道,区间 [L,R] 内有多少数是优美的.我们定义一个数是 ...
- P3198 [HNOI2008]遥远的行星
传送门 发现 $A$ 不大,又允许较大的误差,考虑乱搞 考虑求出每个位置的答案,因为有 $1e5$ 个位置,所以每个位置差不多可以计算 $100$ 次贡献 所以把每个可以贡献的位置尽量均匀分成 $10 ...
- OD消息断点
[文章作者]: icefisher[作者邮箱]: 181712814@qq.com[软件下载]: [软件名称]: echap518.exe(只是供学习的crackme)[加壳方式]: 里面直接有个un ...
- FTP连接不上的解决方法
1.注意内网IP和外网IP 2.检查ftp服务是否启动 (面板首页即可看到) 3.检查防火墙20端口 ftp 21端口及被动端口39000 - 40000是否放行 (如是腾讯云/阿里云等还需检查安全组 ...
- JSP中九大内置对象及其作用
jsp中有九大内置对象分别为:request,response,session,application,out,pageContext,page,config,exception. request:请 ...
- SpringMVC简单介绍及执行
SpringMVC介绍 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单.这些控制器一 ...