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/article.md
+22-22Lines changed: 22 additions & 22 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,8 @@
1
1
# Размеры и прокрутка элементов
2
2
3
-
Существует множество JavaScript-свойтв, которые позволяют считывать информацию об элементе: ширину, высоту и другие геометрические характеристики.
3
+
Существует множество JavaScript-свойcтв, которые позволяют считывать информацию об элементе: ширину, высоту и другие геометрические характеристики.
4
4
5
-
Они часто требуются, когда нам нужно передвигать или позиционировать элементы с помощью JavaScript, для того, чтобы правильно вычислить координаты.
5
+
Они часто требуются, когда нам нужно передвигать или позиционировать элементы с помощью JavaScript для того, чтобы правильно вычислять координаты.
6
6
7
7
8
8
## Простой пример
@@ -33,13 +33,13 @@
33
33
Вы можете [открыть этот документ в песочнице](sandbox:metric).
34
34
35
35
```smart header="Внимание, полоса прокрутки"
36
-
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) оставляют место для неё забирая его у области отведённой для содержимого.
36
+
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) оставляют место для неё, забирая его у области отведённой для содержимого.
37
37
38
38
Таким образом, без учёта полосы прокрутки ширина области содержимого будет `300px`, но если предположить, что ширина полосы прокрутки равна `16px` (её точное значение зависит от устройства и браузера), тогда остаётся только `300 - 16 = 284px` и мы должны это учитывать. Вот почему примеры в этой главе даны с полосой прокрутки. Если её не будет, то вычисления будут немного проще.
39
39
```
40
40
41
41
```smart header="CSS-свойство `padding-bottom` может быть заполнено текстом"
42
-
Обычно внутренние отступы изображены пустыми на иллюстрациях, но если элемент содержит много текста, они могут перекрывать друг друга, в этом случае браузеры отображают такой текст "перекрывающим" `нижний внутренний отступ` (padding-bottom). Вы можете наблюдать это в примерах. Несмотря на это, отступы есть, пока не указано иное.
42
+
Обычно внутренние отступы изображены пустыми на иллюстрациях, но если элемент содержит много текста, они могут перекрывать друг друга. В этом случае браузеры отображают такой текст "перекрывающим" `нижний внутренний отступ` (padding-bottom). Вы можете наблюдать это в примерах. Несмотря на это, отступы есть, если не указано иное.
43
43
```
44
44
45
45
## Метрики
@@ -76,7 +76,7 @@
76
76
</main>
77
77
<script>
78
78
alert(example.offsetParent.id); // main
79
-
alert(example.offsetLeft); // 180 (note: a number, not a string "180px")
79
+
alert(example.offsetLeft); // 180 (обратите внимание: число, а не строка "180px")
80
80
alert(example.offsetTop); // 180
81
81
</script>
82
82
```
@@ -86,7 +86,7 @@
86
86
87
87
Существует несколько частных случаев, когда `offsetParent` равно `null`:
88
88
89
-
1. Для скрытых элементов (с CSS-свойством `display:none`, либо когда его нет в документе).
89
+
1. Для скрытых элементов (с CSS-свойством `display:none`, либо, когда его нет в документе).
90
90
2. Для элементов `<body>` и `<html>`.
91
91
3. Для элементов с `position:fixed`.
92
92
@@ -134,33 +134,33 @@ function isHidden(elem) {
134
134
135
135

136
136
137
-
...На на самом деле -- оно вовсе не рамки, а отступ внутренней части элемента от внешней.
137
+
...На на самом деле -- это вовсе не рамки, а отступ внутренней части элемента от внешней.
138
138
139
139
В чём же разница?
140
140
141
-
Она возникает, когда документ располагается справа налево (операционная система на арабском языке или иврите). Полоса прокрутки в этом случае находится слева, и тогда свойство `clientLeft` включает в себя еще и ширину полосы прокрутки.
141
+
Она возникает, когда документ располагается справа налево (операционная система на арабском языке или иврите). Полоса прокрутки в этом случае находится слева, и тогда свойство `clientLeft` включает в себя ещё и ширину полосы прокрутки.
142
142
143
143
В этом случае, `clientLeft` будет равно `25`, но с прокруткой -- `25 + 16 = 41`:
144
144
145
145

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

154
154
155
155
На рисунке выше посмотрим вначале на `clientHeight`: её посчитать проще всего. Горизонтально прокрутки нет, так что это в точности то, что внутри рамок: CSS-высота `200px` плюс верхнее и нижнее поля (`2 * 20px`), итого `240px`.
156
156
157
157
Теперь `clientWidth` -- ширина содержимого здесь равна не `300px`, а `284px`, т.к. `16px` отведено для полосы прокрутки. Таким образом: `284px` плюс левый и правый отступы -- всего `324px`.
158
158
159
-
**Если нет внутренних отступов, то `clientWidth/Height` в точности равны размеру области содержимого, внутри рамок и полосы прокрутки (если она есть).**
159
+
**Если нет внутренних отступов, то `clientWidth/Height` в точности равны размеру области содержимого внутри рамок и полосы прокрутки (если она есть).**
160
160
161
161

162
162
163
-
Поэтому, в тех случаях, когда мы точно знаем, что отступов нет, можно использовать `clientWidth/clientHeight` для получения размеров внутренней области содержимого.
163
+
Поэтому в тех случаях, когда мы точно знаем, что отступов нет, можно использовать `clientWidth/clientHeight` для получения размеров внутренней области содержимого.
Другими словами, свойство `scrollTop` -- это "сколько уже прокручено вверх".
203
203
204
-
````smart header="`scrollLeft/scrollTop` можно изменять"
205
-
В отличие от большинства свойств, которые доступны только для чтения, значения `scrollLeft/scrollTop` можно изменить, и браузер выполнит прокрутку элемента..
204
+
````smart header="`Свойства scrollLeft/scrollTop` можно изменять"
205
+
В отличие от большинства свойств, которые доступны только для чтения, значения `scrollLeft/scrollTop` можно изменять, и браузер выполнит прокрутку элемента..
206
206
207
207
```online
208
208
При клике на следующий элемент будет выполняться код `elem.scrollTop += 10`. Поэтому он будет прокручиваться на `10px` вниз.
Но как мы знаем из главы <info:styles-and-classes>, CSS-высоту и ширину можно извлечь, используя `getComputedStyle`.
221
221
222
-
Не лучше ли получать ширину так, вместо метрик?
222
+
Не лучше ли так получать ширину вместо метрик?
223
223
224
224
```js run
225
225
let elem = document.body;
@@ -230,7 +230,7 @@ alert( getComputedStyle(elem).width ); // show CSS width for elem
230
230
Почему мы должны использовать свойства метрик вместо этого? На это есть две причины:
231
231
232
232
1. Во-первых, CSS-свойства width/height зависят от другого свойства -- `box-sizing` которое определяет, "что такое", собственно, эти CSS-ширина и высота. Получается, что изменение `box-sizing`, к примеру, для более удобной вёрстки, сломает такой JavaScript.
233
-
2. Во-вторых, в CSS свойства `width/height` могут быть равны `auto`, например, для инлайн-элемента:
233
+
2. Во-вторых, в CSS -- свойства `width/height` могут быть равны `auto`, например, для инлайн-элемента:
234
234
235
235
```html run
236
236
<span id="elem">Привет!</span>
@@ -242,11 +242,11 @@ alert( getComputedStyle(elem).width ); // show CSS width for elem
242
242
</script>
243
243
```
244
244
245
-
Конечно, с точки зрения CSS `width:auto` is perfectly normal, – совершенно нормально, но нам-то в JavaScript нужен конкретный размер в `px`, который мы могли бы использовать для вычислений. Получается, что в данном случае ширина width из CSS вообще бесполезна.
245
+
Конечно, с точки зрения CSS `width:auto` – совершенно нормально, но нам-то в JavaScript нужен конкретный размер в `px`, который мы могли бы использовать для вычислений. Получается, что в данном случае ширина width из CSS вообще бесполезна.
246
246
247
-
Есть и ещё одна причина: Полоса прокрутки. Бывает без полосы прокрутки код работает прекрасно, но стоит ей появиться, как начинают появляться баги. Так происходит потому, что полоса прокрутки "отъедает" место от области внутреннего содежимого в некоторых браузерах. Таким образом, реальная ширина содержимого *меньше* CSS-ширины. И это учитывают свойства `clientWidth/clientHeight`.
247
+
Есть и ещё одна причина: полоса прокрутки. Бывает без полосы прокрутки код работает прекрасно, но стоит ей появиться, как начинают появляться баги. Так происходит потому, что полоса прокрутки "отъедает" место от области внутреннего содежимого в некоторых браузерах. Таким образом, реальная ширина содержимого *меньше* CSS-ширины. Как раз это и учитывают свойства `clientWidth/clientHeight`.
248
248
249
-
...Но с `getComputedStyle(elem).width` ситуация иная. Некоторые браузеры (например, Chrome) возвращают реальную внутреннюю ширину, минус ширину полосы прокрутки, а некоторые (например, Firefox) -- именно CSS-свойство (игнорируя полосу прокрутки). Эти кросс-браузерные отличия – ещё один повод не использовать `getComputedStyle`, а использовать свойства-метрики.
249
+
...Но с `getComputedStyle(elem).width` ситуация иная. Некоторые браузеры (например, Chrome) возвращают реальную внутреннюю ширину с вычетом ширины полосы прокрутки, а некоторые (например, Firefox) -- именно CSS-свойство (игнорируя полосу прокрутки). Эти кросс-браузерные отличия – ещё один повод не использовать `getComputedStyle`, а использовать свойства-метрики.
250
250
251
251
```online
252
252
Если ваш браузер показывает полосу прокрутки (например, под Windows почти все браузеры так делают), то вы можете протестировать это сами, нажав на кнопку в ифрейме ниже.
@@ -265,11 +265,11 @@ alert( getComputedStyle(elem).width ); // show CSS width for elem
- `offsetLeft/offsetTop` -- позиция в пикселях верхнеголевого угла, относительно `offsetParent`.
268
+
- `offsetLeft/offsetTop` -- позиция в пикселях верхнего-левого угла, относительно `offsetParent`.
269
269
- `offsetWidth/offsetHeight` -- "внешняя" ширина/высота элемента, включая рамки.
270
-
- `clientLeft/clientTop` -- расстояние от верхнего-левого внешнего угла до верхнего-левого внутренного угла элемента. Для операционных систем с ориентацией слева на право, эти свойства равны ширинам левой/верхней рамки. Если же вертикальная полоса прокрутки находится слева, то `clientLeft` включает в своё значение её ширину.
270
+
- `clientLeft/clientTop` -- расстояние от верхнего-левого внешнего угла до верхнего-левого внутренного угла элемента. Для операционных систем с ориентацией слева на право, эти свойства равны ширинам левой/верхней рамки. Если же вертикальная полоса прокрутки находится не справа, а слева, то `clientLeft` включает в своё значение её ширину.
271
271
- `clientWidth/clientHeight` -- ширина/высота содержимого вместе с полями внутреннего отступа, но без полосы прокрутки.
272
-
- `scrollWidth/scrollHeight` -- ширина/высота содержимого, включая прокручиваемую область. Включает в себя внутренние отступы и не включает полосы прокрутки.
272
+
- `scrollWidth/scrollHeight` -- ширина/высота содержимого, включая прокручиваемую область. Включает в себя внутренние отступы и не включает полосу прокрутки.
273
273
- `scrollLeft/scrollTop` -- ширина/высота прокрученной части элемента, считается от верхнего левого угла.
274
274
275
275
Все свойства, доступны только для чтения, кроме `scrollLeft/scrollTop`. Изменение этих свойств заставляет браузер прокручивать элемент.
0 commit comments