Mercurial Hosting > dad
comparison src/alternatives/draggabilly.html @ 2:264646feb67b
add draggabilly
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Thu, 20 Apr 2023 15:55:43 -0600 |
| parents | src/alternatives/interactjs.html@9c372fce698a |
| children | eee8862be4c7 |
comparison
equal
deleted
inserted
replaced
| 1:9c372fce698a | 2:264646feb67b |
|---|---|
| 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; | |
| 13 cursor: move; | |
| 14 } | |
| 15 div[drag].is-dragging { | |
| 16 z-index: 1; | |
| 17 } | |
| 18 </style> | |
| 19 <script src="https://unpkg.com/draggabilly@3.0.0/dist/draggabilly.pkgd.js"></script> | |
| 20 <script> | |
| 21 'use strict'; | |
| 22 | |
| 23 let dragEntered; | |
| 24 | |
| 25 function onDragStart( event, pointer ) { | |
| 26 dragEntered = null; | |
| 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 | |
| 37 function onDragEnter(dragging,entered) { | |
| 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 | |
| 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 | |
| 86 function init() { | |
| 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 } | |
| 96 } | |
| 97 </script> | |
| 98 </head> | |
| 99 <body> | |
| 100 <h1><a href="https://draggabilly.desandro.com/">Draggabilly</a></h1> | |
| 101 | |
| 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> | |
| 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> |
