diff --git a/src/base/combination/combo.js b/src/base/combination/combo.js index 2a7a0d8d8..75c45a4fe 100644 --- a/src/base/combination/combo.js +++ b/src/base/combination/combo.js @@ -310,8 +310,8 @@ var scaleX = positonedRect.width / positionRelativeElement.offsetWidth; var scaleY = positonedRect.height / positionRelativeElement.offsetHeight; - p.top && (p.top = Math.round(p.top / scaleY)); - p.left && (p.left = Math.round(p.left / scaleX)); + p.top && (p.top = Math.round(p.top / scaleY + positionRelativeElement.scrollTop)); + p.left && (p.left = Math.round(p.left / scaleX + positionRelativeElement.scrollLeft)); p.adaptHeight && (p.adaptHeight = Math.round(p.adaptHeight / scaleY)); } diff --git a/src/core/controller/controller.bubbles.js b/src/core/controller/controller.bubbles.js index 6c679b1e9..fc736a094 100644 --- a/src/core/controller/controller.bubbles.js +++ b/src/core/controller/controller.bubbles.js @@ -71,10 +71,7 @@ BI.BubblesController = BI.inherit(BI.Controller, { { name: "preventOverflow", enabled: false - }, { - name: "flip", - enabled: false - }, + } ] }); return this; diff --git a/src/core/platform/web/dom.js b/src/core/platform/web/dom.js index 7d6ac59ea..945aa359a 100644 --- a/src/core/platform/web/dom.js +++ b/src/core/platform/web/dom.js @@ -239,13 +239,15 @@ }, isRightSpaceLarger: function (combo) { - var windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); - return windowBounds.width - combo.element.offset().left - combo.element.bounds().width >= combo.element.offset().left; + var comboBounds = combo.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + return viewportBounds.width - comboBounds.right >= comboBounds.left; }, isBottomSpaceLarger: function (combo) { - var windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); - return windowBounds.height - combo.element.offset().top - combo.element.bounds().height >= combo.element.offset().top; + var comboBounds = combo.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); + return viewportBounds.height - comboBounds.bottom >= comboBounds.top; }, _getLeftAlignPosition: function (combo, popup, extraWidth, container) { @@ -279,9 +281,9 @@ }; }, - getLeftAdaptPosition: function (combo, popup, extraWidth) { - if (BI.DOM.isLeftSpaceEnough(combo, popup, extraWidth)) { - return BI.DOM.getLeftPosition(combo, popup, extraWidth); + getLeftAdaptPosition: function (combo, popup, extraWidth, container) { + if (BI.DOM.isLeftSpaceEnough(combo, popup, extraWidth, container)) { + return BI.DOM.getLeftPosition(combo, popup, extraWidth, container); } return { left: 0 @@ -312,12 +314,12 @@ }; }, - getRightAdaptPosition: function (combo, popup, extraWidth) { - if (BI.DOM.isRightSpaceEnough(combo, popup, extraWidth)) { - return BI.DOM.getRightPosition(combo, popup, extraWidth); + getRightAdaptPosition: function (combo, popup, extraWidth, container) { + if (BI.DOM.isRightSpaceEnough(combo, popup, extraWidth, container)) { + return BI.DOM.getRightPosition(combo, popup, extraWidth, container); } return { - left: BI.Widget._renderEngine.createElement("body").bounds().width - popup.element.bounds().width + left: document.documentElement.getBoundingClientRect().width - popup.element[0].getBoundingClientRect().width - container.getBoundingClientRect().left }; }, @@ -355,26 +357,28 @@ }; }, - getTopAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) { - var popupBounds = popup.element.bounds(), - windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); + getTopAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight, positionRelativeElement) { + var comboBounds = combo.element[0].getBoundingClientRect(), + popupBounds = popup.element[0].getBoundingClientRect(), + positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(); if (BI.DOM.isTopSpaceEnough(combo, popup, extraHeight)) { return BI.DOM.getTopPosition(combo, popup, extraHeight); } if (needAdaptHeight) { return { - top: 0, - adaptHeight: combo.element.offset().top - extraHeight + top: 0 - positionRelativeElementRect.top, + adaptHeight: comboBounds.top - extraHeight }; } - if (popupBounds.height + extraHeight > windowBounds.height) { + if (popupBounds.height + extraHeight > viewportBounds.height) { return { - top: 0, - adaptHeight: windowBounds.height - extraHeight + top: 0 - positionRelativeElementRect.top, + adaptHeight: viewportBounds.height - extraHeight }; } return { - top: 0 + top: 0 - positionRelativeElementRect.top }; }, @@ -412,26 +416,28 @@ }; }, - getBottomAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) { - var comboBounds = combo.element[0].getBoundingClientRect(), popupBounds = popup.element[0].getBoundingClientRect(), - windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); + getBottomAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight, positionRelativeElement) { + var comboBounds = combo.element[0].getBoundingClientRect(), + popupBounds = popup.element[0].getBoundingClientRect(), + viewportBounds = document.documentElement.getBoundingClientRect(), + positionRelativeElementRect = positionRelativeElement.getBoundingClientRect(); if (BI.DOM.isBottomSpaceEnough(combo, popup, extraHeight)) { - return BI.DOM.getBottomPosition(combo, popup, extraHeight); + return BI.DOM.getBottomPosition(combo, popup, extraHeight, positionRelativeElement); } if (needAdaptHeight) { return { - top: comboBounds.top + comboBounds.height + extraHeight, - adaptHeight: windowBounds.height - comboBounds.top - comboBounds.height - extraHeight + top: comboBounds.top + comboBounds.height + extraHeight - positionRelativeElementRect.top, + adaptHeight: viewportBounds.height - comboBounds.top - comboBounds.height - extraHeight }; } - if (popupBounds.height + extraHeight > windowBounds.height) { + if (popupBounds.height + extraHeight > viewportBounds.height) { return { - top: extraHeight, - adaptHeight: windowBounds.height - extraHeight + top: extraHeight - positionRelativeElementRect.top, + adaptHeight: viewportBounds.height - extraHeight }; } return { - top: windowBounds.height - popupBounds.height - extraHeight + top: viewportBounds.height - popupBounds.height - extraHeight - positionRelativeElementRect.top }; }, @@ -638,10 +644,10 @@ case "left": case "right": if (BI.DOM.isRightSpaceLarger(combo)) { - left = BI.DOM.getRightAdaptPosition(combo, popup, extraWidth).left; + left = BI.DOM.getRightAdaptPosition(combo, popup, extraWidth, container).left; firstDir = "right"; } else { - left = BI.DOM.getLeftAdaptPosition(combo, popup, extraWidth).left; + left = BI.DOM.getLeftAdaptPosition(combo, popup, extraWidth, container).left; firstDir = "left"; } if (topBottom[0] === "bottom") { @@ -656,19 +662,19 @@ return pos; default : if (BI.DOM.isBottomSpaceLarger(combo)) { - top = BI.DOM.getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight).top; + top = BI.DOM.getBottomAdaptPosition(combo, popup, extraHeight, needAdaptHeight, container).top; firstDir = "bottom"; } else { - top = BI.DOM.getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight).top; + top = BI.DOM.getTopAdaptPosition(combo, popup, extraHeight, needAdaptHeight, container).top; firstDir = "top"; } if (leftRight[0] === "right") { - pos = BI.DOM.getLeftAlignPosition(combo, popup, extraWidth); + pos = BI.DOM.getLeftAlignPosition(combo, popup, extraWidth, container); pos.top = top; pos.dir = firstDir + "," + pos.dir; return pos; } - pos = BI.DOM.getRightAlignPosition(combo, popup, extraWidth); + pos = BI.DOM.getRightAlignPosition(combo, popup, extraWidth, container); pos.top = top; pos.dir = firstDir + "," + pos.dir; return pos;