Skip to content

Commit e6e3616

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 e6e3616

File tree

2 files changed

+50
-25
lines changed

2 files changed

+50
-25
lines changed

jquery.dropdown.css

+12
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

+38-25
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,52 @@ if (jQuery) (function ($) {
113109
}
114110
}
115111

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) {
117119

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);
122123

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();
124130

131+
if (jqDropdown.length === 0 || !trigger) return;
132+
var pos = {};
125133
// Position the jq-dropdown relative-to-parent...
126134
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+
}
133143
} else {
134144
// ...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+
}
140152
}
153+
jqDropdown.css(pos);
141154
}
142155

143156
$(document).on('click.jq-dropdown', '[data-jq-dropdown]', show);
144157
$(document).on('click.jq-dropdown', hide);
145-
$(window).on('resize', position);
158+
$(window).on('resize', window_resize);
146159

147160
})(jQuery);

0 commit comments

Comments
 (0)