如何获得元素的渲染高度?


405

如何获得元素的渲染高度?

假设您的<div>元素内部包含一些内容。内部的内容将扩大的高度<div>。当您没有明确设置高度时,如何获得“渲染的”高度。显然,我尝试过:

var h = document.getElementById('someDiv').style.height;

有这样做的技巧吗?如果有帮助,我正在使用jQuery。


Answers:


183

应该是

$('#someDiv').height();

jQuery。这将以数字形式检索包装集中的第一个项目的高度。

尝试使用

.style.height

仅当您首先将属性设置为有效。不是很有用!


1
一个字-太棒了!感谢大家的参与。关于此线程的很多很好的信息。这将允许我使用CSS将页面居中,但使用jQuery可以使“容器” div的整体高度正确,而不必冒险使用CSS hackville。再次感谢。
BuddyJoe

3
即使您不使用jQuery也不可以,或者我不想这样做,我强烈建议任何人只使用offsetHeight来实现此目的,然后下载jQuery源并搜索“ height”以查找他们使用的代码。那里有很多疯狂的东西!
Simon_Weaver

1
@matejkramny-这个问题和答案已经超过5年了。OP已经在他们的站点上使用jQuery,所以与其重新实现相同/相似的逻辑,为什么不使用已经使用过的jQuery函数呢?我同意jQuery在很多事情上都是过高的,并且我不害怕普通的JS,但是当库中有一个函数可以完全满足您的需要时,不使用它似乎很愚蠢,尤其是出于某种原因“在这里没有发明”
Russ Cam 2014年

3
@matejkramny在问问题时,OP的意图是获取元素的渲染高度,而不是了解DOM和幕后发生的事情;如果那是他们的意图,他们问了错误的问题。我同意人们应该倾向于理解他们使用的库和框架,知识就是力量以及所有这些,但是有时候人们只想回答一个特定问题。实际上,以上注释已经建议您仔细阅读jQuery代码,以了解幕后情况。
Russ Cam 2014年

21
对于OP,使用jQuery是有效的答案。从那时起,对于全世界其他人来说,非jQuery答案是最好的答案。也许SO需要适应现实,也许应该以某种方式比获得公认的方式更突出地投票最高的答案。
Dimitris

1219

尝试以下方法之一:

var h = document.getElementById('someDiv').clientHeight;
var h = document.getElementById('someDiv').offsetHeight;
var h = document.getElementById('someDiv').scrollHeight;

clientHeight 包括高度和垂直填充。

offsetHeight 包括高度,垂直填充和垂直边框。

scrollHeight 包括所含文档的高度(滚动时将大于高度),垂直填充和垂直边框。


3
谢谢,我不知道这个属性。它也与IE8 +兼容。
lyubeto 2014年

我对clientHeight的含义感到困惑。我有一个div元素,其中有一堆p元素,其内容远远超出了浏览器向下的可视区域。我希望clientHeight可以提供渲染的高度,而scrollHeight可以提供完整的长度。但是它们几乎相等(仅在边距,填充等方面有所不同)。
bahti 2015年

10
@bahti除非它本身具有有限的高度,并且其溢出:隐藏或某种形式的溢出:滚动,否则该元素将展开(无论您是否查看)以显示所有内容,并且scrollHeight和clientHeight将相等。
Ulad Kasach '16

4
很好的答案,但从逻辑上讲,影响元素高度的边界是水平的顶部和底部边界。这个答案将它们称为“垂直边界”。只是以为我会掉2美分
Kehlan Krumme '16

1
据我所知,如果显示.clientWidth/.clientHeight 滚动则不包括滚动宽度。如果您想包括滚动宽度,可以element.getBoundingClientRect().width 改用
Dmitry


49

您可以.outerHeight()用于此目的。

它将为您提供元素的完整渲染高度。另外,您无需设置任何css-height元素。为了预防起见,您可以保持其高度为自动,以便可以根据内容的高度进行渲染。

//if you need height of div excluding margin/padding/border
$('#someDiv').height();

//if you need height of div with padding but without border + margin
$('#someDiv').innerHeight();

// if you need height of div including padding and border
$('#someDiv').outerHeight();

