@@ -17,23 +17,45 @@
```
+У него нет отступов `margin`, в этой главе они не важны, так как метрики касаются именно размеров самого элемента, отступы в них не учитываются.
+
Результат выглядит так:
-
+
-Вы можете открыть этот документ [edit src="metric"]в песочнице[/edit].
+Вы можете открыть [edit src="metric"]этот документ в песочнице[/edit].
+
+[smart header="Внимание, полоса прокрутки!"]
+В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки.
+
+В этом случае полоса прокрутки "отодвигает" содержимое вместе с `padding` влево, отбирая у него место.
+
+Именно поэтому ширина содержимого обозначена как `content width` и равна `284px`, а не `300px`, как в CSS.
+
+Точное значение получено в предположении, что ширина полосы прокрутки равна `16px`, то есть после её вычитания на содержимое остаётся `300 - 16 = 284px`. Конечно, она сильно зависит от браузера, устройства, ОС.
+
+Мы должны в точности понимать, что происходит с размерами элемента при наличии полосы прокрутки, поэтому на картинке выше это отражено.
+[/smart]
+
+[smart header="Поле `padding` заполнено текстом"]
+Обычно поля `padding` изображают пустыми, но так как текста много, то он заполняет нижнее поле `padding-bottom` в примере выше.
+
+Во избежание путаницы заметим, что `padding` там, всё же, есть. Поля `padding` по CSS в элементе выше одинаковы со всех сторон. А такое заполнение -- нормальное поведение браузера.
+[/smart]
+
+## Метрики
У элементов существует ряд свойств, содержащих их внешние и внутренние размеры. Мы будем называть их "метриками".
@@ -41,55 +63,57 @@
Вот общая картина:
+
На картинке все они с трудом помещаются, но, как мы увидим далее, их значения просты и понятны.
Будем исследовать их снаружи элемента и вовнутрь.
-## offsetWidth/Height
-
-Эти свойства дают "внешнюю" ширину/высоту элемента, то есть его полный размер, включая рамки `border`, но исключая внешние отступы `margin`.
-
-В примере выше:
-
-`offsetWidth = 390` -- внешняя ширина блока
-`offsetHeight = 290` -- внешняя высота блока
-
-
-
## offsetParent, offsetLeft/Top
-[warn header="Используются редко..."]
-Ситуации, когда эти свойства нужны, можно перечислить по пальцам. Они возникают действительно редко. Как правило, эти свойства используют по ошибке, потому что не знают средств правильной работы с координатами, о которых мы поговорим позже.
-[/warn]
+Ситуации, когда эти свойства нужны, можно перечислить по пальцам. Они возникают действительно редко. Как правило, эти свойства используют, потому что не знают средств правильной работы с координатами, о которых мы поговорим позже.
-В `offsetParent` -- ссылка родительский элемент в смысле отображения на странице.
+Несмотря на то, что эти свойства нужны реже всего, они -- самые "внешние", поэтому начнём с них.
+
+**В `offsetParent` находится ссылка родительский элемент в смысле отображения на странице.**
Уточним, что имеется в виду.
-Когда браузер рисует страницу, то он высчитывает дерево расположения элементов, иначе говоря "дерево геометрии" или "дерево рендеринга".
+Когда браузер рисует страницу, то он высчитывает дерево расположения элементов, иначе говоря "дерево геометрии" или "дерево рендеринга", которое содержит всю информацию о размерах.
-Обычно элементы вложены друг в друга и структура дерева рендеринга повторяет DOM.
+При этом одни элементы естественным образом рисуются внутри других. Но, к примеру, если у элемента стоит `position:absolute`, то его расположение вычисляется уже не относительно непосредственного родителя `parentNode`, а относительно ближайшего
позиционированного элемента (т.е. свойство `position` которого не равно `static`), или `BODY`, если такой отсутствует.
-Но, к примеру, если у элемента стоит `position: absolute`, то его расположение вычисляется уже не относительно непосредственного родителя `parentNode`, а относительно ближайшего
позиционированного элемента (т.е. свойство `position` которого не равно `static`), или `BODY`, если таковой отсутствует.
+Получается, что элемент имеет в дополнение к обычному родителю в DOM -- ещё одного "родителя по позиционированию", то есть относительно которого он рисуется. Этот элемент и будет в свойстве `offsetParent`.
-Получается, что элемент имеет в дополнение к родителю в DOM -- ещё одного "родителя" в плане позиционирования, то есть относительно которого он рисуется. Этот элемент и будет в свойстве `offsetParent`.
+**Свойства `offsetLeft/Top` задают смещение относительно `offsetParent`.**
-Свойства `offsetLeft/Top` задают смещение относительно `offsetParent`.
-
-В примере ниже внешний `
` является родителем внутреннего по позиционированию, и отступ от него будет в `offsetLeft/Top`:
+В примере ниже внутренний `
У элемента стоит
style="width:300px"
-
alert(width из getComputedStyle/currentStyle)
+
alert( getComputedStyle(elem).width )