如何检索 HTML 元素的实际宽度和高度?

IT技术 javascript html dhtml
2021-02-02 13:27:32

假设我有一个<div>我希望在浏览器的显示(视口)中居中的。为此,我需要计算<div>元素的宽度和高度

我应该使用什么?请提供有关浏览器兼容性的信息。

6个回答

您应该使用.offsetWidth.offsetHeight属性。请注意,它们属于元素,而不是.style

var width = document.getElementById('foo').offsetWidth;

函数.getBoundingClientRect()在执行 CSS 转换后以浮点数形式返回元素的尺寸和位置。

> console.log(document.getElementById('id').getBoundingClientRect())
DOMRect {
    bottom: 177,
    height: 54.7,
    left: 278.5,​
    right: 909.5,
    top: 122.3,
    width: 631,
    x: 278.5,
    y: 122.3,
}
我无法确定offsetWidth在我的情况下返回 0的原因,因为我最初没有编写代码,但在onload事件中我总是得到 0。
2021-03-11 13:27:32
@Supuhstar 两者都有不同的含义。offsetWidth返回“整个”框,包括内容、填充和边框;while 仅clientWidth返回内容框的大小(因此只要元素具有任何非零填充和/或边框,它就会具有较小的值)。(为了清晰起见,修改了mod)
2021-03-13 13:27:32
什么情况下返回0?
2021-03-24 13:27:32
谨防!如果您最近对元素进行了某些 DOM 修改,则 offsetHeight/offsetWidth 可以返回 0。修改元素后,您可能必须在 setTimeout 调用中调用此代码。
2021-03-26 13:27:32
@JDandChips:offsetWidth如果元素是display:none,则为0 ,而width在这种情况下,计算结果可能仍为正值。visibility:hidden不影响offsetWidth.
2021-03-30 13:27:32

看看Element.getBoundingClientRect()

该方法将返回包含一个对象widthheight以及其他一些有用的值:

{
    width: 960,
    height: 71,
    top: 603,
    bottom: 674,
    left: 360,
    right: 1320
}

例如:

var element = document.getElementById('foo');
var positionInfo = element.getBoundingClientRect();
var height = positionInfo.height;
var width = positionInfo.width;

我相信这不会有问题.offsetWidth,并.offsetHeight做他们有时会返回0(在讨论的意见在这里

另一个区别是getBoundingClientRect()可能返回小数像素,其中.offsetWidth.offsetHeight将四舍五入到最接近的整数。

IE8 注意getBoundingClientRectIE8及以下不返回高度和宽度。*

如果您必须支持 IE8,请使用.offsetWidth.offsetHeight

var height = element.offsetHeight;
var width = element.offsetWidth;

值得注意的是,该方法返回的Object并不是真正的普通对象。它的属性不可枚举(因此,例如,Object.keys不能开箱即用。)

此处的更多信息: 如何最好地将 ClientRect / DomRect 转换为普通对象

参考:

getboundingClientRect()将返回通过CSS缩放而元件的实际宽度和高度offsetHeightoffsetWidth不会。
2021-03-29 13:27:32

注意这个答案是在 2008 年写的。当时对于大多数人来说,最好的跨浏览器解决方案确实是使用 jQuery。我将答案留在这里供后代使用,如果您使用 jQuery,这是一个很好的方法。如果您使用的是其他框架或纯 JavaScript,则可接受的答案可能是可行的方法。

从 jQuery 1.2.6 开始,您可以使用其中一个核心CSS 函数, heightand width(或outerHeightand outerWidth,视情况而定)。

var height = $("#myDiv").height();
var width = $("#myDiv").width();

var docHeight = $(document).height();
var docWidth = $(document).width();

以防万一它对任何人有用,我都使用相同的 css 放置了一个文本框、按钮和 div:

width:200px;
height:20px;
border:solid 1px #000;
padding:2px;

<input id="t" type="text" />
<input id="b" type="button" />
<div   id="d"></div>

我在 chrome、firefox 和 ie-edge 中尝试过,我尝试过使用 jquery 和不使用 jquery,我尝试过使用和不使用box-sizing:border-box. 始终与<!DOCTYPE html>

结果:

                                                               Firefox       Chrome        IE-Edge    
                                                              with   w/o    with   w/o    with   w/o     box-sizing

$("#t").width()                                               194    200    194    200    194    200
$("#b").width()                                               194    194    194    194    194    194
$("#d").width()                                               194    200    194    200    194    200

$("#t").outerWidth()                                          200    206    200    206    200    206
$("#b").outerWidth()                                          200    200    200    200    200    200
$("#d").outerWidth()                                          200    206    200    206    200    206

$("#t").innerWidth()                                          198    204    198    204    198    204
$("#b").innerWidth()                                          198    198    198    198    198    198
$("#d").innerWidth()                                          198    204    198    204    198    204

$("#t").css('width')                                          200px  200px  200px  200px  200px  200px
$("#b").css('width')                                          200px  200px  200px  200px  200px  200px
$("#d").css('width')                                          200px  200px  200px  200px  200px  200px

$("#t").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#b").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#d").css('border-left-width')                              1px    1px    1px    1px    1px    1px

$("#t").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#b").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#d").css('padding-left')                                   2px    2px    2px    2px    2px    2px

document.getElementById("t").getBoundingClientRect().width    200    206    200    206    200    206
document.getElementById("b").getBoundingClientRect().width    200    200    200    200    200    200
document.getElementById("d").getBoundingClientRect().width    200    206    200    206    200    206

document.getElementById("t").offsetWidth                      200    206    200    206    200    206
document.getElementById("b").offsetWidth                      200    200    200    200    200    200
document.getElementById("d").offsetWidth                      200    206    200    206    200    206
不是为了回答这个问题 - 它已经被回答了。只是一些有用的信息,是的,所有主要的最新版本浏览器都同意这些值——这是一件好事。
2021-03-12 13:27:32
好吧......如果你的意图不是回答这个问题,那么这并不真正属于这里(作为“答案”)。我会考虑将其放在一些外部资源(可能是 GitHub 要点或博客文章)中,并将其链接到对原始问题或其中一个答案的评论中。
2021-03-16 13:27:32
@ZachLysobey 每条规则都有例外——这是一件很酷、很有用的事情。
2021-03-17 13:27:32
只是要清楚......这些浏览器中的任何一个都做任何与彼此不同的事情吗?我找不到任何差异......另外,我还没有投票(还),但这并没有真正直接回答这个问题,尽管它可以很容易地编辑来这样做。
2021-04-09 13:27:32

根据MDN:确定元素的尺寸

offsetWidthoffsetHeight返回“元素占用的空间总量,包括可见内容的宽度、滚动条(如果有)、内边距和边框”

clientWidthclientHeight返回“实际显示内容占用多少空间,包括填充但不包括边框、边距或滚动条”

scrollWidthscrollHeight返回“内容的实际大小,无论当前有多少可见”

所以这取决于被测内容是否预计会超出当前的可视区域。

2021-03-29 13:27:32