Мысль объяснить, в чем разница offsetHeight
, clientHeight
и scrollHeight
или offsetWidth
, clientWidth
и scrollWidth
?
Надо знать эту разницу, прежде чем работать на стороне клиента. В противном случае половина их жизни будет потрачена на исправление пользовательского интерфейса.
Скрипка или строчка ниже:
function whatis(propType) {
var mainDiv = document.getElementById("MainDIV");
if (window.sampleDiv == null) {
var div = document.createElement("div");
window.sampleDiv = div;
}
div = window.sampleDiv;
var propTypeWidth = propType.toLowerCase() + "Width";
var propTypeHeight = propType + "Height";
var computedStyle = window.getComputedStyle(mainDiv, null);
var borderLeftWidth = computedStyle.getPropertyValue("border-left-width");
var borderTopWidth = computedStyle.getPropertyValue("border-top-width");
div.style.position = "absolute";
div.style.left = mainDiv.offsetLeft + Math.round(parseFloat((propType == "client") ? borderLeftWidth : 0)) + "px";
div.style.top = mainDiv.offsetTop + Math.round(parseFloat((propType == "client") ? borderTopWidth : 0)) + "px";
div.style.height = mainDiv[propTypeHeight] + "px";
div.style.lineHeight = mainDiv[propTypeHeight] + "px";
div.style.width = mainDiv[propTypeWidth] + "px";
div.style.textAlign = "center";
div.innerHTML = propTypeWidth + " X " + propTypeHeight + "( " +
mainDiv[propTypeWidth] + " x " + mainDiv[propTypeHeight] + " )";
div.style.background = "rgba(0,0,255,0.5)";
document.body.appendChild(div);
}
document.getElementById("offset").onclick = function() {
whatis('offset');
}
document.getElementById("client").onclick = function() {
whatis('client');
}
document.getElementById("scroll").onclick = function() {
whatis('scroll');
}
#MainDIV {
border: 5px solid red;
}
<button id="offset">offsetHeight & offsetWidth</button>
<button id="client">clientHeight & clientWidth</button>
<button id="scroll">scrollHeight & scrollWidth</button>
<div id="MainDIV" style="margin:auto; height:200px; width:400px; overflow:auto;">
<div style="height:400px; width:500px; overflow:hidden;">
</div>
</div>
javascript
html
dom
offsetheight
shibualexis
источник
источник
Ответы:
Чтобы понять разницу, вы должны понимать блочную модель , но в основном:
clientHeight :
offsetHeight :
scrollHeight :
Я сделаю это проще:
Рассматривать:
scrollHeight :
ENTIRE content & padding (visible or not)
высота всего содержимого + отступы, независимо от высоты элемента.
clientHeight :
VISIBLE content & padding
только видимая высота: часть содержимого, ограниченная явно определенной высотой элемента.
offsetHeight :
VISIBLE content & padding
+ border + scrollbar
высота, занимаемая элементом в документе.
источник
clientHeight
видимая высотаscrollHeight
иclientHeight
оба выглядят одинаково, несмотря на то, что на экране больше контента и полосы прокрутки. Зачем?* offsetHeight - это измерение в пикселях высоты CSS элемента, включая границы, отступы и горизонтальную полосу прокрутки элемента.
* Свойство clientHeight возвращает видимую высоту элемента в пикселях, включая отступы, но не границу, полосу прокрутки или поле.
* Значение scrollHeight равно минимальной высоте, которая требуется элементу для размещения всего содержимого в области просмотра без использования вертикальной полосы прокрутки. Высота измеряется так же, как clientHeight: она включает отступ элемента, но не его границу, поле или горизонтальную полосу прокрутки.
То же самое относится ко всем этим с шириной вместо высоты.
источник
Мои описания для трех:
position: absolute
потомков элемента )position: absolute
) без прокрутки.Тогда есть также:
источник
Смещение Означает «количество или расстояние, на которое что-то выходит за линию». Margin или Borders - это то, что делает фактическую высоту или ширину HTML-элемента «вне линии». Это поможет вам запомнить, что:
С другой стороны, clientHeight - это нечто противоположное OffsetHeight. Это не включает границу или поля. Он включает в себя заполнение, потому что оно находится внутри контейнера HTML, поэтому оно не считается дополнительными измерениями, такими как margin или border. Так :
ScrollHeight - это область прокрутки, поэтому ваш свиток никогда не переместится через ваше поле или границу, поэтому scrollHeight не включает поля или границы, но да, заполнение. Так:
источник