Есть хорошая статья о MDN, которая объясняет теорию, лежащую в основе этих концепций:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
Это также объясняет важные концептуальные различия между ширина / высота boundingClientRect против offsetWidth / offsetHeight.
Затем, чтобы доказать правильность или неправильность теории, вам понадобятся некоторые тесты. Вот что я сделал здесь: https://github.com/lingtalfi/dimensions-cheatsheet
Это тестирование для chrome53, ff49, safari9, edge13 и ie11.
Результаты испытаний доказывают, что теория в целом верна. Для тестов я создал 3 div, содержащих по 10 абзацев lorem ipsum каждый. Некоторые 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);
}
И вот результаты:
div1
- offsetWidth: 530 (chrome53, ff49, safari9, edge13, ie11)
- offsetHeight: 330 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 530 (chrome53, ff49, safari9, edge13, ie11)
высота: 330 (chrome53, ff49, safari9, edge13, ie11)
clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (edge13)
- clientWidth: 503 (т.е. 11)
высота клиента: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (т.е. 11)
- Высота свитка: 916 (chrome53, safari9)
- Высота свитка: 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)
- высота: 300 (chrome53, ff49, safari9)
- bcr.height: 299.9999694824219 (edge13, т.е. 11)
- clientWidth: 475 (chrome53, ff49, safari9)
- clientWidth: 478 (ребро13)
- clientWidth: 473 (т.е. 11)
clientHeight: 290 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 475 (chrome53, safari9, ff49)
- scrollWidth: 478 (edge13)
- scrollWidth: 473 (т.е. 11)
- Высота свитка: 916 (chrome53, safari9)
- Высота свитка: 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)
- высота: 165 (chrome53, ff49, safari9, edge13, ie11)
- clientWidth: 505 (chrome53, ff49, safari9)
- clientWidth: 508 (edge13)
- clientWidth: 503 (т.е. 11)
высота клиента: 320 (chrome53, ff49, safari9, edge13, ie11)
scrollWidth: 505 (chrome53, safari9, ff49)
- scrollWidth: 508 (edge13)
- scrollWidth: 503 (т.е. 11)
- Высота свитка: 916 (chrome53, safari9)
- Высота свитка: 954 (ff49)
- scrollHeight: 922 (edge13, ie11)
Таким образом, кроме значения высоты boundingClientRect (299.9999694824219 вместо ожидаемых 300) в edge13 и ie11, результаты подтверждают, что теория, стоящая за этим, работает.
Отсюда мое определение этих понятий:
- offsetWidth / offsetHeight: размеры поля границы макета
- boundingClientRect: размеры рамки рендеринга
- clientWidth / clientHeight: размеры видимой части поля отступов макета (исключая полосы прокрутки)
- scrollWidth / scrollHeight: размеры поля отступа макета, если оно не ограничено полосами прокрутки
Примечание. По умолчанию вертикальная полоса прокрутки имеет ширину 12 пикселей в edge13, 15 пикселей в chrome53, ff49 и safari9 и 17 пикселей в ie11 (сделано по измерениям в фотошопе из скриншотов и подтверждено результатами тестов).
Однако в некоторых случаях, возможно, ваше приложение не использует ширину вертикальной полосы прокрутки по умолчанию.
Таким образом, учитывая определения этих понятий, ширина вертикальной полосы прокрутки должна быть равна (в псевдокоде):
Обратите внимание, если вы не понимаете, что такое макет и рендеринг, пожалуйста, прочтите статью mdn.
Кроме того, если у вас есть другой браузер (или если вы хотите увидеть результаты тестов для себя), вы можете увидеть мою тестовую страницу здесь: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(см. Примечание на developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )