Skip to content Skip to sidebar Skip to footer

Vanilla Javascript Draggable Div Within Parent

I want to achieve a draggable element in vanilla javascript. I want to make a small circular div draggable within a square div. To make myself a bit more clear, I do NOT want to:

Solution 1:

You may use getBoundingClientRect that gives DOMRect object(an invincible rectangle that encompass the object) with eight properties: left, top, right, bottom, x, y, width, height.

var parent = document.querySelector('.parent');
var parentRect = parent.getBoundingClientRect();

var draggable = document.querySelector('.draggable');
var draggableRect = draggable.getBoundingClientRect();

You can get the mouse (X,Y) coordinates anytime by using e.clientX and e.clientY, so just check if they are outside the bounding rectable of .parent div if so then only update the draggable div's left and top properties

if( (e.clientX >= parentRect.left && (e.clientX+draggableRect.width <= parentRect.right)) &&
    (e.clientY >= parentRect.top && (e.clientY+draggableRect.height <= parentRect.bottom)) 
    //+draggableRect.height and +draggableRect.height accounts for the size of ball itself
){
            draggable.style.left = `${e.clientX}px`;
            draggable.style.top = `${e.clientY}px`;
}

Note that numbers increase down and towards right in graphics world

enter image description herehttps://codepen.io/vsk/pen/PozVryr

UPDATE: To fix the issue mentioned in comment use this

if(/* mouse was moved withing red container's bounds*/)
  else{
    //if mouse went out of bounds in Horizontal directionif(e.clientX+draggableRect.width >= parentRect.right){
       draggable.style.left = `${parentRect.right-draggableRect.width}px`;
    }
    //if mouse went out of bounds in Vertical directionif(e.clientY+draggableRect.height >= parentRect.bottom){
       draggable.style.top = `${parentRect.bottom-draggableRect.height}px`;
    }
  }

And assign mousemove to document insted of the div container

Solution 2:

I hope you could provide a code snippet to try to simulate what you want, a codepen url, codesandbox or similar.

I made this sample using what you provided : )

let x = event.clientX - element.offsetLeftconst elementWidth = element.clientWidthconst fullX = x + elementWidth
const containerW = yourContainer.clientWidthif(fullX > containerW){
  //If element will be out of container
  x = containerW - elementWidth // So it will be never out of container
}
element.style.transform = "translate("+x+"px, "+y+"px)"

Post a Comment for "Vanilla Javascript Draggable Div Within Parent"