drag를 비롯한 mouse event들은 좌표 개념에 대한 이해가 먼저 필요하다.
drag event(object move)를 작동하기 위해 좌표설정(position) 개념을 이해한다.
addEventListener, 개별적인 객체(QuerySelector)에 대해 mouse event를 추가 모두 가능하다.
객체정의
let section = document.querySelector('.desktop')
let container = section.querySelector('.container');
let box = container.querySelector('.box')
객체에 대한 mousedown/mousemove/mouseup을 활용하여 drag logic 구현
let isClicked = false;
let offsetX, offsetY = 0;
container.onmousedown = function(e){
//box를 선택하였을때만
if(e.target == box){
isClicked = true;
offsetX = e.offsetX;
offsetY = e.offsetY;
}
}
//box가 종속되어있는 부모영역(DOM)에서 움직일 경우에 반응
//box 객체에 대해서는 mousemove event에 반응하여 움직임
container.onmousemove = function(e){
if(isClicked){
box.style.position = 'absolute';
box.style.left = e.pageX - offsetX + 'px';
box.style.top = e.pageY - offsetY + 'px';
}else{
return ;
}
container.onmouseup = function(e){
isClicked = false;
}
if(e.target == box)
부분을 적용하면 선택한 객체의 속성이 box라 하여도, 가장 최상위 객체(위에 있는 block)에 대해서만 event 적용이 가능하다.객체정의
let section = document.querySelector('.desktop')
let container = section.querySelector('.container');
let box = container.querySelector('.box')
현재 이벤트가 적용될(선택된) 객체 정보를 저장할 변수 선언
let isClicked = false;
let offsetX, offsetY = 0;
let currentObject = null;
currentObject를 활용하여 모든 객체에 event를 적용할 수 있도록 설정
container.onmousedown = function(e){
//box를 선택하였을때만
isClicked = true;
offsetX = e.offsetX;
offsetY = e.offsetY;
current = e.target;
}
//box가 종속되어있는 부모영역(DOM)에서 움직일 경우에 반응
//box 객체에 대해서는 mousemove event에 반응하여 움직임
container.onmousemove = function(e){
if(isClicked){
current.style.position = 'absolute';
current.style.left = e.pageX - offsetX + 'px';
current.style.top = e.pageY - offsetY + 'px';
}else{
return ;
}
container.onmouseup = function(e){
isClicked = false;
}
}
element drag 심화(style이 아닌 transform method를 통한 이동)
https://velog.io/@altmshfkgudtjr/JS-Screen-Dragging-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
좌표/drag event 기본 개념
https://www.youtube.com/watch?v=Qzmya5CV9FA&list=RDCMUC5-ixpj8DioZqmrasj6Ihpw&start_radio=1&t=395s