Skip to content

Commit 5e44b3c

Browse files
Jean-Francois Remyscottgonzalez
authored andcommitted
Position: Handled scrolled windows properly with collision: fit. Fixes #7211 - Position: Collision: fit doesn't work at top of window when scrolled.
1 parent 51df02e commit 5e44b3c

File tree

2 files changed

+48
-14
lines changed

2 files changed

+48
-14
lines changed

tests/unit/position/position_core.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
(function( $ ) {
22

3+
function scrollTopSupport() {
4+
$( window ).scrollTop( 1 );
5+
return $( window ).scrollTop() === 1;
6+
}
7+
38
module( "position" );
49

510
test( "my, at, of", function() {
@@ -161,11 +166,7 @@ test( "of", function() {
161166
left: $( window ).width() - 10
162167
}, "window as jQuery object" );
163168

164-
var scrollTopSupport = (function() {
165-
$( window ).scrollTop( 1 );
166-
return $( window ).scrollTop() === 1;
167-
}() );
168-
if ( scrollTopSupport ) {
169+
if ( scrollTopSupport() ) {
169170
$( window ).scrollTop( 500 ).scrollLeft( 200 );
170171
$( "#elx" ).position({
171172
my: "right bottom",
@@ -311,6 +312,22 @@ test( "collision: fit, with offset", function() {
311312
}, { top: 0, left: 0 }, "left top, negative offset" );
312313
});
313314

315+
test( "collision: fit, window scrolled", function() {
316+
if ( scrollTopSupport() ) {
317+
var win = $( window );
318+
win.scrollTop( 300 ).scrollLeft( 200 );
319+
collisionTest({
320+
collision: "fit",
321+
at: "left-100 top-100"
322+
}, { top: 300, left: 200 }, "top left" );
323+
collisionTest2({
324+
collision: "fit",
325+
at: "right+100 bottom+100"
326+
}, { top: 300 + win.height() - 10, left: 200 + win.width() - 10 }, "right bottom" );
327+
win.scrollTop( 0 ).scrollLeft( 0 );
328+
}
329+
});
330+
314331
test( "collision: flip, no offset", function() {
315332
collisionTest({
316333
collision: "flip"

ui/jquery.ui.position.js

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -184,20 +184,37 @@ $.ui.position = {
184184
fit: {
185185
left: function( position, data ) {
186186
var win = $( window ),
187-
over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
188-
position.left = over > 0 ?
189-
position.left - over :
190-
Math.max( position.left - data.collisionPosition.left, position.left );
187+
overLeft = win.scrollLeft() - data.collisionPosition.left,
188+
overRight = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
189+
190+
// element is wider than window or too far left -> align with left edge
191+
if ( data.collisionWidth > win.width() || overLeft > 0 ) {
192+
position.left = position.left + overLeft;
193+
// too far right -> align with right edge
194+
} else if ( overRight > 0 ) {
195+
position.left = position.left - overRight;
196+
// adjust based on position and margin
197+
} else {
198+
position.left = Math.max( position.left - data.collisionPosition.left, position.left );
199+
}
191200
},
192201
top: function( position, data ) {
193202
var win = $( window ),
194-
over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
195-
position.top = over > 0 ?
196-
position.top - over :
197-
Math.max( position.top - data.collisionPosition.top, position.top );
203+
overTop = win.scrollTop() - data.collisionPosition.top,
204+
overBottom = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
205+
206+
// element is taller than window or too far up -> align with top edge
207+
if ( data.collisionHeight > win.height() || overTop > 0 ) {
208+
position.top = position.top + overTop;
209+
// too far down -> align with bottom edge
210+
} else if ( overBottom > 0 ) {
211+
position.top = position.top - overBottom;
212+
// adjust based on position and margin
213+
} else {
214+
position.top = Math.max( position.top - data.collisionPosition.top, position.top );
215+
}
198216
}
199217
},
200-
201218
flip: {
202219
left: function( position, data ) {
203220
if ( data.at[ 0 ] === center ) {

0 commit comments

Comments
 (0)