From 62a96c3ec29961643be6cb676fb2205f9dcea75c Mon Sep 17 00:00:00 2001 From: sallerli1 Date: Mon, 14 Aug 2023 10:11:28 +0800 Subject: [PATCH] fix(cdk:popper): popper shouldn't update if reference is display none --- packages/cdk/popper/src/middlewares/arrow.ts | 8 +++++++- packages/cdk/popper/src/middlewares/refenceHidden.ts | 2 +- packages/cdk/popper/src/middlewares/updatePlacement.ts | 9 ++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/cdk/popper/src/middlewares/arrow.ts b/packages/cdk/popper/src/middlewares/arrow.ts index f0780f91f..4fd64198c 100644 --- a/packages/cdk/popper/src/middlewares/arrow.ts +++ b/packages/cdk/popper/src/middlewares/arrow.ts @@ -14,11 +14,17 @@ export function arrow(arrowElement: HTMLElement): Middleware { ...rest, name: 'IDUX_arrow', async fn(middlewareArguments) { + const { reference } = middlewareArguments.elements + + if (!(reference instanceof HTMLElement) || getComputedStyle(reference).display === 'none') { + return middlewareArguments + } + const res = (await arrowFn(middlewareArguments)) as { data: { x: number; y: number; centerOffset: number } } + const { data: { x, y }, } = res - Object.assign(arrowElement.style, { left: x != null ? `${x}px` : '', top: y != null ? `${y}px` : '', diff --git a/packages/cdk/popper/src/middlewares/refenceHidden.ts b/packages/cdk/popper/src/middlewares/refenceHidden.ts index f275450c9..7d18617bc 100644 --- a/packages/cdk/popper/src/middlewares/refenceHidden.ts +++ b/packages/cdk/popper/src/middlewares/refenceHidden.ts @@ -68,7 +68,7 @@ function checkParentsVisible(el: ReferenceElement): boolean { let parent = el.parentElement while (parent) { - if (!isVisibleElement(parent)) { + if (getComputedStyle(parent).display !== 'contents' && !isVisibleElement(parent)) { return false } diff --git a/packages/cdk/popper/src/middlewares/updatePlacement.ts b/packages/cdk/popper/src/middlewares/updatePlacement.ts index 3842dcbb1..d6861ce1e 100644 --- a/packages/cdk/popper/src/middlewares/updatePlacement.ts +++ b/packages/cdk/popper/src/middlewares/updatePlacement.ts @@ -16,11 +16,14 @@ export function updatePlacement(updatePlacement: (value: PopperPlacement) => voi fn(middlewareArguments) { const { placement, - elements: { floating }, + elements: { floating, reference }, } = middlewareArguments - updatePlacement(camelCase(placement) as PopperPlacement) - floating.setAttribute('data-popper-placement', placement) + if (reference instanceof HTMLElement && getComputedStyle(reference).display !== 'none') { + updatePlacement(camelCase(placement) as PopperPlacement) + floating.setAttribute('data-popper-placement', placement) + } + return middlewareArguments }, }