λλκ·Έ μ€ λλ‘(drag and drop) APIλ μΉ νμ΄μ§ λ΄μ μμλ₯Ό μ¬μ©μκ° μμ λ‘κ² λλκ·Έν μ μλλ‘ μ€μ ν΄μ€λ€.
1) html λ΄ draggable = "true"
μμ± μΆκ°νκΈ°
π‘ draggable μμ±
μΉ νμ΄μ§ λ΄μ λͺ¨λ μμλ draggable μμ±μ μ¬μ©νμ¬ λλκ·Έλ μ μλ κ°μ²΄(draggable object)λ‘ λ³νλ μ μλ€
2) js λ΄ addEventListener
μ΄λ²€νΈ μ£ΌκΈ°
π‘ event
dragstart
μ¬μ©μκ° κ°μ²΄(object)λ₯Ό λλκ·Ένλ €κ³ μμν λ λ°μν¨.
dragenter
λ§μ°μ€κ° λμ κ°μ²΄μ μλ‘ μ²μ μ§μ ν λ λ°μν¨.
dragover
λλκ·Ένλ©΄μ λ§μ°μ€κ° λμ κ°μ²΄μ μμ μ리 μ‘κ³ μμ λ λ°μν¨.
drag
λμ κ°μ²΄λ₯Ό λλκ·Ένλ©΄μ λ§μ°μ€λ₯Ό μμ§μΌ λ λ°μν¨.
drop
λλκ·Έκ° λλμ λλκ·Ένλ κ°μ²΄λ₯Ό λλ μ₯μμ μμΉν κ°μ²΄μμ λ°μν¨.
dragleave
λλκ·Έκ° λλμ λ§μ°μ€κ° λμ κ°μ²΄μ μμμ λ²μ΄λ λ λ°μν¨.
dragend
λμ κ°μ²΄λ₯Ό λλκ·Ένλ€κ° λ§μ°μ€ λ²νΌμ λλ μκ° λ°μν¨.
π£ codeμμ
π html <body> <!--첫λ²μ§Έ κ°μ²΄ (μ΄λ―Έμ§κ° λ΄κ²¨μλ κ°μ²΄)--> <div class="empty"> <div class="fill" draggable="true"></div> </div> <!--2,3,4,5λ²μ§Έ κ°μ²΄ (μ΄λ―Έμ§κ° λΉ κ°μ²΄)--> <div class="empty"></div> <div class="empty"></div> <div class="empty"></div> <div class="empty"></div> </body>
π css /* μ 체 κ°μ²΄ κΈ°λ³Έ ν */ .empty { height: 150px; width: 150px; margin: 10px; border: solid 3px black; background: white; } /* μ΄λ―Έμ§λ‘ μ±μμ§λ κ°μ²΄ */ .fill { height: 145px; width: 145px; background-image: url('https://source.unsplash.com/random/150x150'); cursor: pointer; } /* jsλ‘ μμ± μΆκ° */ /* λ§μ°μ€λ‘ μ΄λ―Έμ§ κ°μ²΄λ₯Ό ν΄λ¦νκ³ μλ λμ borderκ° μ μ§λ¨ */ .hold { border: solid 5px #ccc; } /* λλκ·Έν μ΄λ―Έμ§κ° hoverdλ κ°μ²΄μ hoverλ λ */ .hovered { background-color: #333; border-color: white; border-style: dashed; }
π js const fill = document.querySelector('.fill') const empties = document.querySelectorAll('.empty') //arr // μ΄λ―Έμ§κ° μ±μμ§ κ°μ²΄μ μ μ©νλ μ΄λ²€νΈ(dragλ₯Ό start(λ§μ°μ€λ‘ μ§κ³ ), end(λ§μ°μ€λ‘ λκ³ ) νλ€) fill.addEventListener('dragstart', dragStart) fill.addEventListener('dragend', dragEnd) // λΉ κ°μ²΄λ€μ μ μ©νλ μ΄λ²€νΈ for (const empty of empties) { empty.addEventListener('dragover', dragOver) // λ§μ°μ€ κ°μ²΄ μμ μ리μ‘κ³ μμ λ empty.addEventListener('dragenter', dragEnter) // λ§μ°μ€κ° κ°μ²΄ μλ‘ μ²μ μ§μ ν λ empty.addEventListener('dragleave', dragLeave) // λλκ·Έκ° λλμ λ§μ°μ€κ° κ°μ²΄ μμμ λ²μ΄λ λ empty.addEventListener('drop', dragDrop) // λλκ·Ένλ κ°μ²΄λ₯Ό λλ μ₯μμ μμΉν κ°μ²΄μμ λ°μ(λλκ·Έ λλ λ) } // μ΄λ―Έμ§ κ°μ²΄λ₯Ό λ§μ°μ€λ‘ λ€μ΄μ¬λ¦΄ λ μ μ©(.holdμ invisible μ μ©) function dragStart() { this.className += ' hold' setTimeout(() => this.className = 'invisible', 0) } // μ΄λ―Έμ§ κ°μ²΄λ₯Ό νΉμ κ°μ²΄μ λ΄λ €λμ λ μ μ©(μ΄λ―Έμ§κ° λμΌ κ°μ²΄λ fill λλ€) function dragEnd() { this.className = 'fill' } // λ§μ°μ€κ° λμ κ°μ²΄μ μμ μ리 μ‘κ³ μμ λ μ무 μ΄λ²€νΈλ λ°μνμ§ μλλ‘ function dragOver(e) { e.preventDefault() } // λ§μ°μ€κ° λμ κ°μ²΄μ μλ‘ μ²μ μ§μ ν λ hoverd λ°μ function dragEnter(e) { e.preventDefault() this.className += ' hovered' } // μλ μ΄λ―Έμ§κ° μλ κ°μ²΄μμ λ§μ°μ€κ° λμ κ°μ²΄μ μμμ λ²μ΄λ λ emptyκ° μ μ© function dragLeave() { this.className = 'empty' } // μ΄λ―Έμ§λ₯Ό μλ‘ λμΌλ €λ κ°μ²΄μ λλ μ₯μμ μμΉν κ°μ²΄μμ λ°μν¨(empty β‘ fill) function dragDrop() { this.className = 'empty' this.append(fill) }