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
9
+ − 102 <p>This supports drag but not drop. When I try to implement drop in a list, it gets confused when the DOM changes. The library is in <a href="https://unpkg.com/draggabilly@3.0.0/dist/draggabilly.pkgd.js">draggabilly.pkgd.js</a>.</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>