разница между offsetHeight и clientHeight


Ответы:


203

clientHeight :

Возвращает высоту видимой области для объекта в пикселях. Значение содержит высоту с отступом, но не включает scrollBar, border и margin.

offsetHeight :

Возвращает высоту видимой области для объекта в пикселях. Значение содержит высоту с отступом, полосой прокрутки и границей, но не включает поле.

Таким образом, offsetHeightвключает в себя полосу прокрутки и границы, clientHeightне.


3
Еще я заметил, что clientHeight намного быстрее, чем offsetHeight. У тебя есть идеи почему?
— disc0dancer

2
@ disc0dancer - Возможно, потому что браузер уже имеет clientSizeлегкодоступный (в конце концов, это окно просмотра), но нужно рассчитать offsetHeightпосле переформатирования всего документа?
— Одед

Что ж, инспектор webkit говорит, что перекомпоновки также относятся ко всему документу, даже когда он запрашивает clientHeigh.
— disc0dancer

2
@ disc0dancer - Так много для моего предположения. Но это вещь реализации - не уверен, что все браузеры такие.
— Одед

83

Ответ от Одеда - теория. Но теория и реальность не всегда одинаковы, по крайней мере, не для элементов <BODY> или <HTML>, которые могут быть важны для операций прокрутки в javascript.

У Microsoft есть хороший образ в 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 должны отличаться только на несколько пикселей или быть одинаковыми.


Обратите внимание, что ClientHeight и OffsetHeight также могут сильно отличаться для элементов, которые не видны, например, <FORM>, где OffsetHeight может быть реальным размером FORM, а ClientHeight может быть нулевым.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.