OffsetHeight, clientHeight, scrollHeight là gì?


235

Nghĩ đến việc giải thích sự khác biệt giữa là gì offsetHeight, clientHeightscrollHeighthay offsetWidth, clientWidthscrollWidth?

Người ta phải biết sự khác biệt này trước khi làm việc về phía khách hàng. Nếu không, một nửa cuộc đời của họ sẽ được dành để sửa giao diện người dùng.

Fiddle , hoặc nội tuyến dưới đây:

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>


6
Câu hỏi này dường như lạc đề vì nó chỉ cung cấp một mẹo. Câu hỏi duy nhất là trong tiêu đề 'câu hỏi'.
boostzflep

Câu trả lời:


542

Để biết sự khác biệt bạn phải hiểu mô hình hộp , nhưng về cơ bản:

clientHeight :

trả về chiều cao bên trong của một phần tử bằng pixel, bao gồm phần đệm nhưng không trả về chiều cao , đường viền hoặc lề của thanh cuộn ngang

offsetHeight :

là một phép đo bao gồm các đường viền phần tử , phần đệm dọc của phần tử, thanh cuộn ngang của phần tử (nếu có, nếu được hiển thị) và chiều cao CSS của phần tử.

cuộnHeight :

là phép đo chiều cao của nội dung của một thành phần bao gồm nội dung không hiển thị trên màn hình do tràn


Tôi sẽ làm cho nó dễ dàng hơn:

Xem xét:

<element>                                     
    <!-- *content*: child nodes: -->        | content
    A child node as text node               | of
    <div id="another_child_node"></div>     | the
    ... and I am the 4th child node         | element
</element>                                    

scrollHeight : ENTIRE content & padding (visible or not)
Chiều cao của tất cả nội dung + phần đệm, mặc dù chiều cao của phần tử.

clientHeight : VISIBLE content & padding
Chỉ chiều cao có thể nhìn thấy: phần nội dung bị giới hạn bởi chiều cao được xác định rõ ràng của phần tử.

offsetHeight : VISIBLE content & padding + border + scrollbar
Chiều cao chiếm bởi phần tử trên tài liệu.

cuộn cao clientHeight và offsetHeight


và nếu bạn chỉ muốn chiều cao có thể nhìn thấy
Muhammad Umer

2
Các clientHeightlà chiều cao có thể nhìn thấy
Andre Figueiredo

9
Đây là lý do tại sao tôi yêu SO, cảm ơn vì nỗ lực để làm cho nó rõ ràng!
Herick

2
Lưu ý: offsetHeight có thể trả về null nếu phần tử có vị trí: đã sửa. SVG offsetHeight đang bị phản đối trong Chrome. offsetHeight sẽ truy xuất null nếu phần tử được hiển thị: none hoặc có tổ tiên có hiển thị: none
Drenai

3
Tôi scrollHeightclientHeightcả hai đều xuất hiện như nhau mặc dù màn hình có nhiều nội dung và thanh cuộn. Tại sao?
trống

5

* offsetHeight là phép đo bằng pixel theo chiều cao CSS của phần tử, bao gồm viền, phần đệm và thanh cuộn ngang của phần tử.

* thuộc tính clientHeight trả về chiều cao có thể xem của một phần tử bằng pixel, bao gồm cả phần đệm, nhưng không phải là đường viền, thanh cuộn hoặc lề.

* scrollHeight value bằng với chiều cao tối thiểu mà phần tử sẽ yêu cầu để phù hợp với tất cả nội dung trong chế độ xem mà không cần sử dụng thanh cuộn dọc. Chiều cao được đo theo cách tương tự như clientHeight: nó bao gồm phần đệm của phần tử, nhưng không bao gồm đường viền, lề hoặc thanh cuộn ngang của nó.

Tương tự là trường hợp cho tất cả những điều này với chiều rộng thay vì chiều cao.


2

Mô tả của tôi cho ba:

  • offsetHeight : Phần tử "định vị tương đối" của cha mẹ được chiếm bao nhiêu bởi phần tử. (tức là nó bỏ qua position: absolutehậu duệ của phần tử )
  • clientHeight : Tương tự như chiều cao bù, ngoại trừ nó loại trừ đường viền, lề và chiều cao của thanh cuộn ngang của phần tử (nếu có).
  • scrollHeight : Cần bao nhiêu không gian để xem tất cả nội dung / hậu duệ của phần tử (bao gồm cả phần tử position: absolute) mà không cần cuộn.

Sau đó, cũng có:


Lưu ý về biến đổi css là khá quan trọng trong trường hợp này.
Jan Bradáč

0

Offset có nghĩa là "số lượng hoặc khoảng cách mà một cái gì đó nằm ngoài đường". Ký quỹ hoặc Biên giới là thứ gì đó làm cho chiều cao hoặc chiều rộng thực tế của phần tử HTML "không khớp". Nó sẽ giúp bạn nhớ rằng:

  • offsetHeight là phép đo bằng pixel theo chiều cao CSS của phần tử, bao gồm viền, phần đệm và thanh cuộn ngang của phần tử.

Mặt khác, clientHeight là thứ mà bạn có thể nói ngược lại với OffsetHeight. Nó không bao gồm đường viền hoặc lề. Nó bao gồm phần đệm bởi vì nó là thứ nằm trong bộ chứa HTML, vì vậy nó không được tính là các phép đo bổ sung như lề hoặc viền. Vì thế :

  • thuộc tính clientHeight trả về chiều cao có thể xem của một phần tử bằng pixel, bao gồm cả phần đệm, nhưng không phải là đường viền, thanh cuộn hoặc lề.

ScrollHeight là tất cả các khu vực có thể cuộn, do đó, cuộn của bạn sẽ không bao giờ chạy trên lề hoặc viền của bạn, vì vậy đó là lý do tại sao scrollHeight không bao gồm lề hoặc viền nhưng vâng, vâng. Vì thế:

  • scrollHeight value bằng với chiều cao tối thiểu mà phần tử sẽ yêu cầu để phù hợp với tất cả nội dung trong chế độ xem mà không cần sử dụng thanh cuộn dọc. Chiều cao được đo theo cách tương tự như clientHeight: nó bao gồm phần đệm của phần tử, nhưng không bao gồm đường viền, lề hoặc thanh cuộn ngang của nó.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.