mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-09-26 19:19:59 +08:00
feat(stage): 增加对齐线
This commit is contained in:
parent
26081ea5cc
commit
67e2ba3825
@ -25,7 +25,7 @@ import MoveableHelper from 'moveable-helper';
|
|||||||
|
|
||||||
import { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode } from './const';
|
import { DRAG_EL_ID_PREFIX, GHOST_EL_ID_PREFIX, GuidesType, Mode } from './const';
|
||||||
import StageCore from './StageCore';
|
import StageCore from './StageCore';
|
||||||
import type { Offset, Runtime, SortEventData, StageDragResizeConfig } from './types';
|
import type { Offset, SortEventData, StageDragResizeConfig } from './types';
|
||||||
import { getAbsolutePosition, getGuideLineFromCache, getMode, getOffset } from './util';
|
import { getAbsolutePosition, getGuideLineFromCache, getMode, getOffset } from './util';
|
||||||
|
|
||||||
/** 拖动状态 */
|
/** 拖动状态 */
|
||||||
@ -166,11 +166,38 @@ export default class StageDragResize extends EventEmitter {
|
|||||||
|
|
||||||
this.updateDragEl(el);
|
this.updateDragEl(el);
|
||||||
|
|
||||||
|
this.setElementGuidelines(el);
|
||||||
|
|
||||||
this.moveableOptions = this.getOptions({
|
this.moveableOptions = this.getOptions({
|
||||||
target: this.dragEl,
|
target: this.dragEl,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private setElementGuidelines(el: HTMLElement) {
|
||||||
|
const nodes = el.parentElement?.children || [];
|
||||||
|
|
||||||
|
this.elementGuidelines.forEach((node) => {
|
||||||
|
node.remove();
|
||||||
|
});
|
||||||
|
this.elementGuidelines = [];
|
||||||
|
|
||||||
|
if (this.mode === Mode.ABSOLUTE) {
|
||||||
|
const frame = document.createDocumentFragment();
|
||||||
|
|
||||||
|
for (const node of nodes) {
|
||||||
|
const { width, height } = node.getBoundingClientRect();
|
||||||
|
if (node === el) continue;
|
||||||
|
const { left, top } = getOffset(node as HTMLElement);
|
||||||
|
const elementGuideline = document.createElement('div');
|
||||||
|
elementGuideline.style.cssText = `position: absolute;width: ${width}px;height: ${height}px;top: ${top}px;left: ${left}px`;
|
||||||
|
this.elementGuidelines.push(elementGuideline);
|
||||||
|
frame.append(elementGuideline);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.container.append(frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private initMoveable() {
|
private initMoveable() {
|
||||||
this.moveable?.destroy();
|
this.moveable?.destroy();
|
||||||
|
|
||||||
@ -288,19 +315,6 @@ export default class StageDragResize extends EventEmitter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private getSnapElements(runtime: Runtime, el?: HTMLElement): HTMLElement[] {
|
|
||||||
const { renderer, mask } = this.core;
|
|
||||||
const getSnapElements =
|
|
||||||
runtime?.getSnapElements ||
|
|
||||||
(() => {
|
|
||||||
const doc = renderer.contentWindow?.document;
|
|
||||||
return doc ? Array.from(doc.querySelectorAll('[id]')) : [];
|
|
||||||
});
|
|
||||||
return getSnapElements(el).filter(
|
|
||||||
(element) => element !== this.target && !this.target?.contains(element) && element !== mask.page,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private sort(): void {
|
private sort(): void {
|
||||||
if (!this.target || !this.ghostEl) throw new Error('未知错误');
|
if (!this.target || !this.ghostEl) throw new Error('未知错误');
|
||||||
const { top } = this.ghostEl.getBoundingClientRect();
|
const { top } = this.ghostEl.getBoundingClientRect();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user