diff --git a/packages/cdk/popper/__tests__/__snapshots__/popper.spec.ts.snap b/packages/cdk/popper/__tests__/__snapshots__/popper.spec.ts.snap index fc832f3e2..d0d22dd7d 100644 --- a/packages/cdk/popper/__tests__/__snapshots__/popper.spec.ts.snap +++ b/packages/cdk/popper/__tests__/__snapshots__/popper.spec.ts.snap @@ -12,70 +12,70 @@ exports[`usePopper > options > autoAdjust work 2`] = ` exports[`usePopper > options > offset work 1`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > offset work 2`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 1`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 2`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 3`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 4`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 5`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 6`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 7`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 8`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 9`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 10`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 11`] = ` "
Trigger
-
Popper
" +
Popper
" `; exports[`usePopper > options > placement work 12`] = ` "
Trigger
-
Popper
" +
Popper
" `; diff --git a/packages/cdk/popper/src/middlewares/refenceHidden.ts b/packages/cdk/popper/src/middlewares/refenceHidden.ts index 2975dce54..f275450c9 100644 --- a/packages/cdk/popper/src/middlewares/refenceHidden.ts +++ b/packages/cdk/popper/src/middlewares/refenceHidden.ts @@ -5,7 +5,9 @@ * found in the LICENSE file at https://github.com/IDuxFE/idux/blob/main/LICENSE */ -import { type Middleware, type Side, type SideObject, hide } from '@floating-ui/dom' +import { type Middleware, type ReferenceElement, type Side, type SideObject, hide } from '@floating-ui/dom' + +import { isVisibleElement } from '@idux/cdk/utils' export const referenceHiddenMiddlewareName = 'IDUX_referenceHidden' export interface ReferenceHiddenData { @@ -23,19 +25,26 @@ export function referenceHidden(): Middleware { name: referenceHiddenMiddlewareName, async fn(middlewareArguments) { const { - elements: { floating }, + elements: { floating, reference }, } = middlewareArguments const res = (await hideFn(middlewareArguments)) as { data: ReferenceHiddenData } const { - data: { referenceHiddenOffsets }, + data: { referenceHidden, referenceHiddenOffsets }, } = res - const referenceHidden = sides.some(side => referenceHiddenOffsets[side] > 0) + const shouldHideReference = + referenceHidden && + !( + reference instanceof HTMLElement && + getComputedStyle(reference).display === 'none' && + sides.some(side => referenceHiddenOffsets[side] === 0) && + checkParentsVisible(reference) + ) - if (sides.some(side => referenceHiddenOffsets[side] > 0)) { + if (shouldHideReference) { floating.setAttribute('data-popper-reference-hidden', '') } else { floating.removeAttribute('data-popper-reference-hidden') @@ -45,9 +54,26 @@ export function referenceHidden(): Middleware { ...res, data: { ...res.data, - referenceHidden, + referenceHidden: shouldHideReference, }, } }, } } + +function checkParentsVisible(el: ReferenceElement): boolean { + if (!(el instanceof HTMLElement)) { + return true + } + + let parent = el.parentElement + while (parent) { + if (!isVisibleElement(parent)) { + return false + } + + parent = parent.parentElement + } + + return true +}