[miniProjects] 21_Darg N Drop

보리·2023λ…„ 6μ›” 16일
0

miniProjects

λͺ©λ‘ 보기
22/47

21_Darg N Drop

πŸ’» 주제 : 이미지λ₯Ό μ •μ‚¬κ°ν˜• λ°•μŠ€μ— λ“œλž˜κ·Έ μ•€ λ“œλ‘­μ„ ν•  수 있음.

  • draggable: true둜 μ„€μ •ν•΄ λ“œλž˜κ·Έκ°€ κ°€λŠ₯ν•˜λ„λ‘ 함.

πŸ’‘ draggable 속성

μ›Ή νŽ˜μ΄μ§€ λ‚΄μ˜ λͺ¨λ“  μš”μ†ŒλŠ” draggable 속성을 μ‚¬μš©ν•˜μ—¬ λ“œλž˜κ·Έλ  수 μžˆλŠ” 객체(draggable object)둜 λ³€ν™˜λ  수 μžˆλ‹€.

  • dragOver, dragEnter, dragLeave, dragDrop ν•¨μˆ˜λ₯Ό 생성.

πŸ’‘ event

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)
}
profile
μ •μ‹ μ°¨λ € 이 κ°λ°•ν•œ μ„Έμƒμ†μ—μ„œ

0개의 λŒ“κΈ€