offsetHeight和clientHeight之间的差异


Answers:


203

clientHeight

返回对象可见区域的高度,以像素为单位。该值包含带有填充的高度,但不包括scrollBar,border和margin。

offsetHeight

返回对象可见区域的高度,以像素为单位。该值包含带有边距,scrollBar和边框的高度,但不包括边距。

因此,不offsetHeight包括滚动条和边框clientHeight


3
我注意到的另一件事是clientHeight比offsetHeight快得多。你知道为什么吗
disc0dancer 2013年

2
@ disc0dancer-可能是因为浏览器已经具有clientSize随时可用的(毕竟,它是视口),但是offsetHeight在重排整个文档之后需要计算吗?
Oded

好了,Webkit检查员说,即使在请求clientHeigh时,重排也存在于整个文档中。
disc0dancer 2013年

2
@ disc0dancer-我的猜测非常多。但这是实现的事情-不确定所有浏览器都是那样。
Oded

83

奥德的答案是理论。但是理论和现实并不总是相同的,至少对于<BODY>或<HTML>元素而言并非如此,这对于JavaScript中的滚动操作可能很重要。

微软在MSDN中有一个不错的形象:

ClientHeight,OffsetHeight,ScrollHeight

如果您有一个显示垂直滚动条的HTML页面,则可以期望<BODY>或<HTML>元素的ScrollHeight字体比OffsetHeight更高,如该图所示。所有旧版本的Internet Explorer都是如此。

但是对于Internet Explorer 11和Firefox 36并非如此。至少在这些浏览器中,OffsetHeight与ScrollHeight几乎相同,这是错误的。

尽管OffsetHeight可能是错误的,但ClientHeight总是正确的。

在不同的浏览器上尝试以下代码,您将看到:

<!DOCTYPE html>
<html>
<body>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<script>
    document.write("Body off: " + document.body.offsetHeight 
             + "<br>Body cli: " + document.body.clientHeight
             + "<br>Html off: " + document.body.parentElement.offsetHeight               
             + "<br>Html cli: " + document.body.parentElement.clientHeight);
</script>
</body>
</html>

尽管较旧的Internet Explorer可以正确显示:

Body off: 1197
Body cli: 1197
Html off: 878
Html cli: 874  

Firefox和Internet Explorer 11的输出为:

Body off: 1260
Body cli: 1260
Html off: 1276   // this is completely wrong
Html cli: 889

这清楚表明offsetHeight在这里是错误的。OffsetHeight和ClientHeight应该仅相差几个像素或相同。


请注意,对于不可见的元素,例如<FORM>,ClientHeight和OffsetHeight可能也有很大的不同,其中<set>其中OffsetHeight可能是FORM的实际大小,而ClientHeight可能是零。

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.