มีบทความที่ดีเกี่ยวกับ MDN ที่อธิบายทฤษฎีเบื้องหลังแนวคิดเหล่านั้น:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
นอกจากนี้ยังอธิบายถึงความแตกต่างทางแนวคิดที่สำคัญระหว่าง boundingClientRect's width / height เทียบกับ offsetWidth / offsetHeight
จากนั้นเพื่อพิสูจน์ทฤษฎีว่าถูกหรือผิดคุณต้องมีการทดสอบ นั่นคือสิ่งที่ฉันทำที่นี่: https://github.com/lingtalfi/dimensions-cheatsheet
มันคือการทดสอบสำหรับ chrome53, ff49, safari9, edge13 และ ie11
ผลการทดสอบพิสูจน์ว่าทฤษฎีนั้นถูกต้อง สำหรับการทดสอบฉันสร้าง divs 3 อันที่มี 10 lorem ipsum ย่อหน้าแต่ละอัน CSS บางอันถูกนำไปใช้กับพวกเขา:
.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);
}
และนี่คือผลลัพธ์:
div1
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 330 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 530 (chrome53, ff49, safari9, edge13, ie11)
bcr.height: 330 (chrome53, ff49, safari9, edge13, ie11)
ลูกค้ากว้าง: 505 (chrome53, ff49, safari9)
- ลูกค้ากว้าง: 508 (edge13)
- ลูกค้ากว้าง: 503 (ie11)
ลูกค้าความสูง: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (ie11)
- เลื่อนความสูง: 916 (chrome53, safari9)
- scrollHeight: 954 (ff49)
- scrollHeight: 922 (edge13, ie11)
div2
- offsetWidth: 500 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 300 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 500 (chrome53, ff49, safari9, edge13, ie11)
- bcr.height: 300 (chrome53, ff49, safari9)
- bcr.height: 299.9999694824219 (edge13, ie11)
- ลูกค้ากว้าง: 475 (chrome53, ff49, safari9)
- ลูกค้ากว้าง: 478 (edge13)
- ลูกค้ากว้าง: 473 (ie11)
ลูกค้าความสูง: 290 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 475 (chrome53, safari9, ff49)
- scrollWidth: 478 (edge13)
- scrollWidth: 473 (ie11)
- เลื่อนความสูง: 916 (chrome53, safari9)
- scrollHeight: 954 (ff49)
- scrollHeight: 922 (edge13, ie11)
div3
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 330 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 265 (chrome53, ff49, safari9, edge13, ie11)
- bcr.height: 165 (chrome53, ff49, safari9, edge13, ie11)
- ลูกค้ากว้าง: 505 (chrome53, ff49, safari9)
- ลูกค้ากว้าง: 508 (edge13)
- ลูกค้ากว้าง: 503 (ie11)
ลูกค้าความสูง: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (ie11)
- เลื่อนความสูง: 916 (chrome53, safari9)
- scrollHeight: 954 (ff49)
- scrollHeight: 922 (edge13, ie11)
ดังนั้นนอกเหนือจากค่าความสูงของ boundingClientRect (299.9999694824219 แทนที่จะเป็น 300) ใน edge13 และ ie11 ผลลัพธ์ยืนยันว่าทฤษฎีเบื้องหลังการทำงานนี้
นี่คือคำจำกัดความของแนวคิดเหล่านี้ของฉัน:
- offsetWidth / offsetHeight: ขนาดของกล่องเส้นขอบเค้าโครง
- boundingClientRect: ขนาดของกล่องเส้นขอบการเรนเดอร์
- clientWidth / clientHeight: ขนาดของส่วนที่มองเห็นได้ของกล่องแพ็คเก็ตเค้าโครง (ยกเว้นแถบเลื่อน)
- scrollWidth / scrollHeight: ขนาดของช่องว่างภายในของเค้าโครงหากไม่มีการ จำกัด โดยแถบเลื่อน
หมายเหตุ: ความกว้างของแถบเลื่อนแนวตั้งเริ่มต้นคือ 12px ใน edge13, 15px ใน chrome53, ff49 และ safari9 และ 17px ใน ie11 (ทำโดยการวัดใน photoshop จากภาพหน้าจอและพิสูจน์จากผลการทดสอบ)
อย่างไรก็ตามในบางกรณีแอปของคุณอาจไม่ได้ใช้ความกว้างของแถบเลื่อนแนวตั้งเริ่มต้น
ดังนั้นตามคำจำกัดความของแนวคิดเหล่านั้นความกว้างของแถบเลื่อนแนวตั้งควรเท่ากับ (ในโค้ดหลอก):
หมายเหตุหากคุณไม่เข้าใจเค้าโครงและการแสดงผลโปรดอ่านบทความ mdn
นอกจากนี้หากคุณมีเบราว์เซอร์อื่น (หรือหากคุณต้องการดูผลลัพธ์ของการทดสอบด้วยตัวคุณเอง) คุณสามารถดูหน้าทดสอบของฉันได้ที่นี่: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(ดูหมายเหตุที่developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )