본문 바로가기

프론트엔드/자바스크립트

드래그 앤 드랍

반응형

자바스크립트를 사용해서 드레그 앤 드랍 효과를 구현 해 보겠습니다.

구성하기

드래그하고자 하는 요소에 draggable="true" 속성을 추가합니다.

<!-- index.html -->

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <script src="https://kit.fontawesome.com/833be080c6.js" crossorigin="anonymous"></script>
  <link rel="stylesheet" href="./main.css">
  <script defer src="./index.js"></script>
</head>

<body>
  <div class="img-box">
    <img draggable="true" id="img" src="https://source.unsplash.com/random" alt="" height="100%" width="100%">
  </div>
  <div class="img-box"></div>
  <div class="img-box"></div>
  <div class="img-box"></div>
  <div class="img-box"></div>
</body>

</html>

스타일을 통해 크기과 너비 등을 지정합니다.

 

 

/* main.css */

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
}

.img-box {
  height: 200px;
  width: 200px;
  border: solid 3px #000;
  border-radius: 50%;
}

img {
  object-fit: cover;
  object-position: center;
  border-radius: 50%;
}

 

구현하기

드레그 앤 드랍 효과는 드레그와 관련된 이벤트를 활용하여 구현하는데, 사용가능한 이벤트는 아래와 같습니다.

'dragstart'
'dragover'
'dragenter'
'dragleave'
'drop'

완성된 코드는 아래와 같은 데, 주의할 점은 기본적으로 각 요소는 다른 요소를 받아들이지 않기 때문에 'dragover' event에 e.preventDefault()를 사용하여 이를 억제해 주어야 한다는 것입니다.

// index.js

const boxes = document.querySelectorAll('.img-box')

boxes.forEach(box => {  
  box.addEventListener('dragstart', (e) => {
    e.dataTransfer.setData('img', e.target.id)
    reset()
  })

  box.addEventListener('dragover', (e) => {
    e.preventDefault()
    box.style.borderStyle = 'dotted';
  })

  box.addEventListener('dragenter', (e) => {

  })

  box.addEventListener('dragleave', (e) => {
    box.style.borderStyle = 'solid';
  })

  box.addEventListener('drop', (e) => {
    var data = e.dataTransfer.getData('img')
    e.target.appendChild(document.getElementById(data))
    box.style.borderStyle = 'solid';
  })
});

function reset() {
  setTimeout(() => {
    boxes.forEach(box => {
      box.style.borderStyle = 'solid';
    });
  }, 1000)
}

참고

 

HTML Drag and Drop API

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

HTML Drag and Drop API - Web APIs | MDN

HTML Drag and Drop interfaces enable applications to use drag-and-drop features in browsers.

developer.mozilla.org

 

728x90
반응형