From c9216b4b966653dd63a67e815b47899ef5325298 Mon Sep 17 00:00:00 2001 From: Kevin Brown Date: Fri, 27 Nov 2015 17:58:08 -0500 Subject: [PATCH] Fixed positioning with non-static parents This fixes an issue with non-static parents (ones that were relatively or absolutely positioned) where the dropdown would be offset by the offset of the parent, so it would almost never line up. This fixes the problem by removing the offset when the parent is not statically positioned, which is what we used to do in older versions of Select2. This closes https://github.com/select2/select2/issues/3303. This closes https://github.com/select2/select2/issues/3614. This closes https://github.com/select2/select2/issues/3672. --- src/js/select2/dropdown/attachBody.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/js/select2/dropdown/attachBody.js b/src/js/select2/dropdown/attachBody.js index ec9fa437..667596df 100644 --- a/src/js/select2/dropdown/attachBody.js +++ b/src/js/select2/dropdown/attachBody.js @@ -3,7 +3,7 @@ define([ '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { - this.$dropdownParent = options.get('dropdownParent') || document.body; + this.$dropdownParent = options.get('dropdownParent') || $(document.body); decorated.call(this, $element, options); } @@ -157,6 +157,14 @@ define([ top: container.bottom }; + // Fix positioning with static parents + if (this.$dropdownParent[0].style.position !== 'static') { + var parentOffset = this.$dropdownParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + } + if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; }