Skip to content

Commit df1d9c7

Browse files
committed
minor
1 parent 7633fd3 commit df1d9c7

File tree

1 file changed

+13
-16
lines changed
  • 2-ui/1-document/10-size-and-scroll-window

1 file changed

+13
-16
lines changed

2-ui/1-document/10-size-and-scroll-window/article.md

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
Как узнать ширину и высоту окна браузера? Как получить полную ширину и высоту документа, включая прокрученную часть? Как прокрутить страницу с помощью JavaScript?
44

5-
С точки зрения DOM, корневым элементом документа является `document.documentElement`. Он соответствует тегу <html> и имеет геометрические свойства, описанные в [предыдущей статье](info:size-and-scroll). В некоторых случаях мы можем использовать их, однако есть дополнительные методы и особенности, которые необходимо учитывать.
5+
Для большинства таких запросов мы можем использовать корневой элемент документа `document.documentElement`, который соответствует тего `<html>`. Однако есть дополнительные методы и особенности, которые необходимо учитывать.
66

77
## Ширина/высота окна
88

9-
Свойства `clientWidth/clientHeight` из `document.documentElement` -- это именно то, что нам нужно:
9+
Чтобы получить ширину/высоту окна, можно взять свойства `clientWidth/clientHeight` из `document.documentElement`:
1010

1111
![](document-client-width-height.svg)
1212

@@ -21,7 +21,7 @@
2121

2222
Если есть полоса прокрутки, и она занимает какое-то место, то свойства `clientWidth/clientHeight` указывают на ширину/высоту документа без неё (за её вычетом). Иными словами, они возвращают высоту/ширину видимой части документа, доступной для содержимого.
2323

24-
A `window.innerWidth/innerHeight` игнорируют полосу прокрутки.
24+
A `window.innerWidth/innerHeight` включают в себя полосу прокрутки.
2525

2626
Если полоса прокрутки занимает некоторое место, то эти две строки выведут разные значения:
2727
```js run
@@ -33,17 +33,16 @@ alert( document.documentElement.clientWidth ); // ширина окна за в
3333
````
3434
3535
```warn header="`DOCTYPE` -- это важно"
36-
Обратите внимание, что геометрические свойства верхнего уровня могут работать немного иначе, если в HTML нет <!DOCTYPE HTML>. Возможны странные вещи.
36+
Обратите внимание, что геометрические свойства верхнего уровня могут работать немного иначе, если в HTML нет `<!DOCTYPE HTML>`. Возможны странности.
3737
38-
Вообще, это немного за рамками JavaScript, но в данном случае это повлияет на поведение скриптов.
38+
В современном HTML мы всегда должны указывать `DOCTYPE`.
3939
```
4040
4141
## Ширина/высота документа
4242
43-
Теоретически, т.к. корневым элементом документа является `documentElement.clientWidth/Height`, и он включает в себя всё содержимое, мы можем измерить его полный размер как `documentElement.scrollWidth/scrollHeight`.
43+
Теоретически, т.к. корневым элементом документа является `documentElement.clientWidth/Height`, и он включает в себя всё содержимое, мы можем получить полный размер документа как `documentElement.scrollWidth/scrollHeight`.
4444
45-
Эти свойства хорошо подходят для обычных элементов. Но для целой страницы эти свойства работают не так, как предполагалось. В Chrome/Safari/Opera, если нет прокрутки, то `documentElement.scrollHeight` может быть даже меньше, чем
46-
`documentElement.clientHeight`! С точки зрения элемента это невозможная ситуация.
45+
Но именно на этом элементе, для страницы в целом, эти свойства работают не так, как предполагается. В Chrome/Safari/Opera, если нет прокрутки, то `documentElement.scrollHeight` может быть даже меньше, чем `documentElement.clientHeight`! С точки зрения элемента это невозможная ситуация.
4746
4847
Чтобы надёжно получить полную высоту документа, нам следует взять максимальное из этих свойств:
4948
@@ -65,7 +64,7 @@ alert('Полная высота документа с прокручиваем
6564
Обычные элементы хранят текущее состояние прокрутки в `elem.scrollLeft/scrollTop`.
6665
6766
Что же со страницей?
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`.
6968
7069
К счастью, нам совсем не обязательно запоминать эти особенности, потому что текущую прокрутку можно прочитать из свойств `window.pageXOffset/pageYOffset`:
7170
@@ -86,20 +85,18 @@ alert('Текущая прокрутка слева: ' + window.pageXOffset);
8685
8786
Обычные элементы можно прокручивать, изменяя `scrollTop/scrollLeft`.
8887
89-
Мы можем сделать то же самое для страниц, но:
90-
- В большинстве браузеров используется `document.documentElement.scrollTop/Left`.
91-
- В основанных на старом WebKit (Safari), как сказано выше, `document.body.scrollTop/Left`.
88+
Мы можем сделать то же самое для страницы в целом, используя `document.documentElement.scrollTop/Left` (кроме основанных на старом WebKit (Safari), где, как сказано выше, `document.body.scrollTop/Left`).
9289
93-
В этих несовместимостях нет ничего хорошего, но запоминать их вовсе не надо. К счастью есть и более простое, универсальное решение: специальные методы `window.scrollBy(x,y)` и `window.scrollTo(pageX,pageY)`.
90+
Есть и другие способы, в которых подобных несовместимостей нет: специальные методы `window.scrollBy(x,y)` и `window.scrollTo(pageX,pageY)`.
9491
95-
- Метод `scrollBy(x,y)` прокручивает страницу относительно её текущего положения. Например, `scrollBy(0,10)` прокручивает страницу на `10px` вниз.
92+
- Метод `scrollBy(x,y)` прокручивает страницу *относительно её текущего положения*. Например, `scrollBy(0,10)` прокручивает страницу на `10px` вниз.
9693
9794
```online
9895
Кнопка ниже демонстрирует это:
9996
10097
<button onclick="window.scrollBy(0,10)">window.scrollBy(0,10)</button>
10198
```
102-
- Метод `scrollTo(pageX,pageY)` прокручивает страницу на абсолютные координаты `(pageX,pageY)`. То есть, чтобы левый-верхний угол видимой части страницы имел данные координаты относительно левого верхнего угла документа. Это всё равно, что поставить `scrollLeft/scrollTop`.
99+
- Метод `scrollTo(pageX,pageY)` прокручивает страницу *на абсолютные координаты* `(pageX,pageY)`. То есть, чтобы левый-верхний угол видимой части страницы имел данные координаты относительно левого верхнего угла документа. Это всё равно, что поставить `scrollLeft/scrollTop`.
103100
Для прокрутки в самое начало мы можем использовать `scrollTo(0,0)`.
104101
105102
```online
@@ -147,7 +144,7 @@ alert('Текущая прокрутка слева: ' + window.pageXOffset);
147144
148145
Недостатком этого способа является то, что сама полоса прокрутки исчезает. Если она занимала некоторую ширину, то теперь эта ширина освободится, и содержимое страницы расширится, текст «прыгнет», заняв освободившееся место.
149146
150-
Это выглядит немного странно, но это можно обойти, если сравнить `clientWidth` до и после остановки, и если `clientWidth` увеличится (значит полоса прокрутки исчезла), то добавим `padding` в `document.body` вместо полосы прокрутки, чтобы оставить ширину содержимого прежней.
147+
Это выглядит немного странно, но это можно обойти, если сравнить `clientWidth` до и после остановки, и если `clientWidth` увеличится (значит полоса прокрутки исчезла), то добавить `padding` в `document.body` вместо полосы прокрутки, чтобы оставить ширину содержимого прежней.
151148
152149
## Итого
153150

0 commit comments

Comments
 (0)