@@ -52,14 +52,10 @@ if (jQuery) (function ($) {
5252
5353 if ( isOpen || trigger . hasClass ( 'jq-dropdown-disabled' ) ) return ;
5454
55- // Show it
56- trigger . addClass ( 'jq-dropdown-open' ) ;
57- jqDropdown
58- . data ( 'jq-dropdown-trigger' , trigger )
59- . show ( ) ;
55+ jqDropdown . data ( 'jq-dropdown-trigger' , trigger )
6056
61- // Position it
62- position ( ) ;
57+ // Show and position it
58+ position ( jqDropdown ) ;
6359
6460 // Trigger the show callback
6561 jqDropdown
@@ -113,35 +109,54 @@ if (jQuery) (function ($) {
113109 }
114110 }
115111
116- function position ( ) {
112+ function window_resize ( ) {
113+ var jqDropdown = $ ( '.jq-dropdown:visible' ) . eq ( 0 )
114+ if ( jqDropdown . length === 0 ) return ;
115+ jqDropdown . hide ( ) ; // we need to be able to get a clean doc_height
116+ position ( jqDropdown ) ;
117+ }
118+
119+ function position ( jqDropdown ) {
120+
121+ var trigger = jqDropdown . data ( 'jq-dropdown-trigger' ) ,
122+ hOffset = parseInt ( trigger . attr ( 'data-horizontal-offset' ) || 0 , 10 ) ,
123+ vOffset = parseInt ( trigger . attr ( 'data-vertical-offset' ) || 0 , 10 ) ;
117124
118- var jqDropdown = $ ( '.jq-dropdown:visible' ) . eq ( 0 ) ,
119- trigger = jqDropdown . data ( 'jq-dropdown-trigger' ) ,
120- hOffset = trigger ? parseInt ( trigger . attr ( 'data-horizontal-offset' ) || 0 , 10 ) : null ,
121- vOffset = trigger ? parseInt ( trigger . attr ( 'data-vertical-offset' ) || 0 , 10 ) : null ;
125+ if ( ! trigger ) return ;
122126
123- if ( jqDropdown . length === 0 || ! trigger ) return ;
127+ // Record dimensions before it is shown
128+ var doc_height = jQuery ( document ) . height ( ) ;
124129
130+ // Show it
131+ trigger . addClass ( 'jq-dropdown-open' ) ;
132+ jqDropdown . show ( ) ;
133+
134+ var pos = { } ;
125135 // Position the jq-dropdown relative-to-parent...
126136 if ( jqDropdown . hasClass ( 'jq-dropdown-relative' ) ) {
127- jqDropdown . css ( {
128- left : jqDropdown . hasClass ( 'jq-dropdown-anchor-right' ) ?
129- trigger . position ( ) . left - ( jqDropdown . outerWidth ( true ) - trigger . outerWidth ( true ) ) - parseInt ( trigger . css ( 'margin-right' ) , 10 ) + hOffset :
130- trigger . position ( ) . left + parseInt ( trigger . css ( 'margin-left' ) , 10 ) + hOffset ,
131- top : trigger . position ( ) . top + trigger . outerHeight ( true ) - parseInt ( trigger . css ( 'margin-top' ) , 10 ) + vOffset
132- } ) ;
137+ pos [ 'left' ] = jqDropdown . hasClass ( 'jq-dropdown-anchor-right' ) ?
138+ trigger . position ( ) . left - ( jqDropdown . outerWidth ( true ) - trigger . outerWidth ( true ) ) - parseInt ( trigger . css ( 'margin-right' ) , 10 ) + hOffset :
139+ trigger . position ( ) . left + parseInt ( trigger . css ( 'margin-left' ) , 10 ) + hOffset ;
140+ if ( jqDropdown . hasClass ( 'jq-dropdown-above' ) ) {
141+ pos [ 'bottom' ] = trigger . parent ( '.jq-dropdown-container' ) . outerHeight ( true ) - trigger . position ( ) . top - parseInt ( trigger . css ( 'margin-top' ) , 10 ) - vOffset ;
142+ } else {
143+ pos [ 'top' ] = trigger . position ( ) . top + trigger . outerHeight ( true ) - parseInt ( trigger . css ( 'margin-top' ) , 10 ) + vOffset ;
144+ }
133145 } else {
134146 // ...or relative to document
135- jqDropdown . css ( {
136- left : jqDropdown . hasClass ( 'jq-dropdown-anchor-right' ) ?
137- trigger . offset ( ) . left - ( jqDropdown . outerWidth ( ) - trigger . outerWidth ( ) ) + hOffset : trigger . offset ( ) . left + hOffset ,
138- top : trigger . offset ( ) . top + trigger . outerHeight ( ) + vOffset
139- } ) ;
147+ pos [ 'left' ] = jqDropdown . hasClass ( 'jq-dropdown-anchor-right' ) ?
148+ trigger . offset ( ) . left - ( jqDropdown . outerWidth ( ) - trigger . outerWidth ( ) ) + hOffset : trigger . offset ( ) . left + hOffset ;
149+ if ( jqDropdown . hasClass ( 'jq-dropdown-above' ) ) {
150+ pos [ 'bottom' ] = doc_height - trigger . offset ( ) . top - vOffset ;
151+ } else {
152+ pos [ 'top' ] = trigger . offset ( ) . top + trigger . outerHeight ( ) + vOffset ;
153+ }
140154 }
155+ jqDropdown . css ( pos ) ;
141156 }
142157
143158 $ ( document ) . on ( 'click.jq-dropdown' , '[data-jq-dropdown]' , show ) ;
144159 $ ( document ) . on ( 'click.jq-dropdown' , hide ) ;
145- $ ( window ) . on ( 'resize' , position ) ;
160+ $ ( window ) . on ( 'resize' , window_resize ) ;
146161
147162} ) ( jQuery ) ;
0 commit comments