Skip to content

Instantly share code, notes, and snippets.

@MoLow
Created March 7, 2017 21:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save MoLow/5adec1333e11e03ebc6dbf08c2a6d30c to your computer and use it in GitHub Desktop.
Save MoLow/5adec1333e11e03ebc6dbf08c2a6d30c to your computer and use it in GitHub Desktop.
rxjs drag and drop with touch support
var mousemove = Rx.Observable.merge(
Rx.Observable.fromEvent(document, 'mousemove')
.map((e) => { e.preventDefault(); return e; }),
Rx.Observable.fromEvent(document, 'touchmove'))
.map((e) => e.touches[0]),
mouseup = Rx.Observable.merge(
Rx.Observable.fromEvent(dragTarget, 'mouseup'),
Rx.Observable.fromEvent(dragTarget, 'touchend')),
mousedown = Rx.Observable.merge(
Rx.Observable.fromEvent(dragTarget, 'mousedown'),
Rx.Observable.fromEvent(dragTarget, 'touchstart')
.map((e) => {
var rect = e.target.getBoundingClientRect();
e.offsetX = e.touches[0].pageX - rect.left;
e.offsetY = e.touches[0].pageY - rect.top;
return e;
}));
mousedown
.flatMap((start) => mousemove
.map((mm) =>({
left: mm.clientX - start.offsetX,
top: mm.clientY - start.offsetY
}))
.takeUntil(mouseup))
.subscribe(function (pos) {
dragTarget.style.top = pos.top + 'px';
dragTarget.style.left = pos.left + 'px';
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment