๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

javascript

250313 to-do ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ (2)

 

https://hydeveloper.tistory.com/170 ์—์„œ ์•„์ง ํ•˜์ง€ ๋ชปํ•œ ์‹ฌํ™” ๊ณผ์ œ (3) : ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์š”์†Œ์˜ ์œ„์น˜ ๋ฐ”๊พธ๊ธฐ (์ •๋ ฌํ•˜๊ธฐ) ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

 

์ด์— ์•ž์„œ draggable ์†์„ฑ๊ณผ drag ์ด๋ฒคํŠธ๋ฅผ ์•Œ์•„๋‘ฌ์•ผ ํ•œ๋‹ค.

 

draggable ์†์„ฑ

 

draggable = "true"๋ฅผ ๋ถ€์—ฌํ•˜๋ฉด ์–ด๋–ค ์š”์†Œ๋“  ๋“œ๋ž˜๊ทธ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

draggable ์†์„ฑ์ด ์—†์„ ๋•Œ / draggable = "true"๊ฐ€ ์žˆ์„ ๋•Œ

 

 

drag ์ด๋ฒคํŠธ

 

(mdn : https://developer.mozilla.org/ko/docs/Web/API/HTMLElement/drag_event)

 

drag ๋“œ๋ž˜๊ทธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋Œ€์ƒ์—์„œ ๋ฐœ์ƒ
dragstart ๋“œ๋ž˜๊ทธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒ
dragend ๋“œ๋ž˜๊ทธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋ฐœ์ƒ
dragover ๋“œ๋ž˜๊ทธํ•˜๋ฉด์„œ ๋งˆ์šฐ์Šค๊ฐ€ ๋Œ€์ƒ ๊ฐ์ฒด ์œ„์— ์žˆ์„ ๋•Œ ๋ฐœ์ƒ
dragenter ๋“œ๋ž˜๊ทธํ•˜๋ฉด์„œ ๋งˆ์šฐ์Šค๊ฐ€ ๋Œ€์ƒ ๊ฐ์ฒด ์œ„๋กœ ์ฒ˜์Œ ์ง„์ž…ํ•  ๋•Œ ๋ฐœ์ƒ (1ํšŒ)
dragleave ๋“œ๋ž˜๊ทธํ•˜๋ฉด์„œ ๋งˆ์šฐ์Šค๊ฐ€ ๋Œ€์ƒ ๊ฐ์ฒด ์œ„์—์„œ ๋ฒ—์–ด๋‚  ๋•Œ ๋ฐœ์ƒ
drop ๋“œ๋ž˜๊ทธํ•œ ์š”์†Œ๊ฐ€ ๋Œ€์ƒ ๊ฐ์ฒด ์œ„์— ๋†“์—ฌ์žˆ์„ ๋•Œ ๋ฐœ์ƒ

 

 

์ž์„ธํ•œ ์‹ค์Šต ์˜ˆ์ œ๋Š” ์•„๋ž˜ ์‚ฌ์ดํŠธ๋“ค์„ ์ถ”์ฒœํ•œ๋‹ค. 

https://ko.javascript.info/mouse-drag-and-drop 

https://inpa.tistory.com/entry/%EB%93%9C%EB%9E%98%EA%B7%B8-%EC%95%A4-%EB%93%9C%EB%A1%AD-Drag-Drop-%EA%B8%B0%EB%8A%A5

 

 

 

๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ค€๋น„

 

 

์šฐ์„  li์—๊ฒŒ draggable = true ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. (๊ทธ๋ž˜์•ผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์ด ๊ฐ€๋Šฅํ•จ)

  li.setAttribute("draggable", true);
  // ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ ์ „์— ์ถ”๊ฐ€ํ•˜๊ธฐ
  todoList.append(li);

 

 

๊ทธ๋ฆฌ๊ณ  ํ•ญ๋ชฉ์„ ๋“œ๋ž˜๊ทธํ•˜๋Š” ๋А๋‚Œ์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์Šคํƒ€์ผ์„ ์กฐ๊ธˆ ๋” ์ถ”๊ฐ€ํ–ˆ๋‹ค.

#todo-list li {
  cursor: pointer;
  padding: 10px;
  display: flex;
  align-items: center;
  border-bottom: 1px solid #ddd;
  /* ์ถ”๊ฐ€ */
  border-radius: 10px;
  background-color: #fff;
}

 

 

css ์ ์šฉ ์ „ / ํ›„

 

 

 

 

๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ

 

 

๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

1) ํ˜„์žฌ ๋“œ๋ž˜๊ทธํ•˜๊ณ  ์žˆ๋Š” ์š”์†Œ์˜ ์ธ๋ฑ์Šค,

2) ํ˜„์žฌ ๋“œ๋ž˜๊ทธ๊ฐ€ over๋œ ์œ„์น˜(๊ทธ๋ž˜์•ผ ๊ทธ ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ)

๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

 

* ์ธ๋ฑ์Šค ๊ตฌํ•˜๊ธฐ

 

์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” Array.prototype.indexOf()์œผ๋กœ ๊ตฌํ•˜๋Š”๋ฐ, ์ด๋•Œ prototype ๋ถ€๋ถ„์€ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๊ฐ์ฒด์—์„œ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•˜๊ณ ์ž ํ•  ๋•Œ์˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

Array.from์€ ์ˆœํšŒ ๊ฐ€๋Šฅ ๋˜๋Š” ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์—์„œ ์–•๊ฒŒ ๋ณต์‚ฌ๋œ ์ƒˆ๋กœ์šด Array ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ฆ‰ element์˜ ๋ถ€๋ชจ์š”์†Œ์˜ ์ž์‹๋“ค์„ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , ์ด ์ค‘ element์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

const index = Array.from(element.parentNode.children).indexOf(element)

 

์ด๋ฅผ ์ด์šฉํ•ด ๋“œ๋ž˜๊ทธ๋œ ์š”์†Œ, ๋“œ๋กญ๋  ์š”์†Œ(์˜ ์œ„์น˜)๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

1) ๋“œ๋ž˜๊ทธ ์‹œ์ž‘

 

// liDrag : ํ˜„์žฌ ๋“œ๋ž˜๊ทธ ํ•˜๊ณ  ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜
let liDrag;
let dragIndex;

// ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ
li.addEventListener("dragstart", function(e) {
	// ํƒ€๊ฒŸ์˜ ํƒœ๊ทธ๊ฐ€ li๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด
    if (e.target.tagName.toLowerCase() !== 'li') {
      liDrag = e.currentTarget; // ์ƒ์œ„ <li> ์š”์†Œ๋กœ ์„ ํƒ
    } else {
      liDrag = e.target;
    }
    // # ๋ฐฉ๋ฒ• 1
    dragIndex = Array.from(liDrag.parentNode.children).indexOf(liDrag);

    // # ๋ฐฉ๋ฒ• 2
    // ํŽผ์นจ์—ฐ์‚ฐ์ž ... : ๋ฐฐ์—ด์— ํฌํ•จ๋œ ํ•ญ๋ชฉ๋“ค์„ ๋ชฉ๋ก์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
    // const listArr์˜ ๊ฒฝ์šฐ currentItem.parentElement์˜ ์ž์‹์ธ children๋ชฉ๋ก๋“ค์„ []์— ๋‹ด์•„ ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
    // const listArr = [...liDrag.parentElement.children];
    // let liDragIndx = listArr.indexOf(liDrag);
})

 

dragstart ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ,

ํƒ€๊ฒŸ์„ liDrag์— ๋‹ด๊ณ 

๋ถ€๋ชจ์š”์†Œ์—์„œ ํ•ด๋‹น ํƒ€๊ฒŸ์ด ๋ช‡๋ฒˆ์งธ์ธ์ง€ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„๋‚ด ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋‹ด๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์ด๋‹ค.

 

ํƒœ๊ทธ์˜ ํƒ€๊ฒŸ์ด li๊ฐ€ ์•„๋‹ ๋•Œ (์ผ๋‹จ ์ถ”๊ฐ€๋˜์–ด์žˆ๋Š” ๋ณ€์ˆ˜ li(ํ•  ์ผ ๋ชฉ๋ก์„ ๋‹ด๊ณ ์žˆ๋Š” liํƒœ๊ทธ ๋งž์Œ)๋กœ ๋งŒ๋“  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ƒ์œ„์š”์†Œ๋Š” ๊ดœ์ฐฎ๋‹ค.

๋ฌธ์ œ๋Š” li์— ์ถ”๊ฐ€๋˜์–ด์žˆ๋Š” ์ฒดํฌ๋ฐ•์Šค(Input), ํ• ์ผ ๋‚ด์šฉ์„ ์ถœ๋ ฅ(span), ์‚ญ์ œ๋ฒ„ํŠผ... ํ•˜์œ„์š”์†Œ๊ฐ€ ์„ ํƒ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ ๊ฒฝ์šฐ์—๋Š” currentTarget ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ๋ฐ”๋กœ ์ƒ์œ„์š”์†Œ์ธ li๋ฅผ ์„ ํƒํ•˜๋„๋ก ํ•ด์ค€๋‹ค.

 

 

2) ๋“œ๋ž˜๊ทธ ๋˜๋Š” ๋„์ค‘

 

๊ทธ ์™€์ค‘ ๋“œ๋ž˜๊ทธ ํ•˜๋Š” ๋™์•ˆ์— ๊ณ„์† dragover๊ฐ€ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— (ulํƒœ๊ทธ ์•ˆ์—์„œ ๊ณ„์† dragover ํ•˜๊ธฐ ๋•Œ๋ฌธ) dragover์ผ ์‹œ ๊ณ„์† ์ƒˆ๋กœ๊ณ ์นจ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด e.preventDefault)๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  todoList.addEventListener('dragover', (e) => {
    e.preventDefault();
  });

 

 

3) ๋“œ๋กญํ–ˆ์„ ๋•Œ

 

