Skip to content

Commit 8a5ded6

Browse files
committed
Ability to add a jq-dropdown-above class to force dropdown to appear above trigger, similarly to jq-dropdown-anchor-right
1 parent 50a9c28 commit 8a5ded6

File tree

2 files changed

+52
-25
lines changed

2 files changed

+52
-25
lines changed

jquery.dropdown.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,18 @@
4949
border-bottom: 6px solid white;
5050
display: inline-block;
5151
}
52+
.jq-dropdown.jq-dropdown-above.jq-dropdown-tip:before {
53+
top: auto;
54+
bottom: -6px;
55+
border-bottom: none;
56+
border-top: 7px solid #adc3db;
57+
}
58+
.jq-dropdown.jq-dropdown-above.jq-dropdown-tip:after {
59+
top: auto;
60+
bottom: -5px;
61+
border-bottom: none;
62+
border-top: 6px solid white;
63+
}
5264
.jq-dropdown.jq-dropdown-tip.jq-dropdown-anchor-right:before {
5365
left: auto;
5466
right: 9px;

jquery.dropdown.js

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)