JS - 이미지를 드래그하여 원하는 위치로 이동하기

반응형

 

이미지 준비

  • 이미지를 테스트하기 위한 파일 및 위치 (http://localhost:3000/img/img.jpg)
  • 위치는 개인에 맞게 설정


기본 구성

  • html 파일 생성 후 이미지 태그로 이미지 출력
    • img id : 자바스크립트로 해당 요소 선택을 위함
    • style : 절대적 X, Y값을 확인하기 위함 + 커서는 손가락 모양으로 변경
    • draggable : 드래그로 이미지가 파란색 영역으로 선택되지 않기 위함 (전체선택하면 나오는 영역)
<!DOCTYPE html>
<html lang="ko">
<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>
</head>    
    <body>
    	<!-- 이미지 보여주기 -->
        <img src="http://localhost:3000/img/img.jpg"
            id="imgObj"
            style="position:absolute; left:0px; top:0px; cursor:pointer;"
            draggable="true">
    </body>
</html>

마우스 드래그 이벤트 코드

인터넷 검색으로 많은 코드들을 찾았는데 너무 복잡하게 되어있거나,

너무 오래된 레거시 문법들이 많아서 가능한 지식선에서... 최대한 쉽게 정리해보았다.

<script>
    window.onload = function() {
        const imgObj = document.getElementById("imgObj");
        let startX=0, startY=0, offsetX=0, offsetY=0;

        imgObj.addEventListener("mousedown", function(e){
            // 드래그시 마우스 클릭 동작 방지
            e.preventDefault();

            // 마우스 현재 좌표
            startX = e.clientX;
            startY = e.clientY;

            // 이동중인 마우스의 좌표값 업데이트
            offsetX = parseInt(imgObj.style.left) - startX;
            offsetY = parseInt(imgObj.style.top) - startY;

            // 이동중이거나 마우스 드래그 상태가 아닐때의 이벤트
            document.addEventListener("mousemove", startMove);
            document.addEventListener("mouseup", stopMove);
        });

        function startMove(e) {
            // 이미지 드래그시 마우스 위치의 좌표로 이동
            imgObj.style.left = e.clientX + offsetX + 'px';
            imgObj.style.top = e.clientY + offsetY + 'px';
        }

        function stopMove() {
            // 드래그 상태가 아니면 모든 이벤트 제거
            document.removeEventListener("mousemove", startMove);
            document.removeEventListener("mouseup", stopMove);
        }
    }
</script>

실행


전체 소스 코드

<!-- js image drag move test.html -->
<!DOCTYPE html>
<html lang="ko">
<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>
</head>    
    <script>
        window.onload = function() {
            const imgObj = document.getElementById("imgObj");
            let startX=0, startY=0, offsetX=0, offsetY=0;

            imgObj.addEventListener("mousedown", function(e){
                // 드래그시 마우스 클릭 동작 방지
                e.preventDefault();

                // 마우스 현재 좌표
                startX = e.clientX;
                startY = e.clientY;

                // 이동중인 마우스의 좌표값 업데이트
                offsetX = parseInt(imgObj.style.left) - startX;
                offsetY = parseInt(imgObj.style.top) - startY;

                // 이동중이거나 마우스 드래그 상태가 아닐때의 이벤트
                document.addEventListener("mousemove", startMove);
                document.addEventListener("mouseup", stopMove);
            });

            function startMove(e) {
                // 이미지 드래그시 마우스 위치의 좌표로 이동
                imgObj.style.left = e.clientX + offsetX + 'px';
                imgObj.style.top = e.clientY + offsetY + 'px';
            }

            function stopMove() {
                // 드래그 상태가 아니면 모든 이벤트 제거
                document.removeEventListener("mousemove", startMove);
                document.removeEventListener("mouseup", stopMove);
            }
        }
    </script>
    <body>
        <img src="http://localhost:3000/img/img.jpg"
            id="imgObj"
            style="position:absolute; left:0px; top:0px; cursor:pointer;"
            draggable="true">
    </body>
</html>

참고

반응형