Mercurial Hosting > dad
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alternatives/draggabilly.html Thu Apr 20 15:55:43 2023 -0600 @@ -0,0 +1,115 @@ +<!doctype html> +<html> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <style> + @import "/site.css"; + + div[drag] { + border: 1px solid; + margin: 8px; + padding: 8px; + background-color: LightGreen; + cursor: move; + } + div[drag].is-dragging { + z-index: 1; + } + </style> + <script src="https://unpkg.com/draggabilly@3.0.0/dist/draggabilly.pkgd.js"></script> + <script> + 'use strict'; + + let dragEntered; + + function onDragStart( event, pointer ) { + dragEntered = null; + } + + function indexOf(a,el) { + for( let i=0; i<a.length; i++ ) { + if( a[i] === el ) + return i; + } + return -1; + } + + function onDragEnter(dragging,entered) { + let divs = document.querySelectorAll('div[drag]'); + let iEntered = indexOf(divs,entered); + let iDragging = indexOf(divs,dragging); + console.log(iDragging+' '+iEntered); + let parent = entered.parentNode; + if( iDragging < iEntered ) { + let next = divs[iEntered+1]; + if( next ) { + parent.insertBefore( dragging, next ); + } else { + parent.appendChild( dragging ); + } + } else { + parent.insertBefore( dragging, entered ); + } + } + + function onDragMove( event, pointer, moveVector ) { + let target = pointer.target; + let x = pointer.clientX; + let y = pointer.clientY; + let divs = document.querySelectorAll('div[drag]'); + for( let i=0; i<divs.length; i++ ) { + let div = divs[i]; + if( div === target ) + continue; + let rect = div.getBoundingClientRect(); + if( rect.x <= x && x <= rect.x+rect.width && rect.y <= y && y <= rect.y+rect.height ) { + if( div !== dragEntered ) { + dragEntered = div; + onDragEnter(target,div); + } + break; + } + } + } + + function onDragEnd( event, pointer ) { + //console.log('onDragEnd'); + //console.log(event); + //console.log(pointer); + let target = pointer.target; + //target.style.left = null; + //target.style.top = null; + target.draggie.setPosition(0,0); + //console.log(target.draggie.position); + } + + function init() { + let divs = document.querySelectorAll('div[drag]'); + for( let i=0; i<divs.length; i++ ) { + let div = divs[i]; + let draggie = new Draggabilly(div,{}); + draggie.on( 'dragStart', onDragStart ); + draggie.on( 'dragMove', onDragMove ); + draggie.on( 'dragEnd', onDragEnd ); + div.draggie = draggie; + } + } + </script> + </head> + <body> + <h1><a href="https://draggabilly.desandro.com/">Draggabilly</a></h1> + + <p>This supports drag but not drop. When I try to implement drop in a list, it gets confused when the DOM changes.</p> + + <div> + <script> + for( let i=1; i<=10; i++ ) { + document.write(` + <div drag id="${i}">${i} - drag me</div> +` ); + } + </script> + </div> + </body> + <script> init(); </script> +</html>