diff --git a/packages/editor/src/type.ts b/packages/editor/src/type.ts index b09d77ca..170b963a 100644 --- a/packages/editor/src/type.ts +++ b/packages/editor/src/type.ts @@ -135,6 +135,14 @@ export interface AddMNode { export interface PastePosition { left?: number; top?: number; + /** + * 粘贴位置X方向偏移量 + */ + offsetX?: number; + /** + * 粘贴位置Y方向偏移量 + */ + offsetY?: number; } /** diff --git a/packages/editor/src/utils/operator.ts b/packages/editor/src/utils/operator.ts index 420cdd4c..ab537240 100644 --- a/packages/editor/src/utils/operator.ts +++ b/packages/editor/src/utils/operator.ts @@ -25,7 +25,10 @@ export const beforePaste = async (position: PastePosition, config: MNode[]) => { // 坐标校准后的粘贴数据 const pasteConfigs: MNode[] = await Promise.all( config.map(async (configItem: MNode): Promise => { - let pastePosition = position; + // 解构 position 对象,从 position 删除 offsetX、offsetY字段 + const { offsetX = 0, offsetY = 0, ...positionClone } = position; + let pastePosition = positionClone; + if (!isEmpty(pastePosition) && curNode.items) { // 如果没有传入粘贴坐标则可能为键盘操作,不再转换 // 如果粘贴时选中了容器,则将元素粘贴到容器内,坐标需要转换为相对于容器的坐标 @@ -41,7 +44,17 @@ export const beforePaste = async (position: PastePosition, config: MNode[]) => { } const pasteConfig = await propsService.setNewItemId(configItem, editorService.get('root')); + if (pasteConfig.style) { + const { left, top } = pasteConfig.style; + // 判断能转换为数字时,做粘贴偏移量计算 + if (typeof left === 'number' || (!!left && !isNaN(Number(left)))) { + pasteConfig.style.left = Number(left) + offsetX; + } + if (typeof top === 'number' || (!!top && !isNaN(Number(top)))) { + pasteConfig.style.top = Number(top) + offsetY; + } + pasteConfig.style = { ...pasteConfig.style, ...pastePosition,