Skip to content

Commit c493c5c

Browse files
committed
2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave: Translation P.2
1 parent b85cab0 commit c493c5c

File tree

1 file changed

+48
-48
lines changed
  • 2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave

1 file changed

+48
-48
lines changed

2-ui/3-event-details/3-mousemove-mouseover-mouseout-mouseenter-mouseleave/article.md

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -99,73 +99,73 @@
9999
```online
100100
Ви можете це добре побачити в прикладі нижче: `<div id="child">` знаходиться всередині `<div id="parent">`. І обробники `mouseover/out` для елементу `#parent` виведуть деталі події.
101101
102-
If you move the mouse from `#parent` to `#child`, you see two events on `#parent`:
103-
1. `mouseout [target: parent]` (left the parent), then
104-
2. `mouseover [target: child]` (came to the child, bubbled).
102+
Якщо ви перемістите вказівник миші від `#parent` до `#child`, це викличе дві події на `#parent`:
103+
1. `mouseout [target: parent]` (вказівник залишив parent), далі
104+
2. `mouseover [target: child]` (дійшов до child, спливання події).
105105
106106
[codetabs height=360 src="mouseoverout-child"]
107107
```
108108

109-
As shown, when the pointer moves from `#parent` element to `#child`, two handlers trigger on the parent element: `mouseout` and `mouseover`:
109+
Як показано, коли вказівник переміщується від елемента `#parent` до `#child`, на батьківському елементі запускаються два обробники: `mouseout` і `mouseover`:
110110

111111
```js
112112
parent.onmouseout = function(event) {
113-
/* event.target: parent element */
113+
/* event.target: parent елемент */
114114
};
115115
parent.onmouseover = function(event) {
116-
/* event.target: child element (bubbled) */
116+
/* event.target: child елемент (спливання) */
117117
};
118118
```
119119

120-
**If we don't examine `event.target` inside the handlers, then it may seem that the mouse pointer left `#parent` element, and then immediately came back over it.**
120+
**Якщо ми не перевіримо `event.target` всередині обробників, то може здатися, що вказівник миші залишив елемент `#parent`, а потім одразу повернувся на нього.**
121121

122-
But that's not the case! The pointer is still over the parent, it just moved deeper into the child element.
122+
Але це не так! Вказівник все ще знаходиться над батьківським елементом, він просто перемістився глибше на дочірній елемент.
123123

124-
If there are some actions upon leaving the parent element, e.g. an animation runs in `parent.onmouseout`, we usually don't want it when the pointer just goes deeper into `#parent`.
124+
Якщо є якісь дії після виходу з батьківського елемента, напр. анімація запускається в `parent.onmouseout`, ми зазвичай не хочемо цього, коли вказівник просто йде глибше в `#parent`.
125125

126-
To avoid it, we can check `relatedTarget` in the handler and, if the mouse is still inside the element, then ignore such event.
126+
Щоб уникнути цього, ми можемо перевірити `relatedTarget` в обробнику і, якщо вказівник все ще всередині елемента, ігнорувати цю подію.
127127

128-
Alternatively we can use other events: `mouseenter` and `mouseleave`, that we'll be covering now, as they don't have such problems.
128+
Як альтернативу ми можемо використовувати інші події: `mouseenter` і `mouseleave`, які ми зараз розглянемо, оскільки вони не мають таких проблем.
129129

130-
## Events mouseenter and mouseleave
130+
## Події mouseenter і mouseleave
131131

132-
Events `mouseenter/mouseleave` are like `mouseover/mouseout`. They trigger when the mouse pointer enters/leaves the element.
132+
Події `mouseenter/mouseleave` схожі на `mouseover/mouseout`. Вони спрацьовують, коли вказівник миші входить або залишає елемент.
133133

134-
But there are two important differences:
134+
Але є дві важливі відмінності:
135135

