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 요소의 크기 및 뷰포트를 기준으로 한 위치에 대한 정보를 제공 하는 객체를 반환합니다.
- 직사각형의 크기와 위치를 나타냅니다.
#
잠재적 드롭 대상#
마우스 이벤트의 맨 위 요소에서만 이벤트가 발생하는 문제blue
에서는 이벤트 핸들러가 동작하지 않습니다. red 가 만약 다른 곳으로 이동하게 된다면 blue 가
디스플레이에 보이게 되고, blue 의 이벤트 핸들러가 동작하는 것을 기대해야 합니다.
document.elementFromPoint
- 윈도우 기준 좌표에서 가장 많이 중첩된 요소를 반환한다.
다음과 같이 구현 합니다.