diff --git a/packages/runtime-dom/src/components/TransitionGroup.ts b/packages/runtime-dom/src/components/TransitionGroup.ts index 3ba59f068c1..b00d49adab7 100644 --- a/packages/runtime-dom/src/components/TransitionGroup.ts +++ b/packages/runtime-dom/src/components/TransitionGroup.ts @@ -29,8 +29,13 @@ import { } from '@vue/runtime-core' import { extend } from '@vue/shared' -const positionMap = new WeakMap() -const newPositionMap = new WeakMap() +interface Position { + left: number + top: number +} + +const positionMap = new WeakMap() +const newPositionMap = new WeakMap() const moveCbKey = Symbol('_moveCb') const enterCbKey = Symbol('_enterCb') @@ -145,10 +150,7 @@ const TransitionGroupImpl: ComponentOptions = /*@__PURE__*/ decorate({ instance, ), ) - positionMap.set( - child, - (child.el as Element).getBoundingClientRect(), - ) + positionMap.set(child, calculatePosition(child.el as Element)) } } } @@ -188,8 +190,20 @@ function callPendingCbs(c: VNode) { } } +function calculatePosition(el: Element) { + const rect = el.getBoundingClientRect() + const style = getComputedStyle(el) + + const matrix = new DOMMatrixReadOnly(style.transform) + const [ox, oy] = style.transformOrigin.split(' ').map(v => parseFloat(v)) + const point = new DOMPoint(ox, oy) + const transformed = point.matrixTransform(matrix) + + return { left: transformed.x + rect.left, top: transformed.y + rect.top } +} + function recordPosition(c: VNode) { - newPositionMap.set(c, (c.el as Element).getBoundingClientRect()) + newPositionMap.set(c, calculatePosition(c.el as Element)) } function applyTranslation(c: VNode): VNode | undefined {