{ Repost from my personal blog @ https://blog.codezero.xyz/building-interactive-elements-with-html-and-javascript-interact-js-drag-drop }
In a few of the past blog posts, we saw about implementing drag-drop andresizing with HTML and javascript. The functionality was pretty basic with a simple drag-and-drop and resizing. That is where, a javascript library called as interact.js comes in.
interact.js is a lightweight, standalone JavaScript module for handling single-pointer and multi-touch drags and gestures with powerful features including inertia and snapping.
With Interact.js, building interactive elements is like a eating a piece of your favorite cake – that easy !
Getting started with Interact.js
You have multiple option to include the library in your project.
- You can use bower to install (
bower install interact
) (or) - npm (
npm install interact.js
) (or) - You could directly include the library from a CDN (
https://cdnjs.cloudflare.com/ajax/libs/interact.js/1.2.6/interact.min.js
).
Implementing a simple draggable
Let’s start with some basic markup. We’ll be using the draggable
class to enable interact.js on this element.
<div id="box-one" class="draggable"> <p> I am the first Box </p> </div> <div id="box-two" class="draggable"> <p> I am the second Box </p> </div>
The first step in using interact.js is to create an interact
instance. Which you can create by using interact('<the selector>')
. Once the instance is created, you’ll have to call the draggable
method on it to enable drag. Draggable accepts a javascript object with some configuration options and some pretty useful callbacks.
// target elements with the "draggable" class interact('.draggable') .draggable({ // enable inertial throwing inertia: true, // keep the element within the area of it's parent restrict: { restriction: "parent", endOnly: true, elementRect: { top: 0, left: 0, bottom: 1, right: 1 } }, // enable autoScroll autoScroll: true, // call this function on every dragmove event onmove: dragMoveListener, }); function dragMoveListener (event) { var target = event.target, // keep the dragged position in the data-x/data-y attributes x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx, y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy; // translate the element target.style.webkitTransform = target.style.transform = 'translate(' + x + 'px, ' + y + 'px)'; // update the posiion attributes target.setAttribute('data-x', x); target.setAttribute('data-y', y); }
Here we use the onmove
event to move the box according to the dx
and dy
provided by interact when the element is dragged.
Implementing a simple drag-drop
Now to the above draggable, we’ll add a drop zone into which the two draggable boxes can be dropped.
<div id="dropzone" class="dropzone">You can drop the boxes here</div>
Similar to a draggable, we first create an interact instance. Then we call the dropzone
method on to tell interact that, that div is to be considered as a dropzone. The dropzone method accepts a json object with configuration options and callbacks.
// enable draggables to be dropped into this interact('.dropzone').dropzone({ // Require a 50% element overlap for a drop to be possible overlap: 0.50, // listen for drop related events: ondropactivate: function (event) { // add active dropzone feedback event.target.classList.add('drop-active'); }, ondragenter: function (event) { var draggableElement = event.relatedTarget, dropzoneElement = event.target; // feedback the possibility of a drop dropzoneElement.classList.add('drop-target'); }, ondragleave: function (event) { // remove the drop feedback style event.target.classList.remove('drop-target'); }, ondrop: function (event) { event.relatedTarget.textContent = 'Dropped'; }, ondropdeactivate: function (event) { // remove active dropzone feedback event.target.classList.remove('drop-active'); event.target.classList.remove('drop-target'); } });
Each event provides two important properties. relatedTarget
which gives us the DOM object of the draggable that is being dragged. And target
which gives us the DOM object of the dropzone. We can use this to provide visual feedback for the user when he/she is dragging.
Demo: