Có một bài viết hay về MDN giải thích lý thuyết đằng sau những khái niệm đó:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
Nó cũng giải thích sự khác biệt về khái niệm quan trọng giữa chiều rộng / chiều cao của ràng buộc so với offsetWidth / offsetHeight.
Sau đó, để chứng minh lý thuyết đúng hay sai, bạn cần một số bài kiểm tra. Đó là những gì tôi đã làm ở đây: https://github.com/lingtalfi/dimensions-chcoateet
Đó là thử nghiệm cho chrome53, ff49, safari9, edge13 và eg11.
Kết quả của các bài kiểm tra chứng minh rằng lý thuyết nói chung là đúng. Đối với các bài kiểm tra, tôi đã tạo ra 3 div chứa 10 đoạn lorem ipsum mỗi đoạn. Một số css đã được áp dụng cho họ:
.div1{
width: 500px;
height: 300px;
padding: 10px;
border: 5px solid black;
overflow: auto;
}
.div2{
width: 500px;
height: 300px;
padding: 10px;
border: 5px solid black;
box-sizing: border-box;
overflow: auto;
}
.div3{
width: 500px;
height: 300px;
padding: 10px;
border: 5px solid black;
overflow: auto;
transform: scale(0.5);
}
Và đây là kết quả:
div1
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, eg11)
- offsetHeight: 330 (chrome53, ff49, safari9, edge13, eg11)
- bcr. thong: 530 (chrome53, ff49, safari9, edge13, eg11)
bcr.height: 330 (chrome53, ff49, safari9, edge13, eg11)
clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (cạnh13)
- clientWidth: 503 (tức là 11)
clientHeight: 320 (chrome53, ff49, safari9, edge13, eg11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (cạnh13)
- scrollWidth: 503 (tức là 11)
- cuộnHeight: 916 (chrome53, safari9)
- cuộnHeight: 954 (ff49)
- scrollHeight: 922 (edge13, eg11)
div2
- offsetWidth: 500 (chrome53, ff49, safari9, edge13, eg11)
- offsetHeight: 300 (chrome53, ff49, safari9, edge13, eg11)
- bcr. thong: 500 (chrome53, ff49, safari9, edge13, eg11)
- bcr.height: 300 (chrome53, ff49, safari9)
- bcr.height: 299.9999694824219 (cạnh13, tức là 11)
- clientWidth: 475 (chrome53, ff49, safari9)
- clientWidth: 478 (cạnh13)
- clientWidth: 473 (tức là 11)
clientHeight: 290 (chrome53, ff49, safari9, edge13, eg11)
scrollWidth: 475 (chrome53, safari9, ff49)
- scrollWidth: 478 (cạnh13)
- scrollWidth: 473 (tức là 11)
- cuộnHeight: 916 (chrome53, safari9)
- cuộnHeight: 954 (ff49)
- scrollHeight: 922 (edge13, eg11)
div3
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, eg11)
- offsetHeight: 330 (chrome53, ff49, safari9, edge13, eg11)
- bcr. thong: 265 (chrome53, ff49, safari9, edge13, eg11)
- bcr.height: 165 (chrome53, ff49, safari9, edge13, eg11)
- clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (cạnh13)
- clientWidth: 503 (tức là 11)
clientHeight: 320 (chrome53, ff49, safari9, edge13, eg11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (cạnh13)
- scrollWidth: 503 (tức là 11)
- cuộnHeight: 916 (chrome53, safari9)
- cuộnHeight: 954 (ff49)
- scrollHeight: 922 (edge13, eg11)
Vì vậy, ngoài giá trị chiều cao của ràng buộcClientRect (299.9999694824219 thay vì 300 dự kiến) ở cạnh13 và eg11, kết quả xác nhận rằng lý thuyết đằng sau điều này hoạt động.
Từ đó, đây là định nghĩa của tôi về những khái niệm đó:
- offsetWidth / offsetHeight: kích thước của hộp viền bố trí
- ràng buộcClientRect: kích thước của hộp viền kết xuất
- clientWidth / clientHeight: kích thước của phần hiển thị của hộp đệm bố cục (không bao gồm các thanh cuộn)
- scrollWidth / scrollHeight: kích thước của hộp đệm bố cục nếu nó không bị ràng buộc bởi các thanh cuộn
Lưu ý: chiều rộng của thanh cuộn dọc mặc định là 12px ở edge13, 15px ở chrome53, ff49 và safari9 và 17px trong eg11 (được thực hiện bằng các phép đo trong photoshop từ ảnh chụp màn hình và được chứng minh bằng kết quả của các thử nghiệm).
Tuy nhiên, trong một số trường hợp, có thể ứng dụng của bạn không sử dụng chiều rộng của thanh cuộn dọc mặc định.
Vì vậy, với các định nghĩa về các khái niệm đó, chiều rộng của thanh cuộn dọc phải bằng (trong mã giả):
Lưu ý, nếu bạn không hiểu bố cục so với kết xuất, vui lòng đọc bài viết mDN.
Ngoài ra, nếu bạn có một trình duyệt khác (hoặc nếu bạn muốn xem kết quả của các bài kiểm tra), bạn có thể xem trang thử nghiệm của tôi ở đây: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(xem ghi chú tại developer.mozilla.org/en-US/docs/Web/API/Euity.clientWidth )