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

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

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

答案

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

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

看一下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 注意getBoundingClientRect不会在IE8及更低版本上返回高度和宽度。*

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

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

值得注意的是,此方法返回的对象实际上不是普通对象。它的属性是不可枚举的 (例如, Object.keys不能直接使用。)

有关此的更多信息: 如何最好地将 ClientRect / DomRect 转换为纯对象

参考:

注意此答案写于 2008 年。当时,对于大多数人来说,最好的跨浏览器解决方案实际上是使用 jQuery。我为后代保留答案,如果您使用的是 jQuery,这是一种很好的方法。如果您使用的是其他框架或纯 JavaScript,那么可能会采用可接受的答案。

从 jQuery 1.2.6 开始,您可以使用CSS的核心功能之一heightwidth (或适当的outerHeightouterWidth )。

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

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

万一它对任何人都有用,我将文本框,按钮和 div 都使用相同的 CSS:

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

根据MDN:确定元素的尺寸

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

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

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

因此,这取决于所测量的内容是否期望超出当前可见区域。

您只需要为 IE7 和更早的版本(仅在您的内容没有固定大小的情况下)进行计算即可。我建议使用 HTML 条件注释,以将骇客行为限制为不支持 CSS2 的旧 IE。对于所有其他浏览器,请使用以下命令:

<style type="text/css">
    html,body {display:table; height:100%;width:100%;margin:0;padding:0;}
    body {display:table-cell; vertical-align:middle;}
    div {display:table; margin:0 auto; background:red;}
</style>
<body><div>test<br>test</div></body>

这是完美的解决方案。它可以将任何大小的<div>居中,并将其收缩包装到其内容的大小。

修改元素样式很容易,但是读取值有点棘手。

除非您使用 javascript 中的内置方法调用 getComputedStyle,否则 JavaScript 无法读取任何来自 css(内部 / 外部)的元素样式属性(elem.style)。

getComputedStyle(element [,pseudo])

元素:要读取其值的元素。
伪:伪元素(如果需要),例如:: before。空字符串或无参数表示元素本身。

结果是一个具有样式属性的对象,例如 elem.style,但现在针对所有 css 类。

例如,以下样式看不到边距:

<head>
  <style> body { color: red; margin: 5px } </style>
</head>
<body>

  <script>
    let computedStyle = getComputedStyle(document.body);

    // now we can read the margin and the color from it

    alert( computedStyle.marginTop ); // 5px
    alert( computedStyle.color ); // rgb(255, 0, 0)
  </script>

</body>

因此修改了您的 javaScript 代码,使其包含要获取其宽度 / 高度或其他属性的元素的 getComputedStyle

window.onload = function() {

    var test = document.getElementById("test");
    test.addEventListener("click", select);


    function select(e) {                                  
        var elementID = e.target.id;
        var element = document.getElementById(elementID);
        let computedStyle = getComputedStyle(element);
        var width = computedStyle.width;
        console.log(element);
        console.log(width);
    }

}

计算和解析值

CSS 中有两个概念:

计算出的样式值是所有 CSS 规则和 CSS 继承都应用后的值,这是 CSS 级联的结果。它看起来像 height:1em 或 font-size:125%。

解析的样式值是最终应用于元素的样式值。诸如 1em 或 125%的值是相对的。浏览器获取计算值,并使所有单位固定且绝对,例如:height:20px 或 font-size:16px。对于几何属性,解析后的值可能具有浮点,例如 width:50.5px。

很久以前,创建了 getComputedStyle 来获取计算值,但事实证明,解析后的值更加方便,并且更改了标准。
因此,如今 getComputedStyle 实际上返回属性的解析值。

请注意:

getComputedStyle 需要完整的属性名称

您应该始终询问所需的确切属性,例如 paddingLeft 或 height 或 width。否则,不能保证正确的结果。

例如,如果有属性 paddingLeft / paddingTop,那么对于 getComputedStyle(elem).padding 我们应该得到什么?什么都没有,或者可能是已知填充的 “生成” 值?这里没有标准规则。

还有其他不一致之处。例如,某些浏览器(Chrome)在下面的文档中显示 10px,而某些浏览器(Firefox)–不显示:

<style>
  body {
    margin: 30px;
    height: 900px;
  }
</style>
<script>
  let style = getComputedStyle(document.body);
  alert(style.margin); // empty string in Firefox
</script>

有关更多信息, 请参见 https://javascript.info/styles-and-classes

正如上一篇文章中所建议的那样,应该执行 element.offsetWidth 和 element.offsetHeight。

但是,如果只想使内容居中,则有更好的方法。假设您使用 xhtml 严格 DOCTYPE。将 body:0 设置 margin:0,auto 属性和所需的宽度(以 px 为单位)内容与页面居中对齐。

... 似乎 CSS 帮助将 div 放在中心位置...

<style>
 .monitor {
 position:fixed;/* ... absolute possible if on :root */
 top:0;bottom:0;right:0;left:0;
 visibility:hidden;
 }
 .wrapper {
 width:200px;/* this is size range */
 height:100px;
 position:absolute;
 left:50%;top:50%;
 visibility:hidden;
 }

 .content {
 position:absolute;
 width: 100%;height:100%;
 left:-50%;top:-50%;
 visibility:visible;
 }

</style>

 <div class="monitor">
  <div class="wrapper">
   <div class="content">

 ... so you hav div 200px*100px on center ...

  </div>
 </div>
</div>

您也可以使用以下代码:

var divID = document.getElementById("divid");

var h = divID.style.pixelHeight;