//and at last for including border + margin + padding, can use
$('#someDiv').outerHeight(true);

为了清楚地了解这些功能,您可以访问jQuery的站点或此处详细文章

它将清除/ / 之间的区别.height()innerHeight()outerHeight()


1
谢谢。在使用花车时,我在调高高度时遇到很多麻烦,但是那时还没有经验。我通常没有设置高度,除非是在一些复杂的布局脚本中,我最初会清除该字段,但是将其设置为与以相同顶部结尾的每个块(Div)相等。调整窗口大小时,即使块之间只有一个像素的差异也可能会破坏布局。
DHorse

1
顺便说一句,我认为offset具有一些与浏览器版本有关的用途,这消除了边距。
DHorse

2
这个问题不需要jQuery。啊。
dthree

1
@dthree我认为他清楚地提到了他正在使用jQuery。(也包含在Tag中):)
开放免费

44

我用它来获取元素的高度(返回float)

document.getElementById('someDiv').getBoundingClientRect().height

当您使用虚拟DOM时,它也适用。我在Vue中这样使用它:

this.$refs['some-ref'].getBoundingClientRect().height

1
getBoundingClientRect()高度返回一个浮点数(而其他人返回整数),好:)。
阿里

31
style = window.getComputedStyle(your_element);

然后简单地: style.height


14

绝对使用

$('#someDiv').height()   // to read it

要么

$('#someDiv').height(newHeight)  // to set it

我将其发布为其他答案,因为我刚刚学到了一些重要的事情。

刚才我几乎陷入使用offsetHeight的陷阱。这是发生了什么事:

  • 我使用了一个很好的老技巧,即使用调试器来“观察”元素具有的属性
  • 我看到哪个人的价值与我期望的价值相近
  • 它是offsetHeight-所以我用了。
  • 然后我意识到它不适用于隐藏的DIV
  • 我在计算maxHeight之后尝试隐藏,但看起来笨拙-陷入混乱。
  • 我进行了搜索-发现了jQuery.height()-并使用了它
  • 发现height()甚至对隐藏的元素也有效
  • 只是为了好玩,我检查了高度/宽度的jQuery实现

这只是其中的一部分:

Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) 

是的,它同时查看滚动和偏移量。如果失败,则进一步考虑浏览器和CSS兼容性问题。换句话说,STUFF我不在乎-或想要。

但我不必。谢谢jQuery!

这个故事的寓意是:如果jQuery有某种方法,可能是出于充分的原因,可能与兼容性有关。

如果您最近没有阅读jQuery方法列表,建议您看一下。


在问题级别看到了您的其他评论。我在jQuery上卖了。已经有一段时间了。但这密封了交易。我爱上这个简单的东西为我解决了数百个布局问题的事实(主要是在我知道运行JavaScript的Intranet网站上)。
BuddyJoe

13
document.querySelector('.project_list_div').offsetHeight;

4
为您的解决方案添加说明
Freelancer '18

然后offsetHeight
Ritwik

6
此属性会将值四舍五入为整数。如果需要浮点值,请使用elem.getBoundingClientRect().height
Penny Liu

12

我编写了一个甚至不需要JQuery的简单代码,可能会帮助一些人。加载后获得“ ID1”的总高度,并在“ ID2”上使用

function anyName(){
    var varname=document.getElementById('ID1').offsetHeight;
    document.getElementById('ID2').style.height=varname+'px';
}

然后只需设置要加载的主体

<body onload='anyName()'>

这很有用,我在更复杂的代码中采用了类似的方法。
DHorse

10

嗯,我们可以获得元素几何...

