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/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md
+36-36Lines changed: 36 additions & 36 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
# Движение: mouseover/-out, mouseenter/-leave
1
+
# Движение: mouseover/out, mouseenter/leave
2
2
3
3
В этой главе мы более подробно рассмотрим события, возникающие при движении указателя (курсора) мыши над элементами страницы.
4
4
@@ -84,7 +84,7 @@
84
84
85
85
На примере ниже можно увидеть забавную последовательность сгенерированных событий.
86
86
87
-
Красный `<div>` находится внутри синего. На синем `<div>`-е определены обработчики событий `mouseover/-out`, которые отображают всю информацию по ним в текстовое поле ниже.
87
+
Красный `<div>` находится внутри синего. На синем `<div>`-е определены обработчики событий `mouseover/out`, которые отображают всю информацию по ним в текстовое поле ниже.
88
88
89
89
Попробуйте зайти курсором на синий элемент, а затем перейдите на красный -- и смотрите, какие события сгенерировались:
90
90
@@ -96,43 +96,43 @@
96
96
97
97
Таким образом, для обработчика, который не принимает во внимание свойство `target`, ситуация выглядит так, как будто курсор ушёл с родительского элемента, запустив `mouseout` на строке `(2)`, а затем вернулся обратно, запустив `mouseover` на строке `(3)`.
98
98
99
-
Если постоянно передвигать курсор мышки между элементами, то мы получим много "ложных" срабатываний обработчиков. В простых случаях это может быть незаметно для пользователя, но в сложных случаях могут проявляться нежелательные побочные эффекты.
99
+
Если постоянно передвигать курсор мышки с/на элемент, то мы получим много "ложных" срабатываний обработчиков. В простых случаях это может быть незаметно для пользователя, но в сложных случаях могут проявляться нежелательные побочные эффекты.
100
100
101
101
Чтобы их избежать, можно использовать события `mouseenter/mouseleave`.
102
102
103
-
## Events mouseenter and mouseleave
103
+
## События mouseenter и mouseleave
104
104
105
-
Events`mouseenter/mouseleave`are like`mouseover/mouseout`. They also trigger when the mouse pointer enters/leaves the element.
105
+
События`mouseenter/mouseleave`похожи на`mouseover/mouseout`. Они тоже генерируются, когда курсор мыши заходит на элемент или покидает его.
106
106
107
-
But there are two differences:
107
+
Но есть и пара важных отличий:
108
108
109
-
1.Transitions inside the element are not counted.
110
-
2.Events`mouseenter/mouseleave`do not bubble.
109
+
1.Переходы внутри элемента на дочерние элементы не считаются.
110
+
2.События`mouseenter/mouseleave`не всплывают.
111
111
112
-
These events are intuitively very clear.
112
+
Эти события интуитивно очень понятны.
113
113
114
-
When the pointer enters an element -- the`mouseenter` triggers, and then doesn't matter where it goes while inside the element. The`mouseleave`event only triggers when the cursor leaves it.
114
+
Когда курсор становится над элементом -- генерируется`mouseenter`, и не имеет значения, где именно находится курсор внутри элемента. Событие`mouseleave`происходит, когда курсор покидает элемент.
115
115
116
-
If we make the same example, but put `mouseenter/mouseleave`on the blue `<div>`, and do the same -- we can see that events trigger only on entering and leaving the blue `<div>`. No extra events when going to the red one and back. Children are ignored.
116
+
Если мы вернёмся к одному из прошлых примеров и в этот раз поставим обработчики событий `mouseenter/mouseleave`на синий `<div>`, а далее произведем те же действия -- мы увидим, что сгенерируются только события, связанные с движением курсора относительно синего `<div>`. Ничего не произойдет при переходе на красный `<div>` и обратно. Переходы с/на дочерние элементы игнорируются.
117
117
118
118
[codetabs height=340 src="mouseleave"]
119
119
120
-
## Event delegation
120
+
## Делегирование событий
121
121
122
-
Events`mouseenter/leave`are very simple and easy to use. But they do not bubble. So we can't use event delegation with them.
122
+
События`mouseenter/leave`простые и легкие в использовании. Но они не всплывают. Таким образом, мы не можем их делегировать.
123
123
124
-
Imagine we want to handle mouse enter/leave for table cells. And there are hundreds of cells.
124
+
Представьте ситуацию, что мы хотим обрабатывать события, сгенерированные при движении курсора по ячейкам таблицы. И в таблице сотни ячеек.
125
125
126
-
The natural solution would be -- to set the handler on`<table>`and process events there. But`mouseenter/leave`don't bubble. So if such event happens on `<td>`, then only a handler on that `<td>`can catch it.
126
+
Очевидное решение -- определить обработчик на родительском элементе`<table>`и там обрабатывать возникающие события. Но`mouseenter/leave`не всплывают. То есть если событие происходит на ячейке `<td>`, то только обработчик на `<td>`может поймать его.
127
127
128
-
Handlers for`mouseenter/leave`on`<table>`only trigger on entering/leaving the whole table. It's impossible to get any information about transitions inside it.
128
+
Обработчики событий`mouseenter/leave`на`<table>`срабатывают, если курсор оказывается над таблицей в целом или же уходит с неё. Невозможно получить какую-либо информацию о переходах между ячейками внутри таблицы.
129
129
130
-
Not a problem -- let's use`mouseover/mouseout`.
130
+
Не проблема -- давайте использовать`mouseover/mouseout`.
These handlers work when going from any element to any inside the table.
151
+
Эти обработчики срабатывают, когда курсор передвигается между элементами внутри таблицы (не только `<td>`).
152
152
153
-
But we'd like to handle only transitions in and out of `<td>` as a whole. And highlight the cells as a whole. We don't want to handle transitions that happen between the children of`<td>`.
153
+
Но мы бы хотели, чтобы они срабатывали только на переходах между ячейками и выделяли ячейку целиком. Мы не хотим обрабатывать события переходов курсора между элементами внутри ячейки`<td>`.
154
154
155
-
One of solutions:
155
+
Одно из решений:
156
156
157
-
-Remember the currently highlighted `<td>`in a variable.
158
-
-On`mouseover` -- ignore the event if we're still inside the current`<td>`.
159
-
-On`mouseout` -- ignore if we didn't leave the current`<td>`.
157
+
-Запоминать выделенную в данный момент ячейку `<td>`в переменную.
158
+
-На`mouseover` -- игнорировать событие, если мы всё ещё внутри той же самой ячейки`<td>`.
159
+
-На`mouseout` -- игнорировать событие, если это не уход с текущей ячейки`<td>`.
160
160
161
-
That filters out "extra" events when we are moving between the children of`<td>`.
161
+
Это отфильтровывает все лишние события, возникающие при переходе курсора между дочерними элементами`<td>`.
162
162
163
163
```offline
164
-
The details are in the [full example](sandbox:mouseenter-mouseleave-delegation-2).
164
+
Детали реализации в [полном примере](sandbox:mouseenter-mouseleave-delegation-2).
Try to move the cursor in and out of table cells and inside them. Fast or slow -- doesn't matter. Only `<td>` as a whole is highlighted unlike the example before.
172
+
Попробуйте подвигать курсор между ячейками и внутри них. Быстро или медленно - без разницы. В отличие от предыдущего примера выделяется только сама ячейка `<td>`.
173
173
```
174
174
175
175
176
-
## Summary
176
+
## Итого
177
177
178
-
We covered events`mouseover`, `mouseout`, `mousemove`, `mouseenter`and`mouseleave`.
178
+
Мы рассмотрели события`mouseover`, `mouseout`, `mousemove`, `mouseenter`и`mouseleave`.
179
179
180
-
Things that are good to note:
180
+
Стоит отметить, что:
181
181
182
-
-A fast mouse move can make `mouseover, mousemove, mouseout`to skip intermediate elements.
183
-
-Events`mouseover/out`and`mouseenter/leave`have an additional target: `relatedTarget`. That's the element that we are coming from/to, complementary to `target`.
184
-
-Events`mouseover/out`trigger even when we go from the parent element to a child element. They assume that the mouse can be only over one element at one time -- the deepest one.
185
-
-Events`mouseenter/leave`do not bubble and do not trigger when the mouse goes to a child element. They only track whether the mouse comes inside and outside the element as a whole.
182
+
-Быстрое движение мышкой может не запустить события `mouseover, mousemove, mouseout`на промежуточных элементах.
183
+
-События`mouseover/out`и`mouseenter/leave`имеют дополнительное свойство: `relatedTarget`. Оно дополняет свойство `target` и содержит ссылку на элемент, с/на который мы переходим.
184
+
-События`mouseover/out`запускаются, даже когда происходит переход с родительского на дочерний элемент. В этом случае предполагается, что курсор мыши может быть только над одним элементом в любой момент времени - над самым глубоко вложенным.
185
+
-События`mouseenter/leave`не всплывают и не генерируются, когда курсор переходит на дочерний элемент. Они следят только за переходами с/на сам элемент, не принимая во внимание его дочерние элементы.
0 commit comments