drag & drop

kirin.logΒ·2021λ…„ 4μ›” 15일
0
post-custom-banner

🐻 drag & drop κΈ°λŠ₯ κ΅¬ν˜„ν•˜κΈ°

λ“œλž˜κ·Έ μ•€ λ“œλ‘­(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)
}

profile
boma91@gmail.com
post-custom-banner

0개의 λŒ“κΈ€