Ada artikel bagus tentang MDN yang menjelaskan teori di balik konsep-konsep tersebut:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
Ini juga menjelaskan perbedaan konseptual yang penting antara lebar / tinggi boundingClientRect vs offsetWidth / offsetHeight.
Kemudian, untuk membuktikan teorinya benar atau salah, Anda perlu beberapa tes. Itulah yang saya lakukan di sini: https://github.com/lingtalfi/dimensions-cheatsheet
Ini pengujian untuk chrome53, ff49, safari9, edge13 dan ie11.
Hasil tes membuktikan bahwa teorinya secara umum benar. Untuk pengujian, saya membuat 3 div yang masing-masing berisi 10 paragraf lorem ipsum. Beberapa css diterapkan pada mereka:
.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);
}
Dan inilah hasilnya:
div1
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetTinggi: 330 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 530 (chrome53, ff49, safari9, edge13, ie11)
bcr.tinggi: 330 (chrome53, ff49, safari9, edge13, ie11)
clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (edge13)
- clientWidth: 503 (ie11)
clientHeight: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollLebar: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (ie11)
- scrollTinggi: 916 (chrome53, safari9)
- scrollTinggi: 954 (ff49)
- scrollTinggi: 922 (edge13, ie11)
div2
- offsetWidth: 500 (chrome53, ff49, safari9, edge13, ie11)
- offsetTinggi: 300 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 500 (chrome53, ff49, safari9, edge13, ie11)
- bcr.tinggi: 300 (chrome53, ff49, safari9)
- bcr.height: 299.9999694824219 (edge13, ie11)
- clientWidth: 475 (chrome53, ff49, safari9)
- clientWidth: 478 (edge13)
- clientWidth: 473 (ie11)
clientHeight: 290 (chrome53, ff49, safari9, edge13, ie11)
scrollLebar: 475 (chrome53, safari9, ff49)
- scrollWidth: 478 (edge13)
- scrollWidth: 473 (ie11)
- scrollTinggi: 916 (chrome53, safari9)
- scrollTinggi: 954 (ff49)
- scrollTinggi: 922 (edge13, ie11)
div3
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetTinggi: 330 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 265 (chrome53, ff49, safari9, edge13, ie11)
- bcr.tinggi: 165 (chrome53, ff49, safari9, edge13, ie11)
- clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (edge13)
- clientWidth: 503 (ie11)
clientHeight: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollLebar: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (ie11)
- scrollTinggi: 916 (chrome53, safari9)
- scrollTinggi: 954 (ff49)
- scrollTinggi: 922 (edge13, ie11)
Jadi, terlepas dari nilai tinggi boundingClientRect (299,9999694824219, bukan yang diharapkan 300) di edge13 dan ie11, hasilnya mengkonfirmasi bahwa teori di balik ini bekerja.
Dari sini, inilah definisi saya tentang konsep-konsep itu:
- offsetWidth / offsetHeight: dimensi kotak batas tata letak
- boundingClientRect: dimensi kotak batas render
- clientWidth / clientHeight: dimensi bagian yang terlihat dari kotak padding tata letak (tidak termasuk bilah gulir)
- scrollWidth / scrollHeight: dimensi kotak padding tata letak jika tidak dibatasi oleh scroll bar
Catatan: lebar bilah gulir vertikal default adalah 12px di edge13, 15px di chrome53, ff49 dan safari9, dan 17px di ie11 (dilakukan dengan pengukuran di photoshop dari tangkapan layar, dan terbukti benar dengan hasil pengujian).
Namun, dalam beberapa kasus, mungkin aplikasi Anda tidak menggunakan lebar bilah gulir vertikal bawaan.
Jadi, mengingat definisi konsep-konsep tersebut, lebar bilah gulir vertikal harus sama dengan (dalam kode pseudo):
Catatan, jika Anda tidak memahami tata letak vs render, harap baca artikel mdn.
Juga, jika Anda memiliki browser lain (atau jika Anda ingin melihat hasil tes sendiri), Anda dapat melihat halaman pengujian saya di sini: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(lihat catatan di developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )