lemming
7/31/2016 - 11:21 AM

Rx draggable example

Rx draggable example

#draggable-block {
	position: absolute;
	text-transform: uppercase;
	top: 0;
	left: 0;
	-webkit-user-select: none;
	cursor: default;
}
let draggableBlock = document.getElementById('draggable-block');
let mouseDowns = Rx.Observable.fromEvent(draggableBlock, 'mousedown');

mouseDowns
	.flatMap(e => {
		const diffX = e.pageX - parseInt(e.target.style.left || 0);
		const diffY = e.pageY - parseInt(e.target.style.top || 0);
		
		return Rx.Observable.fromEvent(document, 'mousemove')
			.map(e => ({
				x: e.pageX - diffX,
				y: e.pageY - diffY
			}))
			.takeUntil(Rx.Observable.fromEvent(document, 'mouseup'))
	})
  	.subscribe(e => {
  		draggableBlock.style.left = e.x + 'px';
		draggableBlock.style.top = e.y + 'px';
  	});
<div id="draggable-block" style="border: 2px solid black; padding: 20px; display:inline-block">Drag me</div>