-
Notifications
You must be signed in to change notification settings - Fork 0
/
drag&drop.js
46 lines (43 loc) · 1.36 KB
/
drag&drop.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
export const initDragDrop = () => {
const draggables = document.querySelectorAll(".draggable");
const list = document.querySelector(".todo-list");
console.log(draggables);
draggables.forEach(draggable => {
draggable.addEventListener("dragstart", () => {
draggable.classList.add("dragging");
});
draggable.addEventListener("dragend", () => {
draggable.classList.remove("dragging");
});
});
list.addEventListener("dragover", e => {
e.preventDefault();
const afterElement = getDragAfterElement(list, e.clientY);
console.log(afterElement);
const draggable = document.querySelector(".dragging");
console.log(draggable);
if (afterElement == null) {
list.appendChild(draggable);
} else {
list.insertBefore(draggable, afterElement);
}
});
function getDragAfterElement(list, y) {
const draggableElements = [
...list.querySelectorAll(".draggable:not(.dragging)")
];
return draggableElements.reduce(
(closest, child) => {
const box = child.getBoundingClientRect();
const offset = y - box.top - box.height;
console.log(offset);
if (offset < 0 && offset > closest.offset) {
return { offset: offset, element: child };
} else {
return closest;
}
},
{ offset: Number.NEGATIVE_INFINITY }
).element;
}
};