@@ -52,14 +52,10 @@ if (jQuery) (function ($) {
52
52
53
53
if ( isOpen || trigger . hasClass ( 'jq-dropdown-disabled' ) ) return ;
54
54
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 )
60
56
61
- // Position it
62
- position ( ) ;
57
+ // Show and position it
58
+ position ( jqDropdown ) ;
63
59
64
60
// Trigger the show callback
65
61
jqDropdown
@@ -113,35 +109,52 @@ if (jQuery) (function ($) {
113
109
}
114
110
}
115
111
116
- function position ( ) {
112
+ function window_resize ( ) {
113
+ var jqDropdown = $ ( '.jq-dropdown:visible' ) . eq ( 0 )
114
+ jqDropdown . hide ( ) ; // we need to be able to get a clean doc_height
115
+ position ( jqDropdown ) ;
116
+ }
117
+
118
+ function position ( jqDropdown ) {
117
119
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 ;
120
+ var trigger = jqDropdown . data ( 'jq-dropdown-trigger' ) ,
121
+ hOffset = parseInt ( trigger . attr ( 'data-horizontal-offset' ) || 0 , 10 ) ,
122
+ vOffset = parseInt ( trigger . attr ( 'data-vertical-offset' ) || 0 , 10 ) ;
122
123
123
- if ( jqDropdown . length === 0 || ! trigger ) return ;
124
+ // Record dimensions before it is shown
125
+ var doc_height = jQuery ( window ) . height ( ) ;
126
+
127
+ // Show it
128
+ trigger . addClass ( 'jq-dropdown-open' ) ;
129
+ jqDropdown . show ( ) ;
124
130
131
+ if ( jqDropdown . length === 0 || ! trigger ) return ;
132
+ var pos = { } ;
125
133
// Position the jq-dropdown relative-to-parent...
126
134
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
- } ) ;
135
+ pos [ 'left' ] = jqDropdown . hasClass ( 'jq-dropdown-anchor-right' ) ?
136
+ trigger . position ( ) . left - ( jqDropdown . outerWidth ( true ) - trigger . outerWidth ( true ) ) - parseInt ( trigger . css ( 'margin-right' ) , 10 ) + hOffset :
137
+ trigger . position ( ) . left + parseInt ( trigger . css ( 'margin-left' ) , 10 ) + hOffset ;
138
+ if ( jqDropdown . hasClass ( 'jq-dropdown-above' ) ) {
139
+ pos [ 'bottom' ] = trigger . parent ( '.jq-dropdown-container' ) . outerHeight ( true ) - trigger . position ( ) . top - parseInt ( trigger . css ( 'margin-top' ) , 10 ) - vOffset ;
140
+ } else {
141
+ pos [ 'top' ] = trigger . position ( ) . top + trigger . outerHeight ( true ) - parseInt ( trigger . css ( 'margin-top' ) , 10 ) + vOffset ;
142
+ }
133
143
} else {
134
144
// ...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
- } ) ;
145
+ pos [ 'left' ] = jqDropdown . hasClass ( 'jq-dropdown-anchor-right' ) ?
146
+ trigger . offset ( ) . left - ( jqDropdown . outerWidth ( ) - trigger . outerWidth ( ) ) + hOffset : trigger . offset ( ) . left + hOffset ;
147
+ if ( jqDropdown . hasClass ( 'jq-dropdown-above' ) ) {
148
+ pos [ 'bottom' ] = doc_height - trigger . offset ( ) . top - vOffset ;
149
+ } else {
150
+ pos [ 'top' ] = trigger . offset ( ) . top + trigger . outerHeight ( ) + vOffset ;
151
+ }
140
152
}
153
+ jqDropdown . css ( pos ) ;
141
154
}
142
155
143
156
$ ( document ) . on ( 'click.jq-dropdown' , '[data-jq-dropdown]' , show ) ;
144
157
$ ( document ) . on ( 'click.jq-dropdown' , hide ) ;
145
- $ ( window ) . on ( 'resize' , position ) ;
158
+ $ ( window ) . on ( 'resize' , window_resize ) ;
146
159
147
160
} ) ( jQuery ) ;
0 commit comments