Browser_event_mouse-drag-and-drop
mouse-drag-and-drop#
모던 HTML 표준에서는 드래그 앤 드롭 내용이 있습니다.
- dragstart- dragend이벤트- 운영체제의 파일 관리 애플리케이션으로 부터 파일을 드래그하여 브라우저 화면에 드롭하는 기능을 제공함.
- 한계- 특정 영역에서 드래그 하는 것을 막을 수 없음
- 수평 / 수직으로만 드래그 할 수 없다.
- 모바일 환경 지원 부족
 
- 한계를 극복하기 위해 마우스 이벤트를 이용하여 drag&drop 기능을 구현해봅니다.
 
DragZone, Droppable, Draggable 및 기타 클래스 등 아키텍처를 구축하는 프레임워크가 있습니다. 대부분은 앞서 드래그와 드롭에 대한 설명과 유사한 작업을 하므로 이해하기 쉽습니다. 때로는 제3의 솔루션 적용보다 쉽게 수행할 수 있습니다.
drag & drop 알고리즘#
- mousedown- 움직임이 필요한 요소를 준비함.
 
- mousemove- position: absolute의- left, top을 변경
 
- mouseup- 드래그 앤 드롭 완료와 관련된 모든 작업 수행
 
공을 드래그 하는 구현#
- HTMLElement.offsetWidth 
- MouseEvent.pageX- 전체 문서의 왼쪽 가장자리를 기준으로 마우스를 클릭 한 지점의 X (수평) 좌표 (픽셀)를 반환합니다
 
브라우저 자체적으로 이미지나 요소에 대한 드래그 앤 드롭을 지원한다면.
- drag 를 할 때, 복사된 공을 드래그 하는 동작이 나타날 수 있다.
- 이럴 때 다음 코드를 추가해 준다.
이미지 내의 어떤 좌표를 클릭하면 이미지가 움직여버리는 문제점이 있습니다.
- 이벤트가 발생한 애플리케이션 viewport 내에 수평 좌표를 제공한다
 
- Element.getBoundingClientRect() - DOMRect 요소의 크기 및 뷰포트를 기준으로 한 위치에 대한 정보를 제공 하는 객체를 반환합니다.
 
 
- DOMRect 요소의 크기 및 뷰포트를 기준으로 한 위치에 대한 정보를 제공 하는 객체를 반환합니다.
- 직사각형의 크기와 위치를 나타냅니다.
 
잠재적 드롭 대상#
마우스 이벤트의 맨 위 요소에서만 이벤트가 발생하는 문제#
blue 에서는 이벤트 핸들러가 동작하지 않습니다. red 가 만약 다른 곳으로 이동하게 된다면 blue 가
디스플레이에 보이게 되고, blue 의 이벤트 핸들러가 동작하는 것을 기대해야 합니다. 
document.elementFromPoint 
- 윈도우 기준 좌표에서 가장 많이 중첩된 요소를 반환한다.
다음과 같이 구현 합니다.