You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 2-ui/1-document/09-size-and-scroll/1-get-scroll-height-bottom/task.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ importance: 5
4
4
5
5
# Найти размер прокрутки снизу
6
6
7
-
Свойство `elem.scrollTop` содержит размер прокрученной области при отсчёте сверху. А как подсчитать "`scrollBottom`" -- размер прокрутки снизу?
7
+
Свойство `elem.scrollTop` содержит размер прокрученной области при отсчёте сверху. А как подсчитать размер прокрутки снизу (назовём его `scrollBottom`)?
8
8
9
9
Напишите соответствующее выражение для произвольного элемента `elem`.
Copy file name to clipboardExpand all lines: 2-ui/1-document/09-size-and-scroll/article.md
+24-28Lines changed: 24 additions & 28 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -32,44 +32,38 @@
32
32
Вы можете [открыть этот пример в песочнице](sandbox:metric).
33
33
34
34
```smart header="Внимание, полоса прокрутки"
35
-
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) оставляют место для неё, забирая его у области, отведённой для содержимого.
35
+
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) отбирают место для неё, забирая его у области, отведённой для содержимого (помечена как "content width" выше).
36
36
37
-
Таким образом, без учёта полосы прокрутки ширина области содержимого будет `300px`, но если предположить, что ширина полосы прокрутки равна `16px` (её точное значение зависит от устройства и браузера), тогда остаётся только `300 - 16 = 284px`, и мы должны это учитывать. Вот почему примеры в этой главе даны с полосой прокрутки. Если её не будет, то вычисления будут немного проще.
37
+
Таким образом, без учёта полосы прокрутки ширина области содержимого (content width) будет `300px`, но если предположить, что ширина полосы прокрутки равна `16px` (её точное значение зависит от устройства и браузера), тогда остаётся только `300 - 16 = 284px`, и мы должны это учитывать. Вот почему примеры в этой главе даны с полосой прокрутки. Без неё некоторые вычисления будут проще.
38
38
```
39
39
40
40
```smart header="Область `padding-bottom` (нижний внутренний отступ) может быть заполнена текстом"
41
-
Нижние внутренние отступы `padding-bottom` изображены пустыми на иллюстрациях, но если элемент содержит много текста, то браузеры отображают его перекрывающим `padding-bottom`.
42
-
43
-
Это заметка, чтобы избежать недопониманий, так как во всех стилях дальнейших примеров `padding-bottom` есть (если не указано противное).
41
+
Нижние внутренние отступы `padding-bottom` изображены пустыми на наших иллюстрациях, но если элемент содержит много текста, то он будет перекрывать `padding-bottom`, это нормально.
44
42
```
45
43
46
44
## Метрики
47
45
48
-
Вот общая картина:
46
+
Вот общая картина с геометрическими свойствами:
49
47
50
48

51
49
52
50
Значениями свойств являются числа, подразумевается, что они в пикселях.
53
51
54
-
Существует множество свойств, и довольно трудно уместить их на одном изображении, но их значения просты и понятны.
55
-
56
-
Давайте начнём исследовать их снаружи элемента.
52
+
Давайте начнём исследовать, начиная снаружи элемента.
57
53
58
-
## Свойства: offsetParent, offsetLeft/Top
54
+
## offsetParent, offsetLeft/Top
59
55
60
56
Эти свойства редко используются, но так как они являются "самыми внешними" метриками, мы начнём с них.
61
57
62
58
В свойстве `offsetParent` находится предок элемента, который используется внутри браузера для вычисления координат при рендеринге.
63
59
64
-
Это ближайший предок, который браузер использует при вычислении координат во время рендеринга.
65
-
66
60
То есть, ближайший предок, который удовлетворяет следующим условиям:
67
61
68
62
1. Является CSS-позиционированным (CSS-свойство `position` равно `absolute`, `relative`, `fixed` или `sticky`),
69
63
2. или `<td>`, `<th>`, `<table>`,
70
64
3. или `<body>`.
71
65
72
-
Свойства `offsetLeft/offsetTop` содержат координаты x/y относительно верхнего левого угла родительского элемента.
66
+
Свойства `offsetLeft/offsetTop` содержат координаты x/y относительно верхнего левого угла `offsetParent`.
73
67
74
68
В примере ниже внутренний `<div>` имеет элемент `<main>` в качестве `offsetParent`, а свойства `offsetLeft/offsetTop` являются сдвигами относительно верхнего левого угла (`180`):
75
69
@@ -88,14 +82,13 @@
88
82
89
83

