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/10-size-and-scroll-window/article.md
+13-16Lines changed: 13 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,11 +2,11 @@
2
2
3
3
Как узнать ширину и высоту окна браузера? Как получить полную ширину и высоту документа, включая прокрученную часть? Как прокрутить страницу с помощью JavaScript?
4
4
5
-
С точки зрения DOM, корневым элементом документа является `document.documentElement`. Он соответствует тегу <html> и имеет геометрические свойства, описанные в [предыдущей статье](info:size-and-scroll). В некоторых случаях мы можем использовать их, однако есть дополнительные методы и особенности, которые необходимо учитывать.
5
+
Для большинства таких запросов мы можем использовать корневой элемент документа `document.documentElement`, который соответствует тего `<html>`. Однако есть дополнительные методы и особенности, которые необходимо учитывать.
6
6
7
7
## Ширина/высота окна
8
8
9
-
Свойства `clientWidth/clientHeight` из `document.documentElement` -- это именно то, что нам нужно:
9
+
Чтобы получить ширину/высоту окна, можно взять свойства `clientWidth/clientHeight` из `document.documentElement`:
10
10
11
11

12
12
@@ -21,7 +21,7 @@
21
21
22
22
Если есть полоса прокрутки, и она занимает какое-то место, то свойства `clientWidth/clientHeight` указывают на ширину/высоту документа без неё (за её вычетом). Иными словами, они возвращают высоту/ширину видимой части документа, доступной для содержимого.
23
23
24
-
A `window.innerWidth/innerHeight`игнорируют полосу прокрутки.
24
+
A `window.innerWidth/innerHeight`включают в себя полосу прокрутки.
25
25
26
26
Если полоса прокрутки занимает некоторое место, то эти две строки выведут разные значения:
27
27
```js run
@@ -33,17 +33,16 @@ alert( document.documentElement.clientWidth ); // ширина окна за в
33
33
````
34
34
35
35
```warn header="`DOCTYPE` -- это важно"
36
-
Обратите внимание, что геометрические свойства верхнего уровня могут работать немного иначе, если в HTML нет <!DOCTYPE HTML>. Возможны странные вещи.
36
+
Обратите внимание, что геометрические свойства верхнего уровня могут работать немного иначе, если в HTML нет `<!DOCTYPE HTML>`. Возможны странности.
37
37
38
-
Вообще, это немного за рамками JavaScript, но в данном случае это повлияет на поведение скриптов.
38
+
В современном HTML мы всегда должны указывать `DOCTYPE`.
39
39
```
40
40
41
41
## Ширина/высота документа
42
42
43
-
Теоретически, т.к. корневым элементом документа является `documentElement.clientWidth/Height`, и он включает в себя всё содержимое, мы можем измерить его полный размер как `documentElement.scrollWidth/scrollHeight`.
43
+
Теоретически, т.к. корневым элементом документа является `documentElement.clientWidth/Height`, и он включает в себя всё содержимое, мы можем получить полный размер документа как `documentElement.scrollWidth/scrollHeight`.
44
44
45
-
Эти свойства хорошо подходят для обычных элементов. Но для целой страницы эти свойства работают не так, как предполагалось. В Chrome/Safari/Opera, если нет прокрутки, то `documentElement.scrollHeight` может быть даже меньше, чем
46
-
`documentElement.clientHeight`! С точки зрения элемента это невозможная ситуация.
45
+
Но именно на этом элементе, для страницы в целом, эти свойства работают не так, как предполагается. В Chrome/Safari/Opera, если нет прокрутки, то `documentElement.scrollHeight` может быть даже меньше, чем `documentElement.clientHeight`! С точки зрения элемента это невозможная ситуация.
47
46
48
47
Чтобы надёжно получить полную высоту документа, нам следует взять максимальное из этих свойств:
49
48
@@ -65,7 +64,7 @@ alert('Полная высота документа с прокручиваем
65
64
Обычные элементы хранят текущее состояние прокрутки в `elem.scrollLeft/scrollTop`.
66
65
67
66
Что же со страницей?
68
-
В большинстве браузеров мы можем обратиться к `documentElement.scrollLeft/Top`, за исключением основанных на старом WebKit (Safari), где есть ошибки ([5991](https://bugs.webkit.org/show_bug.cgi?id=5991)), и там нужно использовать `document.body` вместо `document.documentElement`.
67
+
В большинстве браузеров мы можем обратиться к `documentElement.scrollLeft/Top`, за исключением основанных на старом WebKit (Safari), где есть ошибка ([5991](https://bugs.webkit.org/show_bug.cgi?id=5991)), и там нужно использовать `document.body` вместо `document.documentElement`.
69
68
70
69
К счастью, нам совсем не обязательно запоминать эти особенности, потому что текущую прокрутку можно прочитать из свойств `window.pageXOffset/pageYOffset`:
Обычные элементы можно прокручивать, изменяя `scrollTop/scrollLeft`.
88
87
89
-
Мы можем сделать то же самое для страниц, но:
90
-
- В большинстве браузеров используется `document.documentElement.scrollTop/Left`.
91
-
- В основанных на старом WebKit (Safari), как сказано выше, `document.body.scrollTop/Left`.
88
+
Мы можем сделать то же самое для страницы в целом, используя `document.documentElement.scrollTop/Left` (кроме основанных на старом WebKit (Safari), где, как сказано выше, `document.body.scrollTop/Left`).
92
89
93
-
В этих несовместимостях нет ничего хорошего, но запоминать их вовсе не надо. К счастью есть и более простое, универсальное решение: специальные методы `window.scrollBy(x,y)` и `window.scrollTo(pageX,pageY)`.
90
+
Есть и другие способы, в которых подобных несовместимостей нет: специальные методы `window.scrollBy(x,y)` и `window.scrollTo(pageX,pageY)`.
94
91
95
-
- Метод `scrollBy(x,y)` прокручивает страницу относительно её текущего положения. Например, `scrollBy(0,10)` прокручивает страницу на `10px` вниз.
92
+
- Метод `scrollBy(x,y)` прокручивает страницу *относительно её текущего положения*. Например, `scrollBy(0,10)` прокручивает страницу на `10px` вниз.
- Метод `scrollTo(pageX,pageY)` прокручивает страницу на абсолютные координаты `(pageX,pageY)`. То есть, чтобы левый-верхний угол видимой части страницы имел данные координаты относительно левого верхнего угла документа. Это всё равно, что поставить `scrollLeft/scrollTop`.
99
+
- Метод `scrollTo(pageX,pageY)` прокручивает страницу *на абсолютные координаты* `(pageX,pageY)`. То есть, чтобы левый-верхний угол видимой части страницы имел данные координаты относительно левого верхнего угла документа. Это всё равно, что поставить `scrollLeft/scrollTop`.
103
100
Для прокрутки в самое начало мы можем использовать `scrollTo(0,0)`.
Недостатком этого способа является то, что сама полоса прокрутки исчезает. Если она занимала некоторую ширину, то теперь эта ширина освободится, и содержимое страницы расширится, текст «прыгнет», заняв освободившееся место.
149
146
150
-
Это выглядит немного странно, но это можно обойти, если сравнить `clientWidth` до и после остановки, и если `clientWidth` увеличится (значит полоса прокрутки исчезла), то добавим `padding` в `document.body` вместо полосы прокрутки, чтобы оставить ширину содержимого прежней.
147
+
Это выглядит немного странно, но это можно обойти, если сравнить `clientWidth` до и после остановки, и если `clientWidth` увеличится (значит полоса прокрутки исчезла), то добавить `padding` в `document.body` вместо полосы прокрутки, чтобы оставить ширину содержимого прежней.
0 commit comments