@@ -184,20 +184,37 @@ $.ui.position = {
184
184
fit : {
185
185
left : function ( position , data ) {
186
186
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
+ }
191
200
} ,
192
201
top : function ( position , data ) {
193
202
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
+ }
198
216
}
199
217
} ,
200
-
201
218
flip : {
202
219
left : function ( position , data ) {
203
220
if ( data . at [ 0 ] === center ) {
0 commit comments