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

sno*_*ket 837 html javascript xhtml dhtml

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

我该怎么用?请包含有关浏览器兼容性的信息

Gre*_*reg 1211

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

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

  • 谨防!如果您最近对元素进行了某些DOM修改,offsetHeight/offsetWidth可以返回0.修改元素后,可能必须在setTimeout调用中调用此代码. (168认同)
  • @JDandChips:如果元素是`display:none`,`offsetWidth`将为0,而在这个实例中,计算的`width`可能仍然具有正值.`visibility:hidden`不会影响`offsetWidth`. (45认同)
  • 有关`.offsetWidth`和`.offsetHeight`的文档:https://developer.mozilla.org/en/Determining_the_dimensions_of_elements (36认同)
  • 在什么情况下会返回0? (29认同)
  • @Supuhstar:`clientWidth`与`offsetWidth`有不同的含义:后者使用"整个"框,包括内容,填充和边框; 而前者仅产生内容框的大小(因此,只要元素具有任何非零填充和/或边框,它将具有更小的值). (19认同)
  • 我无法确定`offsetWidth`在我的情况下返回0的原因,因为我最初没有编写代码,但在`onload`事件中我始终为0. (2认同)
  • @Supuhstar,它们有时会是相同的,例如当你设置`box-sizing:border-box`时,它会自动完成Bootstrap(我相信其他人). (2认同)

Zac*_*bey 185

看看Element.getBoundingClientRect().

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

{
    width: 960,
    height: 71,
    top: 603,
    bottom: 674,
    left: 360,
    right: 1320
}
Run Code Online (Sandbox Code Playgroud)

例如:

var element = document.getElementById('foo');
var positionInfo = element.getBoundingClientRect();
var height = positionInfo.height;
var width = positionInfo.width;
Run Code Online (Sandbox Code Playgroud)

我相信这不会有问题,.offsetWidth并且.offsetHeight有时会返回它们0(正如这里评论中所讨论的那样)

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

IE8注意:IE8及以下版本getBoundingClientRect不会返回高度和宽度.*

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

var height = element.offsetHeight;
var width = element.offsetWidth;
Run Code Online (Sandbox Code Playgroud)

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

有关这方面的更多信息: 如何最好地将ClientRect/DomRect转换为普通对象

参考:

  • getboundingClientRect()将返回通过css缩放的元素的实际宽度和高度,而`offsetHeight`和`offsetWidth`则不会. (8认同)

tva*_*son 66

注意:这个答案是在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();
Run Code Online (Sandbox Code Playgroud)


Gra*_*ham 44

为了防止它对任何人有用,我把一个文本框,按钮和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>
Run Code Online (Sandbox Code Playgroud)

我尝试使用chrome,firefox和ie-edge,我尝试使用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
Run Code Online (Sandbox Code Playgroud)

  • @ZachLysobey每个规则都有例外 - 这是一个很酷,有用的东西. (19认同)
  • 不是为了回答这个问题 - 它已经被回答了。只是一些有用的信息,是的,所有主要的最新版本浏览器都同意这些值——这是一件好事。 (3认同)
  • 好吧......如果你的意图是*不*回答问题,那么这并不属于这里(作为"答案").我会考虑将其放在一些外部资源(可能是GitHub要点或博客文章)中,并将其链接到原始问题或其中一个答案的评论中. (3认同)
  • 需要澄清的是……这些浏览器的做法是否有所不同?我找不到任何差异...另外,我还没有投反对票,但这并不能*真正*直接回答问题,尽管可以很容易地对其进行编辑。 (2认同)

Har*_*rel 14

根据MDN:确定元素的尺寸

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

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

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

因此,这取决于预计测量的内容是否超出当前可视区域.

  • 谢谢:这是一篇关于该内容的文章 https://www.javascripttutorial.net/javascript-dom/javascript-width-height/ (2认同)

Lek*_*ens 8

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

\n\n

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

\n\n
\n

getCompatedStyle(元素[,伪])

\n
\n\n

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

\n\n

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

\n\n

例如,这里的样式\xe2\x80\x99看不到边距:

\n\n
<head>\n  <style> body { color: red; margin: 5px } </style>\n</head>\n<body>\n\n  <script>\n    let computedStyle = getComputedStyle(document.body);\n\n    // now we can read the margin and the color from it\n\n    alert( computedStyle.marginTop ); // 5px\n    alert( computedStyle.color ); // rgb(255, 0, 0)\n  </script>\n\n</body>\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此修改了您的 javaScript 代码以包含您希望获取其宽度/高度或其他属性的元素的 getCompulatedStyle

\n\n
window.onload = function() {\n\n    var test = document.getElementById("test");\n    test.addEventListener("click", select);\n\n\n    function select(e) {                                  \n        var elementID = e.target.id;\n        var element = document.getElementById(elementID);\n        let computedStyle = getComputedStyle(element);\n        var width = computedStyle.width;\n        console.log(element);\n        console.log(width);\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

计算值和解析值

\n\n

CSS中有两个概念:

\n\n
\n

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

\n\n

已解析的样式值是最终应用于元素的样式值。\n 1em 或 125% 等值是相对的。浏览器采用计算出的\n值并使所有单位固定且绝对,例如:\n height:20px 或 font-size:16px。对于几何属性解析值\n可能有一个浮点,如宽度:50.5px。

\n
\n\n

很久以前,创建 getCompulatedStyle 是为了获取计算值,但事实证明解析值要方便得多,并且标准发生了变化。
\n所以现在 getComputedStyle 实际上返回属性的解析值。

\n\n

请注意:

\n\n

getCompatedStyle 需要完整的属性名称

\n\n
\n

您应该始终询问您想要的确切属性,例如 paddingLeft 或高度或宽度。否则无法保证正确的结果。

\n\n

例如,如果有属性 paddingLeft/paddingTop,那么我们应该为 getCompulatedStyle(elem).padding 获取什么?什么都没有,或者\n可能是已知填充中的\xe2\x80\x9c生成的\xe2\x80\x9d值?这里没有标准规则。

\n
\n\n

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

\n\n
<style>\n  body {\n    margin: 30px;\n    height: 900px;\n  }\n</style>\n<script>\n  let style = getComputedStyle(document.body);\n  alert(style.margin); // empty string in Firefox\n</script>\n
Run Code Online (Sandbox Code Playgroud)\n\n

欲了解更多信息https://javascript.info/styles-and-classes

\n


Kor*_*nel 5

您只需要为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>
Run Code Online (Sandbox Code Playgroud)

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