๋งˆ์ง€๋ง‰ drop์‹œ ์ด๋ฒคํŠธ๋‹ค...

  todoList.addEventListener("drop", (e) => {
    e.preventDefault();
    let liDrop;
    // ์ƒ์œ„ ์š”์†Œ์— ๋†“์„ ๊ฒฝ์šฐ
    if (e.target.tagName.toLowerCase() == 'li') {
      liDrop = e.target; 
    } else {
      return;
    }

    const dropIndex = Array.from(liDrop.parentNode.children).indexOf(liDrop);

    // after() : ์„ ํƒํ•œ ์š”์†Œ์˜ ๋ฐ”๋กœ ๋’ค์— ์ƒˆ ์š”์†Œ ์ถ”๊ฐ€
    // before() : ์„ ํƒํ•œ ์š”์†Œ์˜ ๋ฐ”๋กœ ์•ž์— ์ƒˆ ์š”์†Œ ์ถ”๊ฐ€
    if (dragIndex < dropIndex) {
      liDrop.after(liDrag);
    } else {
      liDrop.before(liDrag);
    }

 

์ผ๋‹จ drop ์‹œ ์ƒˆ๋กœ๊ณ ์นจ ๋˜๋Š” ํ˜„์ƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด e.preventDefault();๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ 

๋ณ€์ˆ˜ liDrag๋Š” ๋“œ๋ž˜๊ทธ ํ•œ ๋ณ€์ˆ˜๋ฅผ Dropํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ๋งŒ์ด ์•„๋‹Œ makeToDoList ํ•จ์ˆ˜ ์ „์ฒด์—์„œ ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋Š” ์ง€์—ญ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ด๋†จ๋‹ค.

๋ฐ˜๋ฉด liDrop์˜ ๊ฒฝ์šฐ์—๋Š” ๋“œ๋กญ๋˜๋Š” ํƒ€๊ฒŸ (์œ„์น˜)์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— drop ์ด๋ฒคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ ์„ ์–ธํ–ˆ๋‹ค.

 

dragstart ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๋•Œ์ฒ˜๋Ÿผ ์ฒ˜์Œ์— if๋ฌธ์ด ๋ณด์ด๋Š”๋ฐ ๋‚ด์šฉ์€ ๋”ดํŒ์ด๋‹ค.

drop์‹œ์— liํƒœ๊ทธ๋“ค๋ผ๋ฆฌ๋งŒ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์—, if๋ฌธ์œผ๋กœ target์˜ ํƒœ๊ทธ๊ฐ€ li์ผ๋•Œ๋งŒ liDrop์— ํƒ€๊ฒŸ์„ ๋Œ€์ž…ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค. ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” return์œผ๋กœ ์•„์˜ˆ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ค‘์ง€์‹œํ‚จ๋‹ค. dropIndex๋Š” dragIndex๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •๊ณผ ๊ฐ™๋‹ค.

 

๋งˆ์ง€๋ง‰์€ ์ •๋ ฌ์ด๋‹ค.

dragIndex๊ฐ€ dropIndex๋ณด๋‹ค ์ž‘์œผ๋ฉด after()๋ฉ”์†Œ๋“œ๋กœ liDrag์˜ ๋’ค ์š”์†Œ๋กœ liDrop์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์—๋Š” before()๋ฅผ ์ด์šฉํ•ด liDrag์˜ ์ด์ „, ์ฆ‰ ์•ž์— liDrop์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

 

 

 

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋˜ ๋ถ€๋ถ„

๋”๋ณด๊ธฐ

if๋ฌธ์€ ๋งŒ์•ฝ dragํ•œ ์š”์†Œ๊ฐ€ ul(์ƒ์œ„์š”์†Œ)์ผ ๊ฒฝ์šฐ, ์•„๋‹ˆ๋ฉด ํ•˜์œ„์š”์†Œ์— ๋†“์„ ๊ฒฝ์šฐ, ๊ทธ ์™ธ๋กœ ๊ตฌ๋ถ„์ง€์—ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๋ญ”๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™๊ธดํ•˜๋‹ค.. (๋ฌธ์ œ์ ์€ ์•„๋ž˜์— ์ ์–ด๋†จ๋‹ค.)

๋ถ€๋ชจ์š”์†Œ๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ e.target == liDrag.parentElement ๋“ฑ์œผ๋กœ๋„ ์„ ํƒํ•ด๋ดค๋Š”๋ฐ ์ฝ˜์†”์ฐฝ์—์„œ ๊ณ„์† ์„ ํƒ์ด ์•ˆ๋˜๋Š”๊ฑธ ๋ณด์•„ํ•˜๋‹ˆ ์ด๋ถ€๋ถ„์€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋“ฏ ํ•˜๋‹ค.

 

๋ฌธ์ œ๋Š” else if๋ฌธ์œผ๋กœ e.target์˜ ํƒœ๊ทธ๋„ค์ž„์ด li๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ (ํ•˜์œ„์š”์†Œ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž„) ๊ตฌ๊ธ€๋งํ•ด์„œ ๋“œ๋ž˜๊ทธ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์—ˆ๋Š”๋ฐ ์•„๋ฌด๋ž˜๋„ liํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ todoList(ulํƒœ๊ทธ๋ถ€๋ถ„)์ด ์„ ํƒ๋  ๋•Œ ul์˜ ์ƒ์œ„ํƒœ๊ทธ์ธ todoContainer๊ฐ€ ์„ ํƒ๋ผ ๊ฑฐ๊ธฐ๋กœ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๊ฒƒ ๊ฐ™๋‹ค...

 

์–ด๋””๊ฐ€.......

 

์ƒˆ๋ฒฝ์— ๋จธ๋ฆฌ๊ฐ€ ํ„ฐ์ง€๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ ์‹ฌ๋“ ๋“ ํ•˜๊ฒŒ๋จน๊ณ  ์ปคํ”ผ๋งˆ์‹œ๋ฉด์„œ ๋ถˆํ˜„๋“ฏ์ด ๊ทธ๋Ÿผ li๋นผ๊ณ  ๋ง‰์•„๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋˜๋ƒ๋Š” ์ƒ๊ฐ์ด ๋– ์˜ฌ๋ผ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค...

 

 


๋“œ๋ž˜๊ทธ์•ค ๋“œ๋กญ ๋ถ€๋ถ„ ์ „์ฒด ์ฝ”๋“œ

๋”๋ณด๊ธฐ
  // ๏ฝฅ๏พŸ*๏ฝก๏ฝฅ ๏ฝก*๏ฝฅ๏พŸ ๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ ๏ฝฅ๏พŸ*๏ฝก๏ฝฅ ๏ฝก*๏ฝฅ๏พŸ
  let liDrag;
  let dragIndex;

  // ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ
  todoList.addEventListener('dragstart', function (e) {
    // ๋งŒ์•ฝ ํƒ€๊ฒŸ์ด liํƒœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด?
    if (e.target.tagName.toLowerCase() !== 'li') {
      liDrag = e.currentTarget; // ์ƒ์œ„ <li> ์š”์†Œ๋กœ ์„ ํƒ
    } else {
      liDrag = e.target;
    }
    // ์™œ 4๋ฒˆ์”ฉ ์ถœ๋ ฅ๋˜๋Š”๊ฑด๊ฐ€...
    // console.log(liDrag.parentNode);
    dragIndex = Array.from(liDrag.parentNode.children).indexOf(liDrag);
  });

  // drop ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•จ
  todoList.addEventListener('dragover', (e) => {
    e.preventDefault();
  });

  todoList.addEventListener('drop', (e) => {
    e.preventDefault();
    e.stopPropagation();
    // ํƒ€๊ฒŸ์ด ๋˜๋Š” ์š”์†Œ๊ฐ€ ์ด๋‹Œ ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ์ผ ๋ถ€๋ชจ ์š”์†Œ์— drop ๋˜๋Š” ๊ฒฝ์šฐ ํƒˆ์ถœํ•œ๋‹ค.

    let liDrop;
    if (e.target.tagName.toLowerCase() == 'li') {
      liDrop = e.target; 
    } else {
      return;
    }
    const dropIndex = Array.from(liDrop.parentNode.children).indexOf(liDrop);

    // after() : ์„ ํƒํ•œ ์š”์†Œ์˜ ๋ฐ”๋กœ ๋’ค์— ์ƒˆ ์š”์†Œ ์ถ”๊ฐ€
    // before() : ์„ ํƒํ•œ ์š”์†Œ์˜ ๋ฐ”๋กœ ์•ž์— ์ƒˆ ์š”์†Œ ์ถ”๊ฐ€
    if (dragIndex < dropIndex) {
      liDrop.after(liDrag);
    } else if (dragIndex > dropIndex){
      liDrop.before(liDrag);
    } else {
      return;
    }
  });

 

์™„์„ฑ๋ณธ.. : https://stackblitz.com/edit/vitejs-vite-5bbnvx8a?embed=1&file=script.js

 

JavaScript 5์ผ์ฐจ (forked) - StackBlitz

A Vite project based on vite

stackblitz.com

 

 

 

 

์ฐธ๊ณ 

 

https://velog.io/@reasonz/2022.06.22-JS-drag-and-drop%EC%9C%BC%EB%A1%9C-%EC%84%A0%ED%83%9D%ED%95%9C-%EC%9A%94%EC%86%8C%EC%9D%98-%EC%9C%84%EC%B9%98-%EB%B0%94%EA%BE%B8%EA%B8%B0 

https://duklook.tistory.com/399