JS 中 offsetHeight/scrollHeight/clientHeight 的区别

简介: client* clientWidth/clientHeight 返回的是元素的内部宽度,它的值只包含 content + padding,如果有滚动条,不包含滚动条 clientTop 返回的是上边

JS 基于 DOM 对象可以拿到元素的宽高的属性有 offset 系、scroll 系、client 系(以其名称作为前缀得名),IDE 提示如下(以 VS Code 为准)

接下来就以如下顺序介绍一下这三种获取宽高的方法,以及它们的不同

  1. client*
  2. offset*
  3. scroll*

client

  1. client*

    1. clientWidth/clientHeight 返回的是元素的内部宽度,它的值只包含 content + padding,如果有滚动条,不包含滚动条
    2. clientTop 返回的是上边框的宽度
    3. clientLeft 返回的左边框的宽度
<body>
  <div class="demo" style="height: 100px; width: 100px; padding: 10px;"></div>
</body>
<script>
  const div = document.querySelector(".demo");
  console.log(div.clientWidth, div.clientHeight, div.clientTop, div.clientLeft);
  // 120 120 10 10
</script>

可能有人想问了,clientBottom 是不是就是 border 底部的值呢?实际上结果是 undefiend 因为并没有这个值,clientRight 同理

注意一个小细节

clientHeightclientWidth 不包括滚动条,如果有滚动条,那么 clientHeight = content + padding - scroll (元素内容本身的高度加上内边距再减去水平滚动条的高度)

<body>
  <div
    class="demo"
    style="
      height: 100px;
      width: 100px;
      padding: 10px;
      border: 10px solid black;
      overflow: auto;
    "
  >
    <div style="height: 200px"></div>
  </div>
</body>
<script>
  const div = document.querySelector(".demo");
  console.log(div.clientWidth, div.clientHeight); // 103 120
  // 此时滚动条宽度为 17px
</script>

offset

  1. offset*

    1. offsetWidth/offsetHeight 返回的是元素的布局宽度,它的值包含 content + padding + border 包含了滚动条
    2. offsetTop 返回的是当前元素相对于其 offsetParent 元素的顶部的距离
    3. offsetLeft 返回的是当前元素相对于其 offsetParent 元素的左部的距离

不过有点奇怪的是,VS CodeWebStorm 都没有对 offset* 做任何提示(希望评论区能够给出答案)

依旧是上面的例子

<body>
  <div style="height: 100px"></div>
  <div
    class="demo"
    style="
      height: 100px;
      width: 100px;
      padding: 10px;
      border: 10px solid black;
      overflow: auto;
    "
  >
    <div style="height: 200px"></div>
  </div>
</body>
<script>
  const div = document.querySelector(".demo");
  console.log(div.offsetHeight, div.offsetWidth, div.offsetTop, div.offsetLeft);
  // 140 140 108 8
</script>

此时 divoffsetParent 就是 body

scroll

  1. scroll*

    1. scrollWidth/scrollHeight 返回值包含 content + padding + 溢出内容的尺寸
    2. scrollTop 属性返回的是一个元素的内容垂直滚动的像素数
    3. scrollLeft 读写元素左侧已滚动的距离,即位于元素左边界与元素中当前可见内容的最左端之间的距离。

scrollWidth/Height 不多讲了,和 offset 差不多以及 client 系差不多,接下来用两个动图介绍一下 scrollTopscrollLeft

scrollLeft 的数值就是已经滑动、消失的部分和当前可见区域最左边的距离

代码如下

<body>
  <div
    class="demo"
    style="
      transform: translate(0, 0);
      height: 200px;
      width: 200px;
      padding: 10px;
      border: 10px solid black;
      overflow: auto;
    "
  >
    <div style="height: 50px; width: 800px; background: black"></div>
    <div class="count" style="position: sticky; left: 0">scrollLeft: 0</div>
  </div>
</body>
<script>
  const div = document.querySelector(".demo");
  const count = document.querySelector(".count");
  div.addEventListener("scroll", () => {
    count.innerHTML = "scrollLeft: " + parseInt(div.scrollLeft);
  });
</script>

参考资料

  1. JS scrollLeft和scrollTop属性:读写元素左侧和顶部已滚动的距离
  2. 浅谈JS各种宽高(clientHeight、scrollHeight、offsetHeight等)- CSDN - 骆小胖
相关文章
|
JavaScript 前端开发 索引
js的循环中foreach、for in和for of的区别
js的循环中foreach、for in和for of的区别
594 0
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
704 154
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
489 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
626 1
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
前端开发 JavaScript 开发者
React 和 Vue.js 框架的区别是什么?
React 和 Vue.js 框架的区别是什么?
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
388 2

热门文章

最新文章