136-
1. Transitions inside the element, to/from descendants, are not counted.
137-
2. Events `mouseenter/mouseleave` do not bubble.
136+
1. Переходи всередині елемента до/від нащадків не враховуються.
137+
2. Події `mouseenter/mouseleave` не спливають.
138138

139-
These events are extremely simple.
139+
Ці події надзвичайно прості.
140140

141-
When the pointer enters an element -- `mouseenter` triggers. The exact location of the pointer inside the element or its descendants doesn't matter.
141+
Коли вказівник входить на елемент, спрацьовує `mouseenter`. Точне розташування вказівника всередині елемента або його нащадків не має значення.
142142

143-
When the pointer leaves an element -- `mouseleave` triggers.
143+
Коли вказівник залишає елемент, спрацьовує `mouseleave`.
144144

145145
```online
146-
This example is similar to the one above, but now the top element has `mouseenter/mouseleave` instead of `mouseover/mouseout`.
146+
Цей приклад подібний до наведеного вище, але тепер у верхньому елементі є `mouseenter/mouseleave` замість `mouseover/mouseout`.
147147
148-
As you can see, the only generated events are the ones related to moving the pointer in and out of the top element. Nothing happens when the pointer goes to the child and back. Transitions between descendants are ignored
148+
Як бачите, єдині генеровані події пов’язані з переміщенням вказівника в верхній елемент і з нього. Нічого не відбувається, коли покажчик йде до дочірнього елемента і назад. Переходи між нащадками ігноруються
149149
150150
[codetabs height=340 src="mouseleave"]
151151
```
152152

153-
## Event delegation
153+
## Делегування подій (Event delegation)
154154

155-
Events `mouseenter/leave` are very simple and easy to use. But they do not bubble. So we can't use event delegation with them.
155+
Події `mouseenter/leave` дуже прості та легкі у використанні. Але вони не спливають. Тому ми не можемо використовувати з ними делегування подій (event delegation).
156156

157-
Imagine we want to handle mouse enter/leave for table cells. And there are hundreds of cells.
157+
Уявіть, що ми хочемо керувати входом/виходом вказівника миші для клітинок таблиці, в якій сотні клітин.
158158