var geometry;
geometry={};
var element=document.getElementById(#ibims);
var rect = element.getBoundingClientRect();
this.geometry.top=rect.top;
this.geometry.right=rect.right;
this.geometry.bottom=rect.bottom;
this.geometry.left=rect.left;
this.geometry.height=this.geometry.bottom-this.geometry.top;
this.geometry.width=this.geometry.right-this.geometry.left;
console.log(this.geometry);

这个普通的JS怎么样?


1
var geometry; geometry={};可以简单地是var geometry={};
Mark Schultheiss

10

我认为在2020年做到这一点的最佳方法是使用纯js和 getBoundingClientRect().height;

这是一个例子

let div = document.querySelector('div');
let divHeight = div.getBoundingClientRect().height;

console.log(`Div Height: ${divHeight}`);
<div>
  How high am I? 🥴
</div>

除了获得height这种方式之外,我们还可以访问有关的其他内容div

let div = document.querySelector('div');
let divInfo = div.getBoundingClientRect();

console.log(divInfo);
<div>What else am I? 🥴</div>


8

这是答案吗?

“如果您需要计算但不显示某些内容,请将元素设置为visibility:hiddenposition:absolute,将其添加到DOM树中,获取offsetHeight并将其删除。(这就是我上次检查时原型库所做的工作)。”

我在许多要素上都有同样的问题。该网站上没有使用jQuery或Prototype,但我都赞成在可行的情况下借用该技术。作为某些无法正常工作的示例,然后执行了以下操作,我有以下代码:

// Layout Height Get
function fnElementHeightMaxGet(DoScroll, DoBase, elementPassed, elementHeightDefault)
{
    var DoOffset = true;
    if (!elementPassed) { return 0; }
    if (!elementPassed.style) { return 0; }
    var thisHeight = 0;
    var heightBase = parseInt(elementPassed.style.height);
    var heightOffset = parseInt(elementPassed.offsetHeight);
    var heightScroll = parseInt(elementPassed.scrollHeight);
    var heightClient = parseInt(elementPassed.clientHeight);
    var heightNode = 0;
    var heightRects = 0;
    //
    if (DoBase) {
        if (heightBase > thisHeight) { thisHeight = heightBase; }
    }
    if (DoOffset) {
        if (heightOffset > thisHeight) { thisHeight = heightOffset; }
    }
    if (DoScroll) {
        if (heightScroll > thisHeight) { thisHeight = heightScroll; }
    }
    //
    if (thisHeight == 0) { thisHeight = heightClient; }
    //
    if (thisHeight == 0) { 
        // Dom Add:
        // all else failed so use the protype approach...
        var elBodyTempContainer = document.getElementById('BodyTempContainer');
        elBodyTempContainer.appendChild(elementPassed);
        heightNode = elBodyTempContainer.childNodes[0].offsetHeight;
        elBodyTempContainer.removeChild(elementPassed);
        if (heightNode > thisHeight) { thisHeight = heightNode; }
        //
        // Bounding Rect:
        // Or this approach...
        var clientRects = elementPassed.getClientRects();
        heightRects = clientRects.height;
        if (heightRects > thisHeight) { thisHeight = heightRects; }
    }
    //
    // Default height not appropriate here
    // if (thisHeight == 0) { thisHeight = elementHeightDefault; }
    if (thisHeight > 3000) {
        // ERROR
        thisHeight = 3000;
    }
    return thisHeight;
}

基本上,它尝试任何事情都只能得到零结果。ClientHeight没有影响。使用问题元素时,我通常在底部获得NaN,在“偏移”和“滚动”高度中获得零。然后,我尝试了Add DOM解决方案和clientRects来查看它是否在这里工作。

2011年6月29日,我确实确实更新了代码,尝试同时添加到DOM和clientHeight中,结果均超出预期。

1)clientHeight也为0。

2)Dom实际上给了我一个很高的高度。

3)ClientRects返回的结果几乎与DOM技术相同。

因为添加的元素本质上是流动的,所以当将它们添加到否则为空的DOM Temp元素时,将根据该容器的宽度进行渲染。这变得很奇怪,因为比最终结束的时间短30px。

我添加了一些快照来说明如何以不同的方式计算高度。 正常显示菜单块 菜单块已添加到DOM Temp元素

高度差异很明显。我当然可以添加绝对的定位和隐藏的内容,但是我相信这不会起作用。我仍然坚信这行不通!

(我进一步说明)高度(渲染)低于真实渲染的高度。这可以通过将DOM Temp元素的宽度设置为与现有父级匹配来解决,并且在理论上可以相当准确地完成。我也不知道删除它们并将它们重新添加到现有位置会导致什么。当他们通过innerHTML技术到达时,我将使用这种不同的方法。

