Існує гарна стаття про MDN, яка пояснює теорію цих концепцій:
https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model/Determining_the_dimensions_of_elements
Він також пояснює важливі концептуальні відмінності між шириною / висотою limitingClientRect та offsetWidth / offsetHeight.
Потім, щоб довести теорію правильно чи неправильно, потрібні кілька тестів. Ось що я тут зробив: https://github.com/lingtalfi/dimensions-cheatsheet
Це тестування на chrome53, ff49, safari9, edge13 та ie11.
Результати тестів доводять, що теорія загалом права. Для тестів я створив 3 диви, що містять 10 абзаців з iremum. До них застосовано деякий 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
- ширина зміщення: 530 (chrome53, ff49, safari9, edge13, ie11)
- зсувВисота: 330 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 530 (chrome53, ff49, safari9, edge13, ie11)
bcr.висота: 330 (chrome53, ff49, safari9, edge13, ie11)
Ширина клієнта: 505 (chrome53, ff49, safari9)
- Ширина клієнта: 508 (край13)
- Ширина клієнта: 503 (тобто11)
Висота клієнта: 320 (chrome53, ff49, safari9, edge13, ie11)
ширина прокрутки: 505 (chrome53, safari9, ff49)
- ширина прокрутки: 508 (край13)
- ширина прокрутки: 503 (тобто11)
- висота прокрутки: 916 (chrome53, safari9)
- висота прокрутки: 954 (ff49)
- Висота прокрутки: 922 (край13, тобто11)
div2
- ширина зміщення: 500 (chrome53, ff49, safari9, edge13, ie11)
- зміщенняВисота: 300 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 500 (chrome53, ff49, safari9, edge13, ie11)
- bcr.висота: 300 (chrome53, ff49, safari9)
- bcr.зрост: 299.9999694824219 (край13, тобто11)
- Ширина клієнта: 475 (chrome53, ff49, safari9)
- Ширина клієнта: 478 (край13)
- Ширина клієнта: 473 (тобто11)
Висота клієнта: 290 (chrome53, ff49, safari9, edge13, ie11)
ширина прокрутки: 475 (chrome53, safari9, ff49)
- ширина прокрутки: 478 (край13)
- ширина прокрутки: 473 (тобто11)
- висота прокрутки: 916 (chrome53, safari9)
- висота прокрутки: 954 (ff49)
- Висота прокрутки: 922 (край13, тобто11)
div3
- ширина зміщення: 530 (chrome53, ff49, safari9, edge13, ie11)
- зсувВисота: 330 (chrome53, ff49, safari9, edge13, ie11)
- bcr.width: 265 (chrome53, ff49, safari9, edge13, ie11)
- bcr.height: 165 (chrome53, ff49, safari9, edge13, ie11)
- Ширина клієнта: 505 (chrome53, ff49, safari9)
- Ширина клієнта: 508 (край13)
- Ширина клієнта: 503 (тобто11)
Висота клієнта: 320 (chrome53, ff49, safari9, edge13, ie11)
ширина прокрутки: 505 (chrome53, safari9, ff49)
- ширина прокрутки: 508 (край13)
- ширина прокрутки: 503 (тобто11)
- висота прокрутки: 916 (chrome53, safari9)
- висота прокрутки: 954 (ff49)
- Висота прокрутки: 922 (край13, тобто11)
Так, крім значення висоти граничногоClientRect (299.9999694824219 замість очікуваних 300) у краю13 та 11, результати підтверджують, що теорія, що стоїть за цим, працює.
Звідси, ось моє визначення цих понять:
- offsetWidth / offsetHeight: розміри рамки рамки макета
- borderingClientRect: розміри вікна рамки візуалізації
- clientWidth / clientHeight: розміри видимої частини коробки для накладки макета (за винятком смуг прокрутки)
- scrollWidth / scrollHeight: розміри поля обкладки для макета, якщо його не обмежували смуги прокрутки
Примітка: ширина смуги прокрутки за замовчуванням становить 12 пікселів у краю13, 15 пікселів у хромі53, ff49 та safari9 та 17 пікселів у ie11 (зроблено за допомогою вимірювань у фотошопі зі скріншотів і доведено правильно за результатами тестів).
Однак у деяких випадках можливо ваша програма не використовує вертикальну ширину смуги прокрутки за замовчуванням.
Отже, враховуючи визначення цих понять, ширина вертикальної смуги прокрутки повинна бути рівною (у псевдокоді):
Зауважте, якщо ви не розумієте макет та рендерінг, прочитайте статтю mdn.
Крім того, якщо у вас інший браузер (або якщо ви хочете побачити результати тестів для себе), ви можете переглянути мою тестову сторінку тут: http://codepen.io/lingtalfi/pen/BLdBdL
element.getBoundingClientRect()
(див. Примітку на адресу developer.mozilla.org/en-US/docs/Web/API/Element.clientWidth )