159-
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>` is able to catch it.
159+
Ефективним рішенням було б встановити обробник на `<table>` і обробляти події там. Але `mouseenter/leave` не спливають. Отже, якщо така подія відбувається на `<td>`, то лише обробник на цьому `<td>` може її перехопити.
160160

161-
Handlers for `mouseenter/leave` on `<table>` only trigger when the pointer enters/leaves the table as a whole. It's impossible to get any information about transitions inside it.
161+
Обробники для `mouseenter/leave` на `<table>` запускаються лише тоді, коли вказівник входить/виходить із таблиці в цілому. Інформацію про переходи всередині нього отримати неможливо.
162162

163-
So, let's use `mouseover/mouseout`.
163+
Отже, давайте використаємо `mouseover/mouseout`.
164164

165-
Let's start with simple handlers that highlight the element under mouse:
165+
Почнемо з простих обробників, які підсвічують елемент під вказіником миші:
166166

167167
```js
168-
// let's highlight an element under the pointer
168+
// виділимо елемент під вказівником
169169
table.onmouseover = function(event) {
170170
let target = event.target;
171171
target.style.background = 'pink';
@@ -178,44 +178,44 @@ table.onmouseout = function(event) {
178178
```
179179

180180
```online
181-
Here they are in action. As the mouse travels across the elements of this table, the current one is highlighted:
181+
Ось вони в дії. Коли миша переміщається по елементах цієї таблиці, поточний виділяється:
182182
183183
[codetabs height=480 src="mouseenter-mouseleave-delegation"]
184184
```
185185

186-
In our case we'd like to handle transitions between table cells `<td>`: entering a cell and leaving it. Other transitions, such as inside the cell or outside of any cells, don't interest us. Let's filter them out.
186+
У нашому випадку ми хочемо обробляти переходи між клітинами таблиці `<td>`: вхід у клітину та вихід з неї. Інші переходи, як всередині клітини або за її межами, нас не цікавлять. Відфільтруємо їх.
187187

188-
Here's what we can do:
188+
Ось що ми можемо зробити:
189189

190-
- Remember the currently highlighted `<td>` in a variable, let's call it `currentElem`.
191-
- On `mouseover` -- ignore the event if we're still inside the current `<td>`.
192-
- On `mouseout` -- ignore if we didn't leave the current `<td>`.
190+
- Запам’ятайте поточний виділений `<td>` у змінній, назвемо її `currentElem`.
191+
- При `mouseover` -- ігноруємо, якщо ми все ще перебуваємо всередині поточного `<td>`.
192+
- При `mouseout` -- ігноруємо, якщо ми не залишили поточний `<td>`.
193193

194-
Here's an example of code that accounts for all possible situations:
194+
Ось приклад коду, який враховує всі можливі ситуації:
195195

196196
[js src="mouseenter-mouseleave-delegation-2/script.js"]
197197

198-
Once again, the important features are:
199-
1. It uses event delegation to handle entering/leaving of any `<td>` inside the table. So it relies on `mouseover/out` instead of `mouseenter/leave` that don't bubble and hence allow no delegation.
200-
2. Extra events, such as moving between descendants of `<td>` are filtered out, so that `onEnter/Leave` runs only if the pointer leaves or enters `<td>` as a whole.
198+
І ще раз про важливі особливості такого підходу:
199+
1. Ми використовуємо делегування подій для обробки входу/виходу вказівника на будь-який `<td>` всередині таблиці. Таким чином, ми покладаємося на `mouseover/out` замість `mouseenter/leave`, які не спливають і, отже, не дозволяють делегування.
200+
2. Додаткові події, такі як переміщення між нащадками `<td>`, відфільтровуються, тому `onEnter/Leave` запускається, лише якщо вказівник залишає або входить на `<td>`.
201201

202202
```online
203-
Here's the full example with all details:
203+
Ось повний приклад з усіма деталями:
204204
205205
[codetabs height=460 src="mouseenter-mouseleave-delegation-2"]
206206
207-
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.
207+
Спробуйте перемістити курсор у клітини таблиці та всередину них. Швидко чи повільно -- не має значення. На відміну від попереднього прикладу, виділено лише `<td>`.
208208
```
209209

210-
## Summary
210+
## Підсумки
211211

212-
We covered events `mouseover`, `mouseout`, `mousemove`, `mouseenter` and `mouseleave`.
212+
Ми розглянули події `mouseover`, `mouseout`, `mousemove`, `mouseenter` і `mouseleave`.
213213

214-
These things are good to note:
214+
Варто звернути увагу на такі речі:
215215

216-
- A fast mouse move may skip intermediate elements.
217-
- Events `mouseover/out` and `mouseenter/leave` have an additional property: `relatedTarget`. That's the element that we are coming from/to, complementary to `target`.
216+
- Швидкий рух миші може призвести до пропуску проміжних елементів.
217+
- Події `mouseover/out` і `mouseenter/leave` мають додаткову властивість: `relatedTarget`. Це елемент, до/від якого ми йдемо, доповнюючи `target`.
218218

219-
Events `mouseover/out` trigger even when we go from the parent element to a child element. The browser assumes that the mouse can be only over one element at one time -- the deepest one.
219+
Події `mouseover/out` запускаються, навіть коли ми переходимо від батьківського елемента до дочірнього. Браузер припускає, що вказівник миші може одночасно перебувати лише над одним елементом -- найглибшим.
220220

221-
Events `mouseenter/leave` are different in that aspect: they only trigger when the mouse comes in and out the element as a whole. Also they do not bubble.
221+
Події `mouseenter/leave` відрізняються в цьому аспекті: вони запускаються лише тоді, коли вказівник миші входить і виходить з елемента в цілому. І ще вони не спливають.

0 commit comments

Comments
 (0)