From 4d34f527a21740edd8378a730f2f1ff25b021750 Mon Sep 17 00:00:00 2001 From: mohamed yahia Date: Mon, 3 Feb 2025 12:21:59 +0200 Subject: [PATCH] Fix resizer on absolute drag mode when the parent is positioned ( position: relative | absolute | .... ) (#6382) * Fix resizer on absolute drag mode when the parent is positioned ( position: relative | absolute | .... ) * Improve calculation performance * Up Resizer --------- Co-authored-by: Artur Arseniev --- packages/core/src/utils/Resizer.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/core/src/utils/Resizer.ts b/packages/core/src/utils/Resizer.ts index 3b52f7cc26..e239fab4eb 100644 --- a/packages/core/src/utils/Resizer.ts +++ b/packages/core/src/utils/Resizer.ts @@ -676,11 +676,13 @@ export default class Resizer { const parentH = this.parentDim!.h; const unitWidth = this.opts.unitWidth; const unitHeight = this.opts.unitHeight; + const parentRect = this.getParentRect(); const startW = unitWidth === '%' ? (startDim.w / 100) * parentW : startDim.w; const startH = unitHeight === '%' ? (startDim.h / 100) * parentH : startDim.h; + const box: RectDim = { - t: startDim.t, - l: startDim.l, + t: startDim.t - parentRect.top, + l: startDim.l - parentRect.left, w: startW, h: startH, }; @@ -750,4 +752,20 @@ export default class Resizer { return box; } + + getParentRect(): BoundingRect { + let parentRect = { left: 0, top: 0, width: 0, height: 0 }; + const { el } = this; + + if (!el) return parentRect; + + const { offsetParent } = el; + + // Check if the parent or any ancestor has `position: relative`, `absolute`, `fixed`, or `sticky` + if (offsetParent && offsetParent.tagName !== 'BODY') { + parentRect = this.getElementPos(offsetParent as HTMLElement); + } + + return parentRect; + } }