Skip to content

Commit 91311c3

Browse files
committed
minor
1 parent 9b566ae commit 91311c3

File tree

2 files changed

+25
-29
lines changed

2 files changed

+25
-29
lines changed

2-ui/1-document/09-size-and-scroll/1-get-scroll-height-bottom/task.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ importance: 5
44

55
# Найти размер прокрутки снизу
66

7-
Свойство `elem.scrollTop` содержит размер прокрученной области при отсчёте сверху. А как подсчитать "`scrollBottom`" -- размер прокрутки снизу?
7+
Свойство `elem.scrollTop` содержит размер прокрученной области при отсчёте сверху. А как подсчитать размер прокрутки снизу (назовём его `scrollBottom`)?
88

99
Напишите соответствующее выражение для произвольного элемента `elem`.
1010

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

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -32,44 +32,38 @@
3232
Вы можете [открыть этот пример в песочнице](sandbox:metric).
3333

3434
```smart header="Внимание, полоса прокрутки"
35-
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) оставляют место для неё, забирая его у области, отведённой для содержимого.
35+
В иллюстрации выше намеренно продемонстрирован самый сложный и полный случай, когда у элемента есть ещё и полоса прокрутки. Некоторые браузеры (не все) отбирают место для неё, забирая его у области, отведённой для содержимого (помечена как "content width" выше).
3636
37-
Таким образом, без учёта полосы прокрутки ширина области содержимого будет `300px`, но если предположить, что ширина полосы прокрутки равна `16px` (её точное значение зависит от устройства и браузера), тогда остаётся только `300 - 16 = 284px`, и мы должны это учитывать. Вот почему примеры в этой главе даны с полосой прокрутки. Если её не будет, то вычисления будут немного проще.
37+
Таким образом, без учёта полосы прокрутки ширина области содержимого (content width) будет `300px`, но если предположить, что ширина полосы прокрутки равна `16px` (её точное значение зависит от устройства и браузера), тогда остаётся только `300 - 16 = 284px`, и мы должны это учитывать. Вот почему примеры в этой главе даны с полосой прокрутки. Без неё некоторые вычисления будут проще.
3838
```
3939

4040
```smart header="Область `padding-bottom` (нижний внутренний отступ) может быть заполнена текстом"
41-
Нижние внутренние отступы `padding-bottom` изображены пустыми на иллюстрациях, но если элемент содержит много текста, то браузеры отображают его перекрывающим `padding-bottom`.
42-
43-
Это заметка, чтобы избежать недопониманий, так как во всех стилях дальнейших примеров `padding-bottom` есть (если не указано противное).
41+
Нижние внутренние отступы `padding-bottom` изображены пустыми на наших иллюстрациях, но если элемент содержит много текста, то он будет перекрывать `padding-bottom`, это нормально.
4442
```
4543
4644
## Метрики
4745
48-
Вот общая картина:
46+
Вот общая картина с геометрическими свойствами:
4947
5048
![](metric-all.svg)
5149
5250
Значениями свойств являются числа, подразумевается, что они в пикселях.
5351
54-
Существует множество свойств, и довольно трудно уместить их на одном изображении, но их значения просты и понятны.
55-
56-
Давайте начнём исследовать их снаружи элемента.
52+
Давайте начнём исследовать, начиная снаружи элемента.
5753
58-
## Свойства: offsetParent, offsetLeft/Top
54+
## offsetParent, offsetLeft/Top
5955
6056
Эти свойства редко используются, но так как они являются "самыми внешними" метриками, мы начнём с них.
6157
6258
В свойстве `offsetParent` находится предок элемента, который используется внутри браузера для вычисления координат при рендеринге.
6359
64-
Это ближайший предок, который браузер использует при вычислении координат во время рендеринга.
65-
6660
То есть, ближайший предок, который удовлетворяет следующим условиям:
6761
6862
1. Является CSS-позиционированным (CSS-свойство `position` равно `absolute`, `relative`, `fixed` или `sticky`),
6963
2. или `<td>`, `<th>`, `<table>`,
7064
3. или `<body>`.
7165
72-
Свойства `offsetLeft/offsetTop` содержат координаты x/y относительно верхнего левого угла родительского элемента.
66+
Свойства `offsetLeft/offsetTop` содержат координаты x/y относительно верхнего левого угла `offsetParent`.
7367
7468
В примере ниже внутренний `<div>` имеет элемент `<main>` в качестве `offsetParent`, а свойства `offsetLeft/offsetTop` являются сдвигами относительно верхнего левого угла (`180`):
7569
@@ -88,14 +82,13 @@
8882

8983
![](metric-offset-parent.svg)
9084

91-
9285
Существует несколько ситуаций, когда `offsetParent` равно `null`:
9386

9487
1. Для скрытых элементов (с CSS-свойством `display:none` или когда его нет в документе).
9588
2. Для элементов `<body>` и `<html>`.
9689
3. Для элементов с `position:fixed`.
9790

98-
## Свойства: offsetWidth/Height
91+
## offsetWidth/Height
9992

10093
Теперь переходим к самому элементу.
10194

