comparison src/alternatives/interactjs.html @ 1:9c372fce698a

start alternatives
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 19 Apr 2023 23:04:23 -0600
parents
children 6d5e4b38b4fb
comparison
equal deleted inserted replaced
0:e863dbc62217 1:9c372fce698a
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 touch-action: none;
13 background-color: LightGreen;
14 }
15 </style>
16 <script src="https://cdn.jsdelivr.net/npm/interactjs/dist/interact.js"></script>
17 <script>
18 'use strict';
19
20 let dxDrag, dyDrag;
21
22 function dragStartListener(event) {
23 dxDrag = 0;
24 dyDrag = 0;
25 }
26
27 function dragMoveListener(event) {
28 dxDrag += event.dx;
29 dyDrag += event.dy;
30 event.target.style.transform = `translate(${dxDrag}px, ${dyDrag}px)`;
31 }
32
33 function dragEndListener(event) {
34 event.target.style.transform = null;
35 }
36
37 function indexOf(a,el) {
38 for( let i=0; i<a.length; i++ ) {
39 if( a[i] === el )
40 return i;
41 }
42 return -1;
43 }
44
45 function dragEnterListener(event) {
46 console.log(event);
47 let entered = event.target;
48 let dragging = event.relatedTarget;
49 if( entered === dragging )
50 return;
51 let divs = document.querySelectorAll('div[drag]');
52 let iEntered = indexOf(divs,entered);
53 let iDragging = indexOf(divs,dragging);
54 console.log(iDragging+' '+iEntered);
55 let parent = entered.parentNode;
56 if( iDragging < iEntered ) {
57 let next = divs[iEntered+1];
58 if( next ) {
59 parent.insertBefore( dragging, next );
60 } else {
61 parent.appendChild( dragging );
62 }
63 } else {
64 parent.insertBefore( dragging, entered );
65 }
66 }
67
68 function init() {
69 let dad = interact('div[drag]');
70 dad.draggable({
71 listeners: {
72 start: dragStartListener,
73 move: dragMoveListener,
74 end: dragEndListener,
75 }
76 });
77 dad.dropzone({
78 ondragenter: dragEnterListener,
79 });
80 }
81 </script>
82 </head>
83 <body>
84 <h1><a href="https://interactjs.io/">interact.js</a></h1>
85
86 <p>This has a number of problems. First, it is clearly too complicated. And this means that it isn't on just one JavaScript file. One has to use the modern horror of <b>npm</b> to get it (which I refuse to do). The suggested way of handling dragging doesn't work when the DOM changes, as the example below shows. There is probably some complicated way around this, but I can't be bothered given the other issues.</p>
87
88 <div>
89 <script>
90 for( let i=1; i<=10; i++ ) {
91 document.write(`
92 <div drag id="${i}">${i} - drag me</div>
93 ` );
94 }
95 </script>
96 </div>
97 </body>
98 <script> init(); </script>
99 </html>