From df7e32fe3798562ffb86d064444f1e0cc8ac59a8 Mon Sep 17 00:00:00 2001 From: Mike Sherov Date: Sat, 23 Aug 2014 15:34:04 -0400 Subject: [PATCH] Draggable: Check all parents for fixed positioning when scrolling Fixes #9612 --- tests/unit/draggable/draggable_core.js | 32 ++++++++++++++++---------- ui/draggable.js | 6 +++-- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/tests/unit/draggable/draggable_core.js b/tests/unit/draggable/draggable_core.js index de88b1947..81c31e22f 100644 --- a/tests/unit/draggable/draggable_core.js +++ b/tests/unit/draggable/draggable_core.js @@ -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( "
" ).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( "
" ) + // http://bugs.jqueryui.com/ticket/9612 + // abspos elements inside of fixed elements moving away from the mouse when scrolling + .wrap( "
" ) + .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, diff --git a/ui/draggable.js b/ui/draggable.js index 8cbcfe1ab..ebafaeb83 100644 --- a/ui/draggable.js +++ b/ui/draggable.js @@ -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(); @@ -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(); } -- 2.39.5