Hay un buen artículo sobre MDN que explica la teoría detrás de esos conceptos:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
También explica las importantes diferencias conceptuales entre el ancho / alto del límite de ClientRect frente a offsetWidth / offsetHeight.
Luego, para demostrar que la teoría es correcta o incorrecta, necesita algunas pruebas. Eso es lo que hice aquí: https://github.com/lingtalfi/dimensions-cheatsheet
Está probando chrome53, ff49, safari9, edge13 e ie11.
Los resultados de las pruebas demuestran que la teoría es generalmente correcta. Para las pruebas, creé 3 divs que contienen 10 párrafos lorem ipsum cada uno. Se les aplicó algo de 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);
}
Y aquí están los resultados:
div1
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 330 (chrome53, ff49, safari9, edge13, ie11)
- ancho bcr: 530 (chrome53, ff49, safari9, edge13, ie11)
bcr. altura: 330 (chrome53, ff49, safari9, edge13, ie11)
ancho del cliente: 505 (chrome53, ff49, safari9)
- Ancho del cliente: 508 (edge13)
- Ancho del cliente: 503 (es decir, 11)
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. altura: 300 (chrome53, ff49, safari9)
- bcr. altura: 299.9999694824219 (edge13, ie11)
- ancho del cliente: 475 (chrome53, ff49, safari9)
- Ancho del cliente: 478 (edge13)
- Ancho del cliente: 473 (es decir, 11)
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)
- ancho bcr: 265 (chrome53, ff49, safari9, edge13, ie11)
- bcr. altura: 165 (chrome53, ff49, safari9, edge13, ie11)
- ancho del cliente: 505 (chrome53, ff49, safari9)
- Ancho del cliente: 508 (edge13)
- Ancho del cliente: 503 (es decir, 11)
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)
Por lo tanto, aparte del valor de altura del límite de ClientRect (299.9999694824219 en lugar del esperado 300) en edge13 e ie11, los resultados confirman que la teoría detrás de esto funciona.
A partir de ahí, aquí está mi definición de esos conceptos:
- offsetWidth / offsetHeight: dimensiones del cuadro de borde de diseño
- boundingClientRect: dimensiones del cuadro de borde de representación
- clientWidth / clientHeight: dimensiones de la parte visible del cuadro de relleno de diseño (excluyendo las barras de desplazamiento)
- scrollWidth / scrollHeight: dimensiones del cuadro de relleno de diseño si no estaba limitado por las barras de desplazamiento
Nota: el ancho predeterminado de la barra de desplazamiento vertical es 12px en edge13, 15px en chrome53, ff49 y safari9, y 17px en ie11 (hecho por mediciones en photoshop a partir de capturas de pantalla, y demostrado por los resultados de las pruebas).
Sin embargo, en algunos casos, tal vez su aplicación no esté utilizando el ancho predeterminado de la barra de desplazamiento vertical.
Entonces, dadas las definiciones de esos conceptos, el ancho de la barra de desplazamiento vertical debe ser igual a (en pseudocódigo):
Tenga en cuenta que si no comprende el diseño frente a la representación, lea el artículo de mdn.
Además, si tiene otro navegador (o si desea ver los resultados de las pruebas por sí mismo), puede ver mi página de prueba aquí: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(vea la nota en developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )