Il y a un bon article sur MDN qui explique la théorie derrière ces concepts:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
Il explique également les différences conceptuelles importantes entre la largeur / hauteur de boundingClientRect et offsetWidth / offsetHeight.
Ensuite, pour prouver que la théorie est bonne ou mauvaise, vous avez besoin de tests. C'est ce que j'ai fait ici: https://github.com/lingtalfi/dimensions-cheatsheet
Il teste chrome53, ff49, safari9, edge13 et ie11.
Les résultats des tests prouvent que la théorie est généralement correcte. Pour les tests, j'ai créé 3 divs contenant 10 paragraphes lorem ipsum chacun. Certains CSS leur ont été appliqués:
.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);
}
Et voici les résultats:
div1
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 330 (chrome53, ff49, safari9, edge13, ie11)
- largeur bcr: 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)
- largeur bcr: 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 (chrome53, ff49, safari9, edge13, ie11)
- largeur bcr: 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)
Ainsi, en dehors de la valeur de hauteur du boundingClientRect (299.9999694824219 au lieu de 300 attendu) dans edge13 et ie11, les résultats confirment que la théorie derrière cela fonctionne.
De là, voici ma définition de ces concepts:
- offsetWidth / offsetHeight: dimensions de la zone de bordure de présentation
- boundingClientRect: dimensions de la zone de bordure de rendu
- clientWidth / clientHeight: dimensions de la partie visible de la zone de remplissage de la mise en page (à l'exclusion des barres de défilement)
- scrollWidth / scrollHeight: dimensions de la zone de remplissage de la mise en page si elle n'était pas contrainte par des barres de défilement
Remarque: la largeur de la barre de défilement verticale par défaut est de 12px en bord13, 15px en chrome53, ff49 et safari9, et 17px en ie11 (effectuées par des mesures dans Photoshop à partir de captures d'écran, et prouvées par les résultats des tests).
Cependant, dans certains cas, votre application n'utilise peut-être pas la largeur de la barre de défilement verticale par défaut.
Donc, étant donné les définitions de ces concepts, la largeur de la barre de défilement verticale doit être égale à (en pseudo code):
Remarque, si vous ne comprenez pas la mise en page et le rendu, veuillez lire l'article mdn.
De plus, si vous avez un autre navigateur (ou si vous voulez voir les résultats des tests par vous-même), vous pouvez voir ma page de test ici: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(voir la note sur developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )