JavaScript でドラッグ&ドロップで要素を移動するときの備忘録

position: absolute; の要素をドラッグして移動するときはこんな感じで

HTML

<div class="container">
  <div class="draggable">
  </div>
</div>

CSS (position だけ重要)

.container {
  position: relative;
  width: 100%;
  height: 500px;
}
.draggable {
  position: absolute;
  width: 50px;
  height: 50px;
  top: 100px;
  left: 100px;
  background-color: gray;
  cursor: grab;
}

JavaScript

const setDraggable = (element) => {
  let cursor
  let zIndex

  const draggingHandler = (e) => {
    const shiftX = e.target.parentNode.getBoundingClientRect().left + e.clientX - e.target.getBoundingClientRect().left
    const shiftY = e.target.parentNode.getBoundingClientRect().top + e.clientY - e.target.getBoundingClientRect().top

    const setPosition = (x, y) => {
      e.target.style.left = x - shiftX + 'px'
      e.target.style.top = y - shiftY + 'px'
    }
    const moveBox = (e) => {
      setPosition(e.pageX, e.pageY)
    }
    const mouseUp = (e) => {
      element.style.cursor = cursor
      element.style.zIndex = zIndex

      document.removeEventListener('mousemove', moveBox)
      e.target.removeEventListener('mouseup', mouseUp)
    }

    cursor = element.style.cursor
    zIndex = element.style.zIndex
    element.style.cursor = 'grabbing'
    element.style.zIndex = 100000

    setPosition(e.pageX, e.pageY)
    document.addEventListener('mousemove', moveBox)
    e.target.addEventListener('mouseup', mouseUp)
  }

  element.addEventListener('mousedown', draggingHandler)
  element.addEventListener('dragstart', (e)=>e.preventDefault())
}

setDraggable(document.querySelector('.draggable'))



この記事が気に入ったらサポートをしてみませんか?