开篇的话

任何不是亲身实践中求得的知识,都不是属于你的。

任何求得的知识不去时常温习运用,也不是属于你的。


记录由来

在做个上拉广告功能中遇到了一个“理所当然”觉得对的用法,慢慢才排查出是获取元素高度那里出了问题,这个问题记忆在书上或视频中看到过,许久没用,用的时候就想当然了。遂决定深入剖析用法,增加记忆,记录发表出来,也能给各位前端同行、求学者增加印象。

出错之处

秉承结构、样式、行为分离的宗旨,每次不管大小案例都是分开写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获取元素宽高实践详解的更多相关文章

  1. JS获取元素宽高的两种情况

    JS获取元素宽高分两种情况, 一.内联样式,也就是直接把width和height写在HTML元素中的style里: 这种情况使用     document.getElementById('xxx'). ...

  2. js 获取元素宽高

    可以用源生js的.offsetHeight .offsetWidth属性 document.getElementById("temp_form").offsetHeight // ...

  3. js获取元素宽高、位置相关知识汇总

    常见clientWidth.clientHeight.offsetWidth.offsetLeft,clientX.scrollTop等词语,比较混乱,现在总结下他们的区别. 1. clientWid ...

  4. 原生JS获取网页宽高

    网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...

  5. 原生js获取元素的样式信息

    工作中经常会需要获取DOM元素的样式,之前都是通过jquery的css()方法,现在总结一下通过原生js获取元素样式的方法. obj.style js var _width = obj.style.w ...

  6. js 获取元素宽

    第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. 第 ...

  7. JS获取网页宽高方法集合

    JS获取网页宽高等方法的集合:document.body.clientWidth - 网页可见区域宽document.body.clientHeight - 网页可见区域高 document.body ...

  8. 原生js获取元素的各种位置(大全)

    加给元素: offsetLeft (距离定位父级的距离) offsetTop (距离定位父级的距离) offsetWidth (可视宽度) offsetHeight (可视高度) clientLeft ...

  9. 微信小程序之动态获取元素宽高

    我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...

随机推荐

  1. 004 gcc 编译 C/C++ 默认使用哪个标准

    0. 前言 我挺久没碰 C,不想就这么忘了,最近重温了一些相关知识 1. C 语言的几种"方言" 简单地说,有这么几种常见的 年份 名称 1983 ANSI C 1987 C87 ...

  2. Spark-Core RDD转换算子-双Value型交互

    1.union(otherDataSet) 作用:求并集. 对源 RDD 和参数 RDD 求并集后返回一个新的 RDD scala> val rdd1 = sc.parallelize(1 to ...

  3. abstract关键字及static关键字

    抽象关键字abstract 抽象类 在类前加上关键字abstract可以将此类变成抽象类.抽象类不允许通过new关键字实例化,但是可一通过其子类向上转型为其创建实例. 抽象类可以有抽象方法,也可以没有 ...

  4. link标签中的integrity和crossorigin字段

    https://blog.csdn.net/SNP_fuyun/article/details/77113985?locationNum=10&fps=1

  5. Java创建二叉树

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yeweiouyang/article/details/37814461 二叉树的值保存在数组中,以0 ...

  6. SpringMVC源码解析

    一:springmvc运行过程: 1. dispatcherServlet 通过 HandlerMapping 找到controller2. controller经过后台逻辑处理得到结果集modela ...

  7. GridView做加

    原文:http://www.cnblogs.com/insus/archive/2012/09/22/2697862.html 下面是Insus.NET实现演示: CObj.cs代码: using S ...

  8. 基于ELK进行邮箱访问日志的分析

    公司希望能够搭建自己的日志分析系统.现在基于ELK的技术分析日志的公司越来越多,在此也记录一下我利用ELK搭建的日志分析系统. 系统搭建 系统主要是基于elasticsearch+logstash+f ...

  9. 出去就餐并且理解Express.js的基本知识

    Going out to eat and understanding the basics of Express.js出去就餐并且理解Express.js的基本知识 原文:Going out to e ...

  10. Elastic Search闪退问题

    昨天还可以正常启动,今天及不行.. 在网上找了很多方法都不行,后来参考https://blog.csdn.net/happyzxs/article/details/89156068,修复好了 一.遇到 ...