Skip to content

Commit

Permalink
Draggable: Check all parents for fixed positioning when scrolling
Browse files Browse the repository at this point in the history
Fixes #9612
  • Loading branch information
mikesherov committed Aug 23, 2014
1 parent 95546c5 commit df7e32f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 14 deletions.
32 changes: 20 additions & 12 deletions tests/unit/draggable/draggable_core.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,25 +182,33 @@ test( "#9315: jumps down with offset of scrollbar", function() {
});
});

test( "#5009: scroll not working with parent's position fixed", function() {
test( "scroll offset with fixed ancestors", 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 when parent position is fixed" );
equal( ui.position.top, 10, "top position is correct when parent position is fixed" );
$( document ).scrollTop( 0 ).scrollLeft( 0 );
}
});
element = $( "#draggable1" )
// http://bugs.jqueryui.com/ticket/5009
// scroll not working with parent's position fixed
.wrap( "<div id='wrapper' />" )
// http://bugs.jqueryui.com/ticket/9612
// abspos elements inside of fixed elements moving away from the mouse when scrolling
.wrap( "<div id='wrapper2' />" )
.draggable({
drag: function() {
startValue += 100;
$( document ).scrollTop( startValue ).scrollLeft( startValue );
},
stop: function( event, ui ) {
equal( ui.position.left, 10, "left position is correct when parent position is fixed" );
equal( ui.position.top, 10, "top position is correct when parent position is fixed" );
$( document ).scrollTop( 0 ).scrollLeft( 0 );
}
});

TestHelpers.forceScrollableWindow();

$( "#wrapper" ).css( "position", "fixed" );
$( "#wrapper2" ).css( "position", "absolute" );

element.simulate( "drag", {
dx: 10,
Expand Down
6 changes: 4 additions & 2 deletions ui/draggable.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,9 @@ $.widget("ui.draggable", $.ui.mouse, {
this.cssPosition = this.helper.css( "position" );
this.scrollParent = this.helper.scrollParent( true );
this.offsetParent = this.helper.offsetParent();
this.offsetParentCssPosition = this.offsetParent.css( "position" );
this.hasFixedAncestor = this.helper.parents().filter(function() {
return $( this ).css( "position" ) === "fixed";
}).length > 0;

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

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

Expand Down

0 comments on commit df7e32f

Please sign in to comment.