*但是*不必要。实际上,它按照广告宣传工作并返回了正确的高度!!!

当我能够再次看到菜单时,DOM惊人地返回了页面顶部每个流体布局的正确高度(279px)。上面的代码还使用了返回280px的getClientRects。

以下快照对此进行了说明(工作时从Chrome拍摄)。
在此处输入图片说明

现在,我不知道为什么该原型技巧有效,但是似乎可以。另外,getClientRects也可以。

我怀疑这些特定元素造成的所有麻烦的原因是使用innerHTML而不是appendChild,但这只是纯粹的推测。


6

offsetHeight,通常。

如果您需要计算但不显示某些内容,请将元素设置为visibility:hiddenposition:absolute,将其添加到DOM树中,获取offsetHeight并删除它。(这就是我上次检查时原型库在后台执行的操作)。


有趣。我从来没有检查过原型。知道为什么jQuery在后台不这样做吗?
Simon_Weaver

我看到有困难时就进行了测试,并测试了该技术,并且在纯JavaScript中效果很好
DHorse 2013年

5

有时offsetHeight会返回零,因为您创建的元素尚未在Dom中呈现。我在这种情况下编写了此函数:

function getHeight(element)
{
    var e = element.cloneNode(true);
    e.style.visibility = "hidden";
    document.body.appendChild(e);
    var height = e.offsetHeight + 0;
    document.body.removeChild(e);
    e.style.visibility = "visible";
    return height;
}

您需要克隆该元素,否则它将从dom中完全删除,这在您的代码中似乎将发生。
punkbit

此代码无意将元素保留在DOM中。打算将其简短地放入DOM(足够长以呈现它并获得其高度),然后将其取出。稍后您可以稍后将该元素放入dom中的其他位置(在执行操作之前先知道其高度)。注意函数名称“ getHeight”;这就是代码要完成的全部工作。
Lonnie Best

@punkbit:我明白你的意思。您的元素已经在dom中。我编写的代码用于DOM中尚未存在的元素。正如您所说,克隆会更好,因为元素是否在dom中都没有关系。
Lonnie Best

@punkbit:我使用克隆修改了代码,但尚未对其进行测试。
Lonnie Best

是的,那是我的意思。在我看来,他对DOM中的现有元素说“元素”。但是一切都很好!不要误会。
punkbit

4

如前所述,如果您已经在使用jQuery,则最好的选择是.outerHeight().height()

如果没有jQuery,则可以检查使用中的框大小并添加各种填充+边框+ clientHeight,或者可以使用getComputedStyle

var h = getComputedStyle(document.getElementById('someDiv'))。height;

h 现在将是一个类似于“ 53.825px”的字符串。

而且我找不到引用,但是我想我听说getComputedStyle()它可能会很昂贵,所以您可能不想在每个window.onscroll事件上都调用它(但是,jQuery都不是height())。


达到的高度后getComputedStyle,可使用parseInt(h, 10)获取整数进行计算。
RhodanV5500 '16


1

如果我正确理解了您的问题,那么可能会有所帮助:

function testDistance(node1, node2) {
    /* get top position of node 1 */
    let n1Pos = node1.offsetTop;
    /* get height of node 1 */
    let n1Height = node1.clientHeight;
    /* get top position of node 2 */
    let n2Pos = node2.offsetTop;
    /* get height of node 2 */
    let n2Height = node2.clientHeight;

    /* add height of both nodes */
    let heightTogether = n1Height + n2Height;
    /* calculate distance from top of node 1 to bottom of node 2 */
    let actualDistance = (n2Pos + n2Height) - n1Pos;

    /* if the distance between top of node 1 and bottom of node 2
       is bigger than their heights combined, than there is something between them */
    if (actualDistance > heightTogether) {
        /* do something here if they are not together */
        console.log('they are not together');
    } else {
        /* do something here if they are together */
        console.log('together');
    } 
}

-4

您是否已在CSS中专门设置高度?如果没有,则需要使用offsetHeight;而不是height

var h = document.getElementById('someDiv').style.offsetHeight;

8
offsetHeight是元素本身的属性,而不是其样式。
Shog9,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.