Es gibt einen guten Artikel auf 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
Es erklärt auch die wichtigen konzeptionellen Unterschiede zwischen boundingClientRect Breite/Höhe vs offsetBreite/offsetHöhe.
Dann, um die Theorie zu beweisen oder widerlegen, benötigen Sie einige Tests. Das ist, was ich hier gemacht habe: https://github.com/lingtalfi/dimensions-cheatsheet
Es testet für chrome53, ff49, safari9, edge13 und ie11.
Die Ergebnisse der Tests bestätigen, 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 wurden 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
-
offsetBreite: 530 (chrome53, ff49, safari9, edge13, ie11)
-
offsetHöhe: 330 (chrome53, ff49, safari9, edge13, ie11)
-
bcr.Breite: 530 (chrome53, ff49, safari9, edge13, ie11)
-
bcr.Höhe: 330 (chrome53, ff49, safari9, edge13, ie11)
-
clientBreite: 505 (chrome53, ff49, safari9)
-
clientBreite: 508 (edge13)
-
clientBreite: 503 (ie11)
-
clientHöhe: 320 (chrome53, ff49, safari9, edge13, ie11)
-
scrollBreite: 505 (chrome53, safari9, ff49)
-
scrollBreite: 508 (edge13)
-
scrollBreite: 503 (ie11)
-
scrollHöhe: 916 (chrome53, safari9)
-
scrollHöhe: 954 (ff49)
-
scrollHöhe: 922 (edge13, ie11)
-
div2
-
offsetBreite: 500 (chrome53, ff49, safari9, edge13, ie11)
-
offsetHöhe: 300 (chrome53, ff49, safari9, edge13, ie11)
-
bcr.Breite: 500 (chrome53, ff49, safari9, edge13, ie11)
-
bcr.Höhe: 300 (chrome53, ff49, safari9)
-
bcr.Höhe: 299.9999694824219 (edge13, ie11)
-
clientBreite: 475 (chrome53, ff49, safari9)
-
clientBreite: 478 (edge13)
-
clientBreite: 473 (ie11)
-
clientHöhe: 290 (chrome53, ff49, safari9, edge13, ie11)
-
scrollBreite: 475 (chrome53, safari9, ff49)
-
scrollBreite: 478 (edge13)
-
scrollBreite: 473 (ie11)
-
scrollHöhe: 916 (chrome53, safari9)
-
scrollHöhe: 954 (ff49)
-
scrollHöhe: 922 (edge13, ie11)
-
div3
-
offsetBreite: 530 (chrome53, ff49, safari9, edge13, ie11)
-
offsetHöhe: 330 (chrome53, ff49, safari9, edge13, ie11)
-
bcr.Breite: 265 (chrome53, ff49, safari9, edge13, ie11)
-
bcr.Höhe: 165 (chrome53, ff49, safari9, edge13, ie11)
-
clientBreite: 505 (chrome53, ff49, safari9)
-
clientBreite: 508 (edge13)
-
clientBreite: 503 (ie11)
-
clientHöhe: 320 (chrome53, ff49, safari9, edge13, ie11)
-
scrollBreite: 505 (chrome53, safari9, ff49)
-
scrollBreite: 508 (edge13)
-
scrollBreite: 503 (ie11)
-
scrollHöhe: 916 (chrome53, safari9)
-
scrollHöhe: 954 (ff49)
-
scrollHöhe: 922 (edge13, ie11)
Also, abgesehen von dem boundingClientRect Höhenwert (299.9999694824219 anstelle der erwarteten 300) in edge13 und ie11, bestätigen die Ergebnisse, dass die Theorie dahinter funktioniert.
Von dort aus hier ist meine Definition dieser Konzepte:
- offsetBreite/offsetHöhe: Abmessungen des Layout-Border-Box
- boundingClientRect: Abmessungen der Rendering-Border-Box
- clientBreite/clientHöhe: Abmessungen des sichtbaren Teils des Layout-Padding-Box (ohne Scrollleisten)
- scrollBreite/scrollHöhe: Abmessungen der Layout-Padding-Box, wenn sie nicht durch Scrollleisten eingeschränkt wäre
Hinweis: Die Standard-Breite der vertikalen Scrollleiste beträgt 12px in edge13, 15px in chrome53, ff49 und safari9, und 17px in ie11 (gemessen in Photoshop aus Screenshots und durch die Ergebnisse der Tests bestätigt).
In einigen Fällen verwendet Ihre App jedoch möglicherweise nicht die Standard-Breite der vertikalen Scrollleiste.
Also, basierend auf den Definitionen dieser Konzepte sollte die Breite der vertikalen Scrollleiste gleich sein wie (im Pseudocode):
Hinweis: Wenn Sie nicht verstehen, Layout vs. Rendering, lesen Sie bitte den MDN-Artikel.
Außerdem, 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