From caf3dde39d0b360fc4f54dfd3096bf88743b7e88 Mon Sep 17 00:00:00 2001 From: zsmj Date: Thu, 22 Dec 2022 14:54:59 +0800 Subject: [PATCH] =?UTF-8?q?BI-119217=20fix:=20=E3=80=906.0.6=E5=86=92?= =?UTF-8?q?=E7=83=9F=E3=80=91=E7=AD=89=E6=AF=94=E8=87=AA=E9=80=82=E5=BA=94?= =?UTF-8?q?-=E9=AB=98=E6=B8=85=E5=B1=8F-=E5=AE=BD=E5=BA=A6=E8=87=AA?= =?UTF-8?q?=E9=80=82=E5=BA=94=E9=A2=84=E8=A7=88=EF=BC=8C=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A0=91=E6=9F=A5=E7=9C=8B=E5=B7=B2=E9=80=89=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 要考虑相对定位元素发生滚动的场景 --- src/base/combination/combo.js | 4 +-- src/core/platform/web/dom.js | 59 +++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 29 deletions(-) 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/platform/web/dom.js b/src/core/platform/web/dom.js index 7d6ac59ea..ef1989c8a 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 }; }, @@ -413,7 +417,8 @@ }, getBottomAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) { - var comboBounds = combo.element[0].getBoundingClientRect(), popupBounds = popup.element[0].getBoundingClientRect(), + var comboBounds = combo.element[0].getBoundingClientRect(), + popupBounds = popup.element[0].getBoundingClientRect(), windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); if (BI.DOM.isBottomSpaceEnough(combo, popup, extraHeight)) { return BI.DOM.getBottomPosition(combo, popup, extraHeight); @@ -638,10 +643,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 +661,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;