C'è un buon articolo su MDN che spiega la teoria alla base di questi concetti:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
Spiega anche le importanti differenze concettuali tra larghezza / altezza di boundingClientRect rispetto a offsetWidth / offsetHeight.
Quindi, per dimostrare la teoria giusta o sbagliata, hai bisogno di alcuni test. Questo è quello che ho fatto qui: https://github.com/lingtalfi/dimensions-cheatsheet
È in fase di test per chrome53, ff49, safari9, edge13 e ie11.
I risultati dei test dimostrano che la teoria è generalmente corretta. Per i test, ho creato 3 div contenenti 10 paragrafi di lorem ipsum ciascuno. Alcuni CSS sono stati applicati a loro:
.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);
}
E qui ci sono i risultati:
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)
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. altezza: 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)
- 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)
Quindi, a parte il valore di altezza di boundingClientRect (299.9999694824219 invece di 300 previsti) in edge13 e ie11, i risultati confermano che la teoria alla base di questo funziona.
Da lì, ecco la mia definizione di quei concetti:
- offsetWidth / offsetHeight: dimensioni della casella del bordo del layout
- boundingClientRect: dimensioni della casella del bordo di rendering
- clientWidth / clientHeight: dimensioni della parte visibile del riquadro di riempimento del layout (escluse le barre di scorrimento)
- scrollWidth / scrollHeight: dimensioni della casella di riempimento del layout se non era vincolata dalle barre di scorrimento
Nota: la larghezza della barra di scorrimento verticale predefinita è 12px in edge13, 15px in chrome53, ff49 e safari9 e 17px in ie11 (eseguita dalle misurazioni in Photoshop da schermate e dimostrata dai risultati dei test).
Tuttavia, in alcuni casi, forse l'app non utilizza la larghezza della barra di scorrimento verticale predefinita.
Quindi, date le definizioni di quei concetti, la larghezza della barra di scorrimento verticale dovrebbe essere uguale (in pseudo codice):
Nota, se non capisci il layout rispetto al rendering, leggi l'articolo mdn.
Inoltre, se hai un altro browser (o se vuoi vedere tu stesso i risultati dei test), puoi vedere la mia pagina di test qui: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(vedere la nota su developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )