diff --git a/packages/stage/src/StageCore.ts b/packages/stage/src/StageCore.ts index 2228a552..b0f9e91c 100644 --- a/packages/stage/src/StageCore.ts +++ b/packages/stage/src/StageCore.ts @@ -160,7 +160,7 @@ export default class StageCore extends EventEmitter { if (this.renderer.contentWindow) { removeSelectedClassName(this.renderer.contentWindow.document); if (this.selectedDom) { - addSelectedClassName(this.selectedDom); + addSelectedClassName(this.selectedDom, this.renderer.contentWindow.document); } } } diff --git a/packages/stage/src/util.ts b/packages/stage/src/util.ts index 25cab0b9..83523367 100644 --- a/packages/stage/src/util.ts +++ b/packages/stage/src/util.ts @@ -19,6 +19,16 @@ import { Mode, SELECTED_CLASS } from './const'; import type { Offset } from './types'; +const getParents = (el: Element, relative: Element) => { + let cur: Element | null = el.parentElement; + const parents: Element[] = []; + while (cur && cur !== relative) { + parents.push(cur); + cur = cur.parentElement; + } + return parents; +}; + export const getOffset = (el: HTMLElement): Offset => { const { transform } = getComputedStyle(el); const { offsetParent } = el; @@ -161,10 +171,16 @@ export const removeSelectedClassName = (doc: Document) => { if (oldEl) { oldEl.classList.remove(SELECTED_CLASS); (oldEl.parentNode as HTMLDivElement)?.classList.remove(`${SELECTED_CLASS}-parent`); + doc.querySelectorAll(`.${SELECTED_CLASS}-parents`).forEach((item) => { + item.classList.remove(`${SELECTED_CLASS}-parents`); + }); } }; -export const addSelectedClassName = (el: Element) => { +export const addSelectedClassName = (el: Element, doc: Document) => { el.classList.add(SELECTED_CLASS); (el.parentNode as Element)?.classList.add(`${SELECTED_CLASS}-parent`); + getParents(el, doc.body).forEach((item) => { + item.classList.add(`${SELECTED_CLASS}-parents`); + }); };