Es gibt einen guten Artikel über MDN, der die Theorie hinter diesen Konzepten erklärt:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
Außerdem werden die wichtigen konzeptionellen Unterschiede zwischen der Breite / Höhe von boundingClientRect und der OffsetWidth / OffsetHeight erläutert.
Um die Theorie richtig oder falsch zu beweisen, benötigen Sie einige Tests. Das habe ich hier gemacht: https://github.com/lingtalfi/dimensions-cheatsheet
Es wird auf Chrome53, ff49, Safari9, Edge13 und IE11 getestet.
Die Ergebnisse der Tests beweisen, dass die Theorie im Allgemeinen richtig ist. Für die Tests habe ich 3 Divs erstellt, die jeweils 10 Lorem-Ipsum-Absätze enthalten. Einige CSS wurde auf sie angewendet:
.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);
}
Und hier sind die Ergebnisse:
div1
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 330 (chrom53, ff49, safari9, edge13, ie11)
- bcr.width: 530 (chrome53, ff49, safari9, edge13, ie11)
bcr.height: 330 (chrome53, ff49, safari9, edge13, ie11)
clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (edge13)
- clientWidth: 503 (ie11)
clientHeight: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (ie11)
- scrollHeight: 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)
- clientWidth: 475 (chrome53, ff49, safari9)
- clientWidth: 478 (edge13)
- clientWidth: 473 (ie11)
clientHeight: 290 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 475 (chrome53, safari9, ff49)
- scrollWidth: 478 (edge13)
- scrollWidth: 473 (ie11)
- scrollHeight: 916 (chrome53, safari9)
- scrollHeight: 954 (ff49)
- scrollHeight: 922 (edge13, ie11)
div3
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 330 (chrom53, ff49, safari9, edge13, ie11)
- bcr.width: 265 (chrome53, ff49, safari9, edge13, ie11)
- bcr.height: 165 (chrome53, ff49, safari9, edge13, ie11)
- clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (edge13)
- clientWidth: 503 (ie11)
clientHeight: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (ie11)
- scrollHeight: 916 (chrome53, safari9)
- scrollHeight: 954 (ff49)
- scrollHeight: 922 (edge13, ie11)
Abgesehen von dem Höhenwert von boundingClientRect (299.9999694824219 anstelle von erwarteten 300) in edge13 und ie11 bestätigen die Ergebnisse, dass die dahinter stehende Theorie funktioniert.
Von dort aus ist hier meine Definition dieser Konzepte:
- offsetWidth / offsetHeight: Abmessungen des Layoutrahmenrahmens
- boundingClientRect: Abmessungen des Rendering-Rahmenfelds
- clientWidth / clientHeight: Abmessungen des sichtbaren Teils des Layout-Auffüllfelds (ohne Bildlaufleisten)
- scrollWidth / scrollHeight: Abmessungen des Layout-Auffüllfelds, wenn es nicht durch Bildlaufleisten eingeschränkt wurde
Hinweis: Die Standardbreite der vertikalen Bildlaufleiste beträgt 12px in edge13, 15px in chrome53, ff49 und safari9 und 17px in ie11 (durchgeführt durch Messungen in Photoshop anhand von Screenshots und durch die Testergebnisse bestätigt).
In einigen Fällen verwendet Ihre App jedoch möglicherweise nicht die Standardbreite der vertikalen Bildlaufleiste.
Angesichts der Definitionen dieser Konzepte sollte die Breite der vertikalen Bildlaufleiste also gleich sein (im Pseudocode):
Hinweis: Wenn Sie Layout und Rendering nicht verstehen, lesen Sie bitte den MDN-Artikel.
Wenn Sie einen anderen Browser haben (oder die Ergebnisse der Tests selbst sehen möchten), können Sie meine Testseite hier sehen: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(siehe Hinweis unter developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )