21_Darg N Drop
π» μ£Όμ : μ΄λ―Έμ§λ₯Ό μ μ¬κ°ν λ°μ€μ λλκ·Έ μ€ λλ‘μ ν μ μμ.
μΉ νμ΄μ§ λ΄μ λͺ¨λ μμλ draggable μμ±μ μ¬μ©νμ¬ λλκ·Έλ μ μλ κ°μ²΄(draggable object)λ‘ λ³νλ μ μλ€.
dragstart
μ¬μ©μκ° κ°μ²΄(object)λ₯Ό λλκ·Ένλ €κ³ μμν λ λ°μν¨.
dragenter
λ§μ°μ€κ° λμ κ°μ²΄μ μλ‘ μ²μ μ§μ
ν λ λ°μν¨.
dragover
λλκ·Ένλ©΄μ λ§μ°μ€κ° λμ κ°μ²΄μ μμ μ리 μ‘κ³ μμ λ λ°μν¨.
drag
λμ κ°μ²΄λ₯Ό λλκ·Ένλ©΄μ λ§μ°μ€λ₯Ό μμ§μΌ λ λ°μν¨.
drop
λλκ·Έκ° λλμ λλκ·Ένλ κ°μ²΄λ₯Ό λλ μ₯μμ μμΉν κ°μ²΄μμ λ°μν¨.
dragleave
λλκ·Έκ° λλμ λ§μ°μ€κ° λμ κ°μ²΄μ μμμ λ²μ΄λ λ λ°μν¨.
dragend
λμ κ°μ²΄λ₯Ό λλκ·Ένλ€κ° λ§μ°μ€ λ²νΌμ λλ μκ° λ°μν¨.
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)
}