꾸준히 안타치기

Drag event 본문

Web/인터렉티브웹

Drag event

글자줍기 2021. 5. 2. 12:55
반응형

youtu.be/RkuoX9eeOEc

 

드래그를 하려면,

드래그를 시작하는 함수 ,드래그를 집어 들었을때 함수 , 놓았을때의 함수가 필요하다.

 
<!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>
    <link rel="stylesheet" href="drag.css">

</head>
<body>
    <ul class="list">
        <li class="item" draggable="true">A</li>
        <li class="item" draggable="true">P</li>
        <li class="item" draggable="true">P</li>
        <li class="item" draggable="true">L</li>
        <li class="item" draggable="true">E</li>
    </ul>

    <script>
        const list = document.querySelector(".list");
        // dragstart, dragover, drop을 만들것 

        // 잡아들었을때를 변수에 넣는다.
        let picked = null;
        // 인덱스값 
        let pickedIndex = null;

        list.addEventListener("dragstart",(e) =>{
            const obj = e.target;

            picked = obj
             // 인덱스값을 구하는것 .. 브라우저에서 parentNode의 children을 가져오고
             //indexOf에 넣어서 index값을 가져온다.
             // (배열에 배열이 들어간 상태이므로, ...을 이용해 속의 내용물만 가져온다.)
            pickedIndex = [...obj.parentNode.children].indexOf(obj)
        })

        list.addEventListener("dragover",(e)=>{
        // drop함수와 겹쳐서 발생하지 않도록 해줌
           e.preventDefault()
        })

        list.addEventListener("drop",(e)=>{
            // console.log(e)
            const obj = e.target;
            const index = [...obj.parentNode.children].indexOf(obj)
            // e.target.before(picked)

            // 인덱스가 내가잡은 것보다 뒤에 있으면 
            // 그렇지 않으면 앞에 둔다.
            if(index > pickedIndex){
                obj.after(picked);
            }else{
                obj.before(picked);
            }
            // 삼항연산자로 표현 // 조건 ? 참 : 거짓 
            // index > pickedIndex ?  obj.after(picked) : obj.before(picked);
        })
    </script>
</body>
</html> 

 

css

.list{
   margin:0;
   padding:0;
}

li{
    display: inline-block;
    width:60px;
    height:60px;
    padding: 10px;
    background-color: blue;
}

 

반응형

'Web > 인터렉티브웹' 카테고리의 다른 글

Node.JS  (0) 2021.08.16
유용한 10가지 배열 함수들. Array APIs  (0) 2021.05.18
그림판  (0) 2021.04.20
flexbox  (0) 2021.03.27
CSS 기초정리 / display  (0) 2021.03.27
Comments