90
84
91
-
92
85
Существует несколько ситуаций, когда `offsetParent` равно `null`:
93
86
94
87
1. Для скрытых элементов (с CSS-свойством `display:none` или когда его нет в документе).
95
88
2. Для элементов `<body>` и `<html>`.
96
89
3. Для элементов с `position:fixed`.
97
90
98
-
## Свойства: offsetWidth/Height
91
+
## offsetWidth/Height
99
92
100
93
Теперь переходим к самому элементу.
101
94
@@ -126,7 +119,7 @@ function isHidden(elem) {
126
119
Заметим, что функция `isHidden` также вернёт `true` для элементов, которые в принципе показываются, но их размеры равны нулю (например, пустые `<div>`).
127
120
````
128
121
129
-
## Свойства: clientTop/Left
122
+
## clientTop/Left
130
123
131
124
Пойдём дальше. Внутри элемента у нас рамки (border).
132
125
@@ -145,19 +138,23 @@ function isHidden(elem) {
145
138
146
139
Она возникает, когда документ располагается справа налево (операционная система на арабском языке или иврите). Полоса прокрутки в этом случае находится слева, и тогда свойство `clientLeft` включает в себя ещё и ширину полосы прокрутки.
147
140
148
-
В этом случае `clientLeft` будет равно `25`, но с прокруткой -- `25 + 16 = 41`:
141
+
В этом случае `clientLeft` будет равно `25`, но с прокруткой -- `25 + 16 = 41`.
142
+
143
+
Вот соответствующий пример на иврите:
149
144
150
145

151
146
152
-
## Свойства: clientWidth/Height
147
+
## clientWidth/Height
153
148
154
149
Эти свойства -- размер области внутри рамок элемента.
155
150
156
151
Они включают в себя ширину области содержимого вместе с внутренними отступами `padding`, но без прокрутки:
157
152
158
153

159
154
160
-
На рисунке выше посмотрим вначале на высоту `clientHeight`: её посчитать проще всего. Горизонтальной прокрутки нет, так что это в точности то, что внутри рамок: CSS-высота `200px` плюс верхние и нижние внутренние отступы (`2 * 20px`), итого `240px`.
155
+
На рисунке выше посмотрим вначале на высоту `clientHeight`.
156
+
157
+
Горизонтальной прокрутки нет, так что это в точности то, что внутри рамок: CSS-высота `200px` плюс верхние и нижние внутренние отступы (`2 * 20px`), итого `240px`.
161
158
162
159
Теперь `clientWidth` -- ширина содержимого здесь равна не `300px`, а `284px`, т.к. `16px` отведено для полосы прокрутки. Таким образом: `284px` плюс левый и правый отступы -- всего `324px`.
163
160
@@ -167,10 +164,9 @@ function isHidden(elem) {
167
164
168
165
Поэтому в тех случаях, когда мы точно знаем, что отступов нет, можно использовать `clientWidth/clientHeight` для получения размеров внутренней области содержимого.
169
166
170
-
## Свойства: scrollWidth/Height
167
+
## scrollWidth/Height
171
168
172
-
- Свойства `clientWidth/clientHeight` относятся только к видимой области элемента.
173
-
- Свойства `scrollWidth/scrollHeight` добавляют к ней прокрученную (которую не видно) по горизонтали/вертикали:
169
+
Эти свойства - как `clientWidth/clientHeight`, но также включают в себя прокрученную (которую не видно) часть элемента.
Свойства `scrollLeft/scrollTop` -- ширина/высота невидимой, прокрученной в данный момент, части элемента слева и сверху.
202
198
@@ -234,8 +230,8 @@ alert( getComputedStyle(elem).width ); // показывает CSS-ширину
234
230
235
231
Почему мы должны использовать свойства-метрики вместо этого? На то есть две причины:
236
232
237
-
1. Во-первых, CSS-свойства width/height зависят от другого свойства -- `box-sizing`, которое определяет, "что такое", собственно, эти CSS-ширина и высота. Получается, что изменение `box-sizing`, к примеру, для более удобной вёрстки, сломает такой JavaScript.
238
-
2. Во-вторых, в CSS свойства `width/height` могут быть равны `auto`, например, для строчного элемента:
233
+
1. Во-первых, CSS-свойства `width/height` зависят от другого свойства -- `box-sizing`, которое определяет, "что такое", собственно, эти CSS-ширина и высота. Получается, что изменение `box-sizing`, к примеру, для более удобной вёрстки, сломает такой JavaScript.
234
+
2. Во-вторых, в CSS свойства `width/height` могут быть равны `auto`, например, для инлайнового элемента:
239
235
240
236
```html run
241
237
<span id="elem">Привет!</span>
@@ -272,9 +268,9 @@ alert( getComputedStyle(elem).width ); // показывает CSS-ширину
- `offsetLeft/offsetTop` -- позиция в пикселях верхнего левого угла относительно `offsetParent`.
274
270
- `offsetWidth/offsetHeight` -- "внешняя" ширина/высота элемента, включая рамки.
275
-
- `clientLeft/clientTop` -- расстояние от верхнего левого внешнего угла до верхнего левого внутренного угла элемента. Для операционных систем с ориентацией слеванаправо эти свойства равны ширинам левой/верхней рамки. Если язык ОС таков, что ориентация справа налево, так что вертикальная полоса прокрутки находится не справа, а слева, то `clientLeft` включает в своё значение её ширину.
276
-
- `clientWidth/clientHeight` -- ширина/высота содержимого вместе с внутренними отступами, но без полосы прокрутки.
271
+
- `clientLeft/clientTop` -- расстояние от верхнего левого внешнего угла до внутренного. Для операционных систем с ориентацией слева-направо эти свойства равны ширинам левой/верхней рамки. Если язык ОС таков, что ориентация справа налево, так что вертикальная полоса прокрутки находится не справа, а слева, то `clientLeft` включает в своё значение её ширину.
272
+
- `clientWidth/clientHeight` -- ширина/высота содержимого вместе с внутренними отступами `padding`, но без полосы прокрутки.
277
273
- `scrollWidth/scrollHeight` -- ширины/высота содержимого, аналогично `clientWidth/Height`, но учитывают прокрученную, невидимую область элемента.
278
274
- `scrollLeft/scrollTop` -- ширина/высота прокрученной сверху части элемента, считается от верхнего левого угла.
279
275
280
-
Все свойства доступны только для чтения, кроме `scrollLeft/scrollTop`. Изменение этих свойств заставляет браузер прокручивать элемент.
276
+
Все свойства доступны только для чтения, кроме `scrollLeft/scrollTop`, изменение которых заставляет браузер прокручивать элемент.
0 commit comments