start-drag
Version:
Listens and composes mouse or touch events to dragging callbacks
48 lines (47 loc) • 1.47 kB
JavaScript
// src/index.ts
function startDrag(event, container, onMove, onEnd) {
const isTouch = event instanceof TouchEvent;
let initX = 0;
let initY = 0;
const move = (event2, init = false) => {
const rect = container.getBoundingClientRect();
const defaultView = container.ownerDocument.defaultView;
const offsetX = rect.left + defaultView.scrollX;
const offsetY = rect.top + defaultView.scrollY;
const isTouch2 = event2 instanceof TouchEvent;
const x = (isTouch2 ? event2.changedTouches[0].pageX : event2.pageX) - offsetX;
const y = (isTouch2 ? event2.changedTouches[0].pageY : event2.pageY) - offsetY;
if (init) {
initX = x;
initY = y;
}
onMove(event2, x, y, x - initX, y - initY);
};
move(event, true);
const destroy = () => {
if (isTouch) {
document.removeEventListener("touchmove", move);
document.removeEventListener("touchend", stop);
} else {
document.removeEventListener("mousemove", move);
document.removeEventListener("mouseup", stop);
}
};
const stop = (event2) => {
destroy();
if (typeof onEnd === "function") {
onEnd(event2);
}
};
if (isTouch) {
document.addEventListener("touchmove", move, { passive: true });
document.addEventListener("touchend", stop);
} else {
document.addEventListener("mousemove", move, { passive: true });
document.addEventListener("mouseup", stop);
}
return destroy;
}
export {
startDrag
};