Skip to content

Commit 9a3e0b0

Browse files
authored
Update article.md
1 parent a4f7669 commit 9a3e0b0

1 file changed

Lines changed: 10 additions & 10 deletions

File tree

  • 2-ui/3-event-details/4-mouse-drag-and-drop

2-ui/3-event-details/4-mouse-drag-and-drop/article.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Drag'n'Drop - отличный способ улучшить интерфейс.
66

77
Они интересны тем, что позволяют легко решать простые задачи. Например, можно перетащить файл в браузер, так что JS получит доступ к его содержимому.
88

9-
Но у встроенных событий, входящих в Drag’n’Drop, также есть ограничения. Например, нельзя организовать перенос «только по горизонтали» или «только по вертикали». Также нельзя ограничить перенос внутри заданной зоны. Есть и другие интерфейсные задачи, которые такими встроенными событиями нереализуемы.
9+
Но у встроенных событий, входящих в Drag’n’Drop, также есть ограничения. Например, нельзя организовать перенос "только по горизонтали" или "только по вертикали". Также нельзя ограничить перенос внутри заданной зоны. Есть и другие интерфейсные задачи, которые такими встроенными событиями нереализуемы.
1010

1111
Поэтому здесь мы будем рассматривать Drag’n’Drop при помощи событий мыши. Это не так уж сложно.
1212

@@ -19,7 +19,7 @@ Drag'n'Drop - отличный способ улучшить интерфейс.
1919
3. При наступлении `mousemove` передвигаем элемент на новые координаты путём смены `left/top` и `position:absolute`.
2020
4. На `mouseup` (при отпускании кнопки мыши) -- остановить перенос элемента и произвести все действия, связанные с окончанием Drag’n’Drop..
2121

22-
Это есть база Drag'n'Drop. Мы могли бы расширить этот алгоритм, например, подсветив элементы при наведении на них курсора.
22+
Это и есть база Drag'n'Drop. Мы могли бы расширить этот алгоритм, например, подсветив элементы при наведении на них курсора.
2323

2424
В следующем примере эти шаги реализованы для переноса мяча:
2525

@@ -58,7 +58,7 @@ ball.onmousedown = function(event) { // (1) отследить нажатие
5858
};
5959
```
6060

61-
Если запустить этот код, то мы заметим нечто странное. При начале переноса мяч «раздваивается» и переносится не сам мяч, а его «клон».
61+
Если запустить этот код, то мы заметим нечто странное. При начале переноса мяч "раздваивается" и переносится не сам мяч, а его "клон".
6262

6363
```online
6464
Это можно увидеть в действии:
@@ -88,7 +88,7 @@ ball.ondragstart = function() {
8888

8989
Ещё одна особенность правильного Drag’n’Drop -- событие `mousemove` отслеживается на `document`, а не на `ball`. С первого взгляда кажется, что мышь всегда над мячом и обработчик `mousemove` можно повесить на сам мяч, а не на документ.
9090

91-
Но как мы помним, событие `mousemove` возникает хоть и часто, но не для каждого пикселя. Поэтому из-за быстрого движения курсор может выпрыгнуть и оказаться где-нибудь в середине документа (или даже за пределами окна).
91+
Но как мы помним, событие `mousemove` возникает хоть и часто, но не для каждого пикселя. Поэтому из-за быстрого движения курсор может спрыгнуть с мяча и оказаться где-нибудь в середине документа (или даже за пределами окна).
9292

9393
Вот почему мы должны отслеживать `mousemove` на всём `document`.
9494

@@ -101,11 +101,11 @@ ball.style.left = pageX - ball.offsetWidth / 2 + 'px';
101101
ball.style.top = pageY - ball.offsetHeight / 2 + 'px';
102102
```
103103

104-
Неплохо, но есть побочные эффекты. В частности, в самом начале переноса, особенно если мячик «взят» за край – он резко «прыгает» центром под курсор мыши.
104+
Неплохо, но есть побочные эффекты. В частности, в самом начале переноса, особенно если мячик "взят" за край – он резко "прыгает" центром под курсор мыши.
105105

106106
Было бы лучше, если бы изначальный сдвиг курсора относительно элемента сохранялся.
107107

108-
Где захватили, за ту «часть элемента» и переносим:
108+
Где захватили, за ту "часть элемента" и переносим:
109109

110110
![](ball_shift.png)
111111

@@ -178,7 +178,7 @@ ball.ondragstart = function() {
178178
[iframe src="ball3" height=230]
179179
```
180180

181-
Различие особенно заметно, если захватить мяч за правый нижний угол. В предыдущем примере мячик «прыгнет» серединой под курсор, в этом – будет плавно переноситься с текущей позиции.
181+
Различие особенно заметно, если захватить мяч за правый нижний угол. В предыдущем примере мячик "прыгнет" серединой под курсор, в этом – будет плавно переноситься с текущей позиции.
182182

183183
## Выявление droppable
184184

@@ -217,7 +217,7 @@ ball.ondragstart = function() {
217217

218218
Так что же делать?
219219

220-
Существует метод `document.elementFromPoint(clientX, clientY)`. Он возвращает наиболее глубоко вложенный элемент по заданным координатам окна (или `null` если координаты находятся за пределами окна).
220+
Существует метод `document.elementFromPoint(clientX, clientY)`. Он возвращает наиболее глубоко вложенный элемент по заданным координатам окна (или `null`, если координаты находятся за пределами окна).
221221

222222
Таким образом, через любой из наших обработчиков событий мыши мы можем обнаружить тот элемент, который потеницально мог бы принять на себя конец перемещения:
223223

@@ -226,7 +226,7 @@ ball.ondragstart = function() {
226226
ball.hidden = true; // (*)
227227
let elemBelow = document.elementFromPoint(event.clientX, event.clientY);
228228
ball.hidden = false;
229-
// elemBelow - элемент под шаром. Если на нем можно закончить перемещение, мы сможем этим управлять.
229+
// elemBelow - элемент под шаром. Если на нём можно закончить перемещение, мы сможем этим управлять.
230230
```
231231

232232
Заметим, нам нужно спрятать мяч перед вызовом функции `(*)`. В противном случае по этим координатам мы будем получать мяч, ведь это и есть элемент непосредственно под указателем: `elemBelow=ball`.
@@ -275,7 +275,7 @@ function onMouseMove(event) {
275275

276276
[codetabs height=250 src="ball4"]
277277

278-
Теперь в течение всего процесса в переменной `currentDroppable` мы храним текущую «цель удаления», и мы можем использовать её для того, чтобы выделить цель, или для любых других вещей.
278+
Теперь в течение всего процесса в переменной `currentDroppable` мы храним текущую "цель удаления", и мы можем использовать её для того, чтобы выделить цель, или для любых других вещей.
279279

280280
## Итого
281281

0 commit comments

Comments
 (0)