aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Sherov <mike.sherov@gmail.com>2014-08-23 15:34:04 -0400
committerMike Sherov <mike.sherov@gmail.com>2014-08-23 15:34:04 -0400
commitdf7e32fe3798562ffb86d064444f1e0cc8ac59a8 (patch)
tree67fe94208acb8210e369608071a33715adf7b714
parent95546c5d045f8055b121f24d3e35468e2a570c1b (diff)
downloadjquery-ui-df7e32fe3798562ffb86d064444f1e0cc8ac59a8.tar.gz
jquery-ui-df7e32fe3798562ffb86d064444f1e0cc8ac59a8.zip
Draggable: Check all parents for fixed positioning when scrolling
Fixes #9612
-rw-r--r--tests/unit/draggable/draggable_core.js32
-rw-r--r--ui/draggable.js6
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( "<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,
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();
}