@@ -126,7 +119,7 @@ function isHidden(elem) {
126119
Заметим, что функция `isHidden` также вернёт `true` для элементов, которые в принципе показываются, но их размеры равны нулю (например, пустые `<div>`).
127120
````
128121

129-
## Свойства: clientTop/Left
122+
## clientTop/Left
130123

131124
Пойдём дальше. Внутри элемента у нас рамки (border).
132125

@@ -145,19 +138,23 @@ function isHidden(elem) {
145138

146139
Она возникает, когда документ располагается справа налево (операционная система на арабском языке или иврите). Полоса прокрутки в этом случае находится слева, и тогда свойство `clientLeft` включает в себя ещё и ширину полосы прокрутки.
147140

148-
В этом случае `clientLeft` будет равно `25`, но с прокруткой -- `25 + 16 = 41`:
141+
В этом случае `clientLeft` будет равно `25`, но с прокруткой -- `25 + 16 = 41`.
142+
143+
Вот соответствующий пример на иврите:
149144

150145
![](metric-client-left-top-rtl.svg)
151146

152-
## Свойства: clientWidth/Height
147+
## clientWidth/Height
153148

154149
Эти свойства -- размер области внутри рамок элемента.
155150

156151
Они включают в себя ширину области содержимого вместе с внутренними отступами `padding`, но без прокрутки:
157152

158153
![](metric-client-width-height.svg)
159154

160-
На рисунке выше посмотрим вначале на высоту `clientHeight`: её посчитать проще всего. Горизонтальной прокрутки нет, так что это в точности то, что внутри рамок: CSS-высота `200px` плюс верхние и нижние внутренние отступы (`2 * 20px`), итого `240px`.
155+
На рисунке выше посмотрим вначале на высоту `clientHeight`.
156+
157+
Горизонтальной прокрутки нет, так что это в точности то, что внутри рамок: CSS-высота `200px` плюс верхние и нижние внутренние отступы (`2 * 20px`), итого `240px`.
161158

162159
Теперь `clientWidth` -- ширина содержимого здесь равна не `300px`, а `284px`, т.к. `16px` отведено для полосы прокрутки. Таким образом: `284px` плюс левый и правый отступы -- всего `324px`.
163160

@@ -167,10 +164,9 @@ function isHidden(elem) {
167164

168165
Поэтому в тех случаях, когда мы точно знаем, что отступов нет, можно использовать `clientWidth/clientHeight` для получения размеров внутренней области содержимого.
169166

170-
## Свойства: scrollWidth/Height
167+
## scrollWidth/Height
171168

172-
- Свойства `clientWidth/clientHeight` относятся только к видимой области элемента.
173-
- Свойства `scrollWidth/scrollHeight` добавляют к ней прокрученную (которую не видно) по горизонтали/вертикали:
169+
Эти свойства - как `clientWidth/clientHeight`, но также включают в себя прокрученную (которую не видно) часть элемента.
174170

175171
![](metric-scroll-width-height.svg)
176172

@@ -196,7 +192,7 @@ element.style.height = `${element.scrollHeight}px`;
196192
<button style="padding:0" onclick="element.style.height = `${element.scrollHeight}px`">element.style.height = `${element.scrollHeight}px`</button>
197193
```
198194

199-
## Свойства: scrollLeft/scrollTop
195+
## scrollLeft/scrollTop
200196

201197
Свойства `scrollLeft/scrollTop` -- ширина/высота невидимой, прокрученной в данный момент, части элемента слева и сверху.
202198

@@ -234,8 +230,8 @@ alert( getComputedStyle(elem).width ); // показывает CSS-ширину
234230
235231
Почему мы должны использовать свойства-метрики вместо этого? На то есть две причины:
236232
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`, например, для инлайнового элемента:
239235
240236
```html run
241237
<span id="elem">Привет!</span>
@@ -272,9 +268,9 @@ alert( getComputedStyle(elem).width ); // показывает CSS-ширину
272268
- `offsetParent` -- ближайший CSS-позиционированный родитель или ближайший `td`, `th`, `table`, `body`.
273269
- `offsetLeft/offsetTop` -- позиция в пикселях верхнего левого угла относительно `offsetParent`.
274270
- `offsetWidth/offsetHeight` -- "внешняя" ширина/высота элемента, включая рамки.
275-
- `clientLeft/clientTop` -- расстояние от верхнего левого внешнего угла до верхнего левого внутренного угла элемента. Для операционных систем с ориентацией слева направо эти свойства равны ширинам левой/верхней рамки. Если язык ОС таков, что ориентация справа налево, так что вертикальная полоса прокрутки находится не справа, а слева, то `clientLeft` включает в своё значение её ширину.
276-
- `clientWidth/clientHeight` -- ширина/высота содержимого вместе с внутренними отступами, но без полосы прокрутки.
271+
- `clientLeft/clientTop` -- расстояние от верхнего левого внешнего угла до внутренного. Для операционных систем с ориентацией слева-направо эти свойства равны ширинам левой/верхней рамки. Если язык ОС таков, что ориентация справа налево, так что вертикальная полоса прокрутки находится не справа, а слева, то `clientLeft` включает в своё значение её ширину.
272+
- `clientWidth/clientHeight` -- ширина/высота содержимого вместе с внутренними отступами `padding`, но без полосы прокрутки.
277273
- `scrollWidth/scrollHeight` -- ширины/высота содержимого, аналогично `clientWidth/Height`, но учитывают прокрученную, невидимую область элемента.
278274
- `scrollLeft/scrollTop` -- ширина/высота прокрученной сверху части элемента, считается от верхнего левого угла.
279275
280-
Все свойства доступны только для чтения, кроме `scrollLeft/scrollTop`. Изменение этих свойств заставляет браузер прокручивать элемент.
276+
Все свойства доступны только для чтения, кроме `scrollLeft/scrollTop`, изменение которых заставляет браузер прокручивать элемент.

0 commit comments

Comments
 (0)