본문 바로가기
JavaScript

[JavaScript] 드래그 앤 드랍으로 이미지 순서 변경하기

by teamnova 2024. 8. 8.
728x90

 

안녕하세요. 

오늘은 자바스크립트에서 드래그 앤 드랍으로 이미지의 순서를 변경해보겠습니다.

 

먼저 틀이 되는 html 코드를 이용해서 이미지를 3개 준비합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Drag and Drop Example</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="container">
        <div class="draggable" draggable="true">
            <img src="image1.jpg" alt="Image 1">
        </div>
        <div class="draggable" draggable="true">
            <img src="image2.jpg" alt="Image 2">
        </div>
        <div class="draggable" draggable="true">
            <img src="image3.jpg" alt="Image 3">
        </div>
    </div>
    <script src="script.js"></script>
</body>
</html>

 

이미지 크기 등을 조정하기 위해 styles.css 도 작성합니다.

 

body {
    font-family: Arial, sans-serif;
}

.container {
    display: flex;
    gap: 10px;
}

.draggable {
    width: 400px;  /* .draggable의 너비를 400픽셀로 설정 */
    height: 400px;  /* .draggable의 높이를 400픽셀로 설정 */
    border: 1px solid #ccc;
    display: flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;  /* border를 포함한 크기로 설정 */
}

.draggable img {
    width: 100%;  /* 이미지의 너비를 부모 요소의 100%로 설정 */
    height: 100%;  /* 이미지의 높이를 부모 요소의 100%로 설정 */
    object-fit: cover;  /* 이미지가 부모 요소에 맞게 잘리도록 설정 */
    box-sizing: border-box;  /* border를 포함한 크기로 설정 */
}

.drag-over {
    border: 2px dashed #000;
}

 

이제 드래그 앤 드랍으로 이미지 순서 변경이 가능하도록 script.js 를 작성해보겠습니다.

 

// 모든 드래그 가능한 요소들을 선택합니다.
const draggables = document.querySelectorAll('.draggable');

// 현재 드래그 중인 요소를 저장하기 위한 변수를 선언합니다.
let draggedItem = null;

// 드래그 시작 이벤트 핸들러를 정의합니다.
draggables.forEach(draggable => {
    draggable.addEventListener('dragstart', (e) => {
        draggedItem = draggable;
        setTimeout(() => {
            draggable.style.display = 'none';
        }, 0);
    });

    // 드래그 끝날 때의 이벤트 핸들러를 정의합니다.
    draggable.addEventListener('dragend', () => {
        setTimeout(() => {
            draggedItem.style.display = 'block';
            draggedItem = null;
        }, 0);
    });

    // 드래그 요소가 다른 요소 위로 올라왔을 때의 이벤트 핸들러를 정의합니다.
    draggable.addEventListener('dragover', (e) => {
        e.preventDefault();
    });

    // 드래그 요소가 다른 요소 안으로 들어갔을 때의 이벤트 핸들러를 정의합니다.
    draggable.addEventListener('dragenter', (e) => {
        e.preventDefault();
        draggable.classList.add('drag-over');
    });

    // 드래그 요소가 다른 요소를 떠날 때의 이벤트 핸들러를 정의합니다.
    draggable.addEventListener('dragleave', () => {
        draggable.classList.remove('drag-over');
    });

    // 드롭 이벤트 핸들러를 정의합니다.
    draggable.addEventListener('drop', () => {
        draggable.classList.remove('drag-over');
        if (draggedItem !== null) {
            // 드래그 중인 요소와 현재 드래그가 놓인 요소의 위치를 바꿉니다.
            const container = document.querySelector('.container');
            const allDraggables = Array.from(container.querySelectorAll('.draggable'));
            const currentPos = allDraggables.indexOf(draggable);
            const draggedPos = allDraggables.indexOf(draggedItem);

            if (currentPos < draggedPos) {
                container.insertBefore(draggedItem, draggable);
            } else {
                container.insertBefore(draggedItem, draggable.nextSibling);
            }
        }
    });
});

 

 

이렇게 하면 다음 영상처럼 드래그 앤 드랍을 통해 이미지의 순서가 변경되는 것을 확인할 수 있습니다.