TIL-js

Drag & Drop

๐Ÿ“™ Tutorial : HTML Drag and Drop API

์˜ˆ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ


<!-- html ๋ฌธ์„œ -->

<section class="draggable-elements">
  <img
    src="love.png"
    draggable="true"
    class="draggable"
    id="love"
    data-color="#6CBDF4"
  />
  <img
    src="seoul.png"
    draggable="true"
    class="draggable"
    id="seoul"
    data-color="#2D2B50"
  />
  <img
    src="clock.png"
    draggable="true"
    class="draggable"
    id="clock"
    data-color="#DAF7A6"
  />
  <img
    src="rod.png"
    draggable="true"
    class="draggable"
    id="rod"
    data-color="#DED2C6"
  />
</section>

<section class="droppable-elements">
  <div class="droppable" data-draggable-id="love">
    <span>์‚ฌ๋ž‘ ์‚ฌ๋ž‘</span>
  </div>
  <div class="droppable" data-draggable-id="seoul">
    <span>์„œ์šธ ๊ฐ€ ์‚ด์ž</span>
  </div>
  <div class="droppable" data-draggable-id="clock">
    <span>์‹œ๊ณ„๋ฐ”๋Š˜</span>
  </div>
  <div class="droppable" data-draggable-id="rod"><span>ํšŒ์ดˆ๋ฆฌ</span></div>
</section>


const draggableElements = document.querySelectorAll(".draggable");
const droppableElements = document.querySelectorAll(".droppable");

draggableElements.forEach((draggable) => {
  draggable.addEventListener("dragstart", dragStart);
});

droppableElements.forEach((droppable) => {
  droppable.addEventListener("dragenter", dragEnter);
  droppable.addEventListener("dragover", dragOver);
  droppable.addEventListener("dragleave", dragLeave);
  droppable.addEventListener("drop", drop);
});


function dragStart(event) {
  event.dataTransfer.setData("text", event.target.id);
}


function dragEnter(event) {
  if (!event.target.classList.contains("dropped")) {
    event.target.classList.add("droppable-hover");
  }
}

function dragOver(event) {
  if (!event.target.classList.contains("dropped")) {
    event.preventDefault();
  }
}

function dragLeave(event) {
  if (!event.target.classList.contains("dropped")) {
    event.target.classList.remove("droppable-hover");
  }
}


function drop(event) {
  event.preventDefault();
  event.target.classList.remove("droppable-hover");

  const draggableElementData = event.dataTransfer.getData("text");
  const droppableElementData = event.target.getAttribute("data-draggable-id");

  if (draggableElementData === droppableElementData) {
    event.target.classList.add("dropped");

    const draggableElement = document.getElementById(draggableElementData);

    event.target.style.backgroundColor = draggableElement.dataset.color;

    draggableElement.classList.add("dragged");
    draggableElement.setAttribute("draggable", false);

    event.target.insertAdjacentHTML(
      "afterbegin",
      `<img src="${draggableElementData}.png"/>`
    );
  }
}