Skip to content

Commit f4db57b

Browse files
committed
Handle scrolling while dragging. Fixes #60.
1 parent 1773065 commit f4db57b

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

lib/draggable.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,11 +539,14 @@ module.exports = React.createClass({
539539
this.setState({
540540
dragging: true,
541541
offsetX: dragPoint.clientX - this.state.clientX,
542-
offsetY: dragPoint.clientY - this.state.clientY
542+
offsetY: dragPoint.clientY - this.state.clientY,
543+
scrollX: document.body.scrollLeft,
544+
scrollY: document.body.scrollTop
543545
});
544546

545547

546548
// Add event handlers
549+
addEvent(document, 'scroll', this.handleScroll);
547550
addEvent(document, dragEventFor.move, this.handleDrag);
548551
addEvent(document, dragEventFor.end, this.handleDragEnd);
549552
},
@@ -565,6 +568,7 @@ module.exports = React.createClass({
565568
this.props.onStop(e, createUIEvent(this));
566569

567570
// Remove event handlers
571+
removeEvent(document, 'scroll', this.handleScroll);
568572
removeEvent(document, dragEventFor.move, this.handleDrag);
569573
removeEvent(document, dragEventFor.end, this.handleDragEnd);
570574
},
@@ -600,6 +604,19 @@ module.exports = React.createClass({
600604
});
601605
},
602606

607+
handleScroll: function(e) {
608+
var s = this.state, x = document.body.scrollLeft, y = document.body.scrollTop;
609+
var offsetX = x - s.scrollX, offsetY = y - s.scrollY;
610+
this.setState({
611+
scrollX: x,
612+
scrollY: y,
613+
clientX: s.clientX + offsetX,
614+
clientY: s.clientY + offsetY,
615+
offsetX: s.offsetX - offsetX,
616+
offsetY: s.offsetY - offsetY
617+
});
618+
},
619+
603620
onMouseDown: function(ev) {
604621
// Prevent 'ghost click' which happens 300ms after touchstart if the event isn't cancelled.
605622
// We don't cancel the event on touchstart because of #37; we might want to make a scrollable item draggable.

0 commit comments

Comments
 (0)