1
|
1 <!doctype html>
|
|
2 <html>
|
|
3 <head>
|
|
4 <meta name="viewport" content="width=device-width, initial-scale=1">
|
|
5 <style>
|
|
6 @import "/site.css";
|
|
7
|
|
8 div[drag] {
|
|
9 border: 1px solid;
|
|
10 margin: 8px;
|
|
11 padding: 8px;
|
|
12 background-color: LightGreen;
|
2
|
13 cursor: move;
|
|
14 }
|
|
15 div[drag].is-dragging {
|
|
16 z-index: 1;
|
1
|
17 }
|
|
18 </style>
|
2
|
19 <script src="https://unpkg.com/draggabilly@3.0.0/dist/draggabilly.pkgd.js"></script>
|
1
|
20 <script>
|
|
21 'use strict';
|
|
22
|
2
|
23 let dragEntered;
|
1
|
24
|
2
|
25 function onDragStart( event, pointer ) {
|
|
26 dragEntered = null;
|
1
|
27 }
|
|
28
|
|
29 function indexOf(a,el) {
|
|
30 for( let i=0; i<a.length; i++ ) {
|
|
31 if( a[i] === el )
|
|
32 return i;
|
|
33 }
|
|
34 return -1;
|
|
35 }
|
|
36
|
2
|
37 function onDragEnter(dragging,entered) {
|
1
|
38 let divs = document.querySelectorAll('div[drag]');
|
|
39 let iEntered = indexOf(divs,entered);
|
|
40 let iDragging = indexOf(divs,dragging);
|
|
41 console.log(iDragging+' '+iEntered);
|
|
42 let parent = entered.parentNode;
|
|
43 if( iDragging < iEntered ) {
|
|
44 let next = divs[iEntered+1];
|
|
45 if( next ) {
|
|
46 parent.insertBefore( dragging, next );
|
|
47 } else {
|
|
48 parent.appendChild( dragging );
|
|
49 }
|
|
50 } else {
|
|
51 parent.insertBefore( dragging, entered );
|
|
52 }
|
|
53 }
|
|
54
|
2
|
55 function onDragMove( event, pointer, moveVector ) {
|
|
56 let target = pointer.target;
|
|
57 let x = pointer.clientX;
|
|
58 let y = pointer.clientY;
|
|
59 let divs = document.querySelectorAll('div[drag]');
|
|
60 for( let i=0; i<divs.length; i++ ) {
|
|
61 let div = divs[i];
|
|
62 if( div === target )
|
|
63 continue;
|
|
64 let rect = div.getBoundingClientRect();
|
|
65 if( rect.x <= x && x <= rect.x+rect.width && rect.y <= y && y <= rect.y+rect.height ) {
|
|
66 if( div !== dragEntered ) {
|
|
67 dragEntered = div;
|
|
68 onDragEnter(target,div);
|
|
69 }
|
|
70 break;
|
|
71 }
|
|
72 }
|
|
73 }
|
|
74
|
|
75 function onDragEnd( event, pointer ) {
|
|
76 //console.log('onDragEnd');
|
|
77 //console.log(event);
|
|
78 //console.log(pointer);
|
|
79 let target = pointer.target;
|
|
80 //target.style.left = null;
|
|
81 //target.style.top = null;
|
|
82 target.draggie.setPosition(0,0);
|
|
83 //console.log(target.draggie.position);
|
|
84 }
|
|
85
|
1
|
86 function init() {
|
2
|
87 let divs = document.querySelectorAll('div[drag]');
|
|
88 for( let i=0; i<divs.length; i++ ) {
|
|
89 let div = divs[i];
|
|
90 let draggie = new Draggabilly(div,{});
|
|
91 draggie.on( 'dragStart', onDragStart );
|
|
92 draggie.on( 'dragMove', onDragMove );
|
|
93 draggie.on( 'dragEnd', onDragEnd );
|
|
94 div.draggie = draggie;
|
|
95 }
|
1
|
96 }
|
|
97 </script>
|
|
98 </head>
|
|
99 <body>
|
2
|
100 <h1><a href="https://draggabilly.desandro.com/">Draggabilly</a></h1>
|
1
|
101
|
2
|
102 <p>This supports drag but not drop. When I try to implement drop in a list, it gets confused when the DOM changes.</p>
|
1
|
103
|
|
104 <div>
|
|
105 <script>
|
|
106 for( let i=1; i<=10; i++ ) {
|
|
107 document.write(`
|
|
108 <div drag id="${i}">${i} - drag me</div>
|
|
109 ` );
|
|
110 }
|
|
111 </script>
|
|
112 </div>
|
|
113 </body>
|
|
114 <script> init(); </script>
|
|
115 </html>
|