JS动态获取元素宽高的几种方式

 更新时间:2024年09月18日 11:37:55   作者:亦黑迷失  
这篇文章主要介绍了js 动态获取元素宽高的几种方式,文章通过代码示例和图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

前期准备

我先准备了 2 个用来测试的 div

<div id="box1"></div>
<div id="box2"></div>

样式如下,红色的 box1 有使用 css 明确定义的宽高,绿色的 box2 则是只定义了高度,宽度为父元素(页面)的 50%:

body {
  margin: 0;
}

#box1 {
  width: 100px;
  height: 100px;
  background-color: brown;
}

#box2 {
  width: 50%;
  height: 100px;
  background-color: cadetblue;
}

效果如下:

我通过 id 获取到了 box1 和 box2 对象:

const box1 = document.getElementById('box1')
const box2 = document.getElementById('box2')

offsetWidth 与 offsetHeight

首先介绍的是 HTMLElement 的只读属性 offsetWidth 与 offsetHeight。我们可以直接打印查看 box1 和 box2 的宽高:

window.addEventListener('resize', () => {
  console.log(box1.offsetWidth, box1.offsetHeight)
  console.log(box2.offsetWidth)
})

结果如下,当文档宽度为 642.5px 时,box1.offsetWidth 和 box1.offsetHeight 均为 100,box2.offsetWidth 的打印输出为 321:

表明:

  • offsetWidthoffsetHeight 可以动态获取元素的宽高;
  • 获取的结果是不带单位的;
  • 获取的结果如果为小数,会被取整。

getBoundingClientRect()

getBoundingClientRect() 是一个方法,使用方法如下:

const rect1 = box1.getBoundingClientRect()

返回的结果是一个 DOMRect 对象,其中除了元素的宽高信息外还有其它属性:

打印查看 box1 和 box2 的宽度:

window.addEventListener('resize', () => {
  const rect1 = box1.getBoundingClientRect()
  const rect2 = box2.getBoundingClientRect()
  console.log(rect1.width)
  console.log(rect2.width)
})

结果如下:

表明:

  • getBoundingClientRect() 可以动态获取元素的宽度(高度亦然);
  • 获取的结果同 offsetWidth 一样也是不带单位的;
  • offsetWidth 不同的是,它的结果不会取整。

getComputedStyle()

getComputedStyle() 也是一个方法,使用方式如下:

const style1 = getComputedStyle(box1)

打印查看 style1,结果如下:

返回的对象基本上包含了 box1 的所有 css 属性。我们只需要查看 width 属性,所以可以:

window.addEventListener('resize', () => {
  const style1 = getComputedStyle(box1)
  const style2 = getComputedStyle(box2)
  console.log(style1.width)
  console.log(style2.width)
})

得到的结果如下:

表明:

  • getComputedStyle() 也可以动态地获取元素的宽度;
  • 获取的结果是带单位的,这点与 getBoundingClientRect()offsetWidth 不同;
  • 它的结果也不会取整。

边框、内边距的影响

现在我给 box1 的 css 添加上边框 (border) 和内边距 (padding),研究对几种获取宽高的方式是否会产生影响:

#box1 {
  /* ...忽略之前的定义 */
  border: 1px solid #333;
  padding-left: 10px;
}
  • offsetWidth 与 offsetHeight

现在打印的结果中,box1.offsetWidth 就会为 112,box1.offsetHeight 为 102:

这说明 offsetWidthoffsetHeight 的值是会包含边框和内边距的。

  • getBoundingClientRect()

rect1.width 的打印结果会约等于 box1 的 width(100px) + border(1px*2) + padding(10px) 的 112px:

可见 getBoundingClientRect() 获取的宽高是会包含边框和内边距的。

  • getComputedStyle()

即使添加了边框与内边距,打印 style1.width 得到的结果依旧为 100px:

可见获取的仅仅是 css 属性中的 width 的值,与其它无关。

盒模型的影响

如果我再将 box1 的盒模型做出修改,改为 border-box

#box1 {
  /* ...忽略之前的定义 */
  box-sizing: border-box;
}

此时,无论是通过 offsetWidth 还是 getBoundingClientRect() 或是 getComputedStyle(),它们获取到的关于 box1 宽度的结果,都为 100(或 100px):

以上就是JS动态获取元素宽高的几种方式的详细内容,更多关于JS获取元素宽高的资料请关注脚本之家其它相关文章!

相关文章

  • javascript中关于break,continue的特殊用法与介绍

    javascript中关于break,continue的特殊用法与介绍

    javascript大家所熟知中的for是一个循环体,循环体其中的break和continue也是大家都比较熟悉的功能,相信大家对它们的用法不会陌生,本文不是介绍其功能,本文假设你已经熟悉break和continue的语意和用法
    2012-05-05
  • js实现简单五子棋游戏

    js实现简单五子棋游戏

    这篇文章主要为大家详细介绍了js实现简单五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • JavaScript和jQuery获取元素高度的各种方法

    JavaScript和jQuery获取元素高度的各种方法

    在前端开发中,获取元素高度是最基础也是最常用的操作之一,本文将详细介绍 原生JavaScript 和 jQuery 中获取元素高度的各种方法,帮你彻底搞懂它们的区别,需要的朋友可以参考下
    2026-05-05
  • javaScript使用EL表达式的几种方式

    javaScript使用EL表达式的几种方式

    这篇文章主要介绍了javaScript如何使用EL表达式,有哪几种不错的方式,需要的朋友可以参考下
    2014-05-05
  • ES6知识点整理之Proxy的应用实例详解

    ES6知识点整理之Proxy的应用实例详解

    这篇文章主要介绍了ES6知识点整理之Proxy的应用,结合实例形式详细分析了ES6中Proxy的功能、原理、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-04-04
  • 最简单的JavaScript图片轮播代码(两种方法)

    最简单的JavaScript图片轮播代码(两种方法)

    基于javascript代码实现最简单的图片轮播效果,非常简单,本文通过两种方式给大家介绍最简单的图片轮播,感兴趣的朋友一起学习吧
    2015-12-12
  • mongoose之bulkWrite操作使用实例

    mongoose之bulkWrite操作使用实例

    这篇文章主要为大家介绍了mongoose之bulkWrite操作使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详解web如何改变主题配色方法示例

    详解web如何改变主题配色方法示例

    这篇文章主要为大家介绍了web如何改变主题配色方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 鼠标滚轴控制文本框值的JS代码

    鼠标滚轴控制文本框值的JS代码

    这篇文章主要介绍了鼠标滚轴控制文本框值的JS代码,有需要的朋友可以参考一下
    2013-11-11
  • JavaScript定时器setTimeout、setInterval使用详解

    JavaScript定时器setTimeout、setInterval使用详解

    网站开发过程中经常会用到各种各样的定时任务,这时我们会用到setTimeout和setInterval方法,下面这篇文章主要给大家介绍了关于JavaScript定时器setTimeout、setInterval使用的相关资料,需要的朋友可以参考下
    2023-04-04

最新评论