Navigation Menu

Skip to content

Commit

Permalink
Draggable: Don't cache parent offset if the parent position is fixed.…
Browse files Browse the repository at this point in the history
… Fixes #5009 - Draggable: scroll not working with parent's position fixed
  • Loading branch information
mikesherov committed Apr 3, 2013
1 parent a88d645 commit 49c7b72
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
30 changes: 30 additions & 0 deletions tests/unit/draggable/draggable_core.js
Expand Up @@ -129,4 +129,34 @@ test( "#6258: not following mouse when scrolled and using overflow-y: scroll", f
});
});

test( "#5009: scroll not working with parent's position fixed", function() {
expect( 2 );

var startValue = 300,
element = $( "#draggable1" ).wrap( "<div id='wrapper' />" ).draggable({
drag: function() {
startValue += 100;
$( document ).scrollTop( startValue ).scrollLeft( startValue );
},
stop: function( event, ui ) {
equal( ui.position.left, 10, "left position is correct despite overflow on HTML" );
equal( ui.position.top, 10, "top position is correct despite overflow on HTML" );
$( document ).scrollTop( 0 ).scrollLeft( 0 );
}
}),
contentToForceScroll = $( "<div>" ).css({
height: "20000px",
width: "20000px"
});

$( "#qunit-fixture" ).append( contentToForceScroll );
$( "#wrapper" ).css( "position", "fixed" );

element.simulate( "drag", {
dx: 10,
dy: 10,
moves: 3
});
});

})( jQuery );
9 changes: 7 additions & 2 deletions ui/jquery.ui.draggable.js
Expand Up @@ -125,8 +125,10 @@ $.widget("ui.draggable", $.ui.mouse, {
this._cacheMargins();

//Store the helper's css position
this.cssPosition = this.helper.css("position");
this.cssPosition = this.helper.css( "position" );
this.scrollParent = this.helper.scrollParent();
this.offsetParent = this.helper.offsetParent();
this.offsetParentCssPosition = this.offsetParent.css( "position" );

//The element's absolute position on the page minus margins
this.offset = this.positionAbs = this.element.offset();
Expand Down Expand Up @@ -184,6 +186,10 @@ $.widget("ui.draggable", $.ui.mouse, {
},

_mouseDrag: function(event, noPropagation) {
// reset any necessary cached properties (see #5009)
if ( this.offsetParentCssPosition === "fixed" ) {
this.offset.parent = this._getParentOffset();
}

//Compute the helpers position
this.position = this._generatePosition(event);
Expand Down Expand Up @@ -320,7 +326,6 @@ $.widget("ui.draggable", $.ui.mouse, {
_getParentOffset: function() {

//Get the offsetParent and cache its position
this.offsetParent = this.helper.offsetParent();
var po = this.offsetParent.offset();

// This is a special case where we need to modify a offset calculated on start, since the following happened:
Expand Down

0 comments on commit 49c7b72

Please sign in to comment.