mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-09-21 22:39:58 +08:00
refactor(stage): 优化拖动体验
This commit is contained in:
parent
3dab16b2f6
commit
bfdd813531
28
package-lock.json
generated
28
package-lock.json
generated
@ -15678,6 +15678,15 @@
|
|||||||
"react-simple-compat": "^1.2.1"
|
"react-simple-compat": "^1.2.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"moveable-helper": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/moveable-helper/-/moveable-helper-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-t1FK9PO187Gn0N6GVZcrQgePjiHmuj8eUhmJjH38LvTMnVVxiHzWYRx6ARFZvSFIIW4yb6BEAv4C99Bsx84nFw==",
|
||||||
|
"requires": {
|
||||||
|
"@daybrush/utils": "^1.0.0",
|
||||||
|
"scenejs": "^1.4.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
@ -16420,6 +16429,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"order-map": {
|
||||||
|
"version": "0.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/order-map/-/order-map-0.2.2.tgz",
|
||||||
|
"integrity": "sha512-X//Db/lT11tdxxutWQfE+bmbTyieDJWrr/vSiwBwOf8RRw9yAgF7gqn1ihFmfX2E7l7gcPcucep3aWFjo5FpoA==",
|
||||||
|
"requires": {
|
||||||
|
"@daybrush/utils": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"os-browserify": {
|
"os-browserify": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
|
||||||
@ -18067,6 +18084,17 @@
|
|||||||
"xmlchars": "^2.1.1"
|
"xmlchars": "^2.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"scenejs": {
|
||||||
|
"version": "1.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/scenejs/-/scenejs-1.5.0.tgz",
|
||||||
|
"integrity": "sha512-Xo6LjUsaVcTbC+FGMMwUH1jthAQUj6bq2i55iEBBifrBn/nzm/++dGo8tqjCzMbm6KUPOpiry38N7r9QY2mWpQ==",
|
||||||
|
"requires": {
|
||||||
|
"@daybrush/utils": "^1.3.1",
|
||||||
|
"@scena/event-emitter": "^1.0.3",
|
||||||
|
"css-styled": "^1.0.0",
|
||||||
|
"order-map": "^0.2.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"schema-utils": {
|
"schema-utils": {
|
||||||
"version": "2.7.1",
|
"version": "2.7.1",
|
||||||
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
|
||||||
|
@ -27,7 +27,8 @@
|
|||||||
"@tmagic/utils": "^1.0.0-beta.8",
|
"@tmagic/utils": "^1.0.0-beta.8",
|
||||||
"events": "^3.3.0",
|
"events": "^3.3.0",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"moveable": "^0.28.0"
|
"moveable": "^0.28.0",
|
||||||
|
"moveable-helper": "^0.4.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/events": "^3.0.0",
|
"@types/events": "^3.0.0",
|
||||||
|
@ -21,6 +21,7 @@ import { EventEmitter } from 'events';
|
|||||||
|
|
||||||
import type { MoveableOptions } from 'moveable';
|
import type { MoveableOptions } from 'moveable';
|
||||||
import Moveable from 'moveable';
|
import Moveable from 'moveable';
|
||||||
|
import MoveableHelper from 'moveable-helper';
|
||||||
|
|
||||||
import { GHOST_EL_ID_PREFIX, GuidesType, Mode } from './const';
|
import { GHOST_EL_ID_PREFIX, GuidesType, Mode } from './const';
|
||||||
import StageCore from './StageCore';
|
import StageCore from './StageCore';
|
||||||
@ -49,6 +50,7 @@ export default class StageDragResize extends EventEmitter {
|
|||||||
private dragStatus: ActionStatus = ActionStatus.END;
|
private dragStatus: ActionStatus = ActionStatus.END;
|
||||||
private ghostEl: HTMLElement | undefined;
|
private ghostEl: HTMLElement | undefined;
|
||||||
private mode: Mode = Mode.ABSOLUTE;
|
private mode: Mode = Mode.ABSOLUTE;
|
||||||
|
private moveableHelper?: MoveableHelper;
|
||||||
|
|
||||||
constructor(config: StageDragResizeConfig) {
|
constructor(config: StageDragResizeConfig) {
|
||||||
super();
|
super();
|
||||||
@ -79,6 +81,12 @@ export default class StageDragResize extends EventEmitter {
|
|||||||
target: this.dragEl || this.target,
|
target: this.dragEl || this.target,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.moveableHelper = MoveableHelper.create({
|
||||||
|
useBeforeRender: true,
|
||||||
|
useRender: false,
|
||||||
|
createAuto: true,
|
||||||
|
});
|
||||||
|
|
||||||
this.initMoveable();
|
this.initMoveable();
|
||||||
|
|
||||||
if (event) {
|
if (event) {
|
||||||
@ -188,34 +196,42 @@ export default class StageDragResize extends EventEmitter {
|
|||||||
private bindDragEvent(): void {
|
private bindDragEvent(): void {
|
||||||
if (!this.moveable) throw new Error('moveable 为初始化');
|
if (!this.moveable) throw new Error('moveable 为初始化');
|
||||||
|
|
||||||
|
let offset = {
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
};
|
||||||
|
|
||||||
this.moveable
|
this.moveable
|
||||||
.on('dragStart', () => {
|
.on('dragStart', (e) => {
|
||||||
if (!this.target) throw new Error('未选中组件');
|
if (!this.target) throw new Error('未选中组件');
|
||||||
|
|
||||||
this.dragStatus = ActionStatus.START;
|
this.dragStatus = ActionStatus.START;
|
||||||
|
|
||||||
|
this.moveableHelper?.onDragStart(e);
|
||||||
|
|
||||||
|
offset = getAbsolutePosition(this.target, { left: 0, top: 0 });
|
||||||
|
|
||||||
if (this.mode === Mode.SORTABLE) {
|
if (this.mode === Mode.SORTABLE) {
|
||||||
this.ghostEl = this.generateGhostEl(this.target);
|
this.ghostEl = this.generateGhostEl(this.target);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.on('drag', ({ left, top }) => {
|
.on('drag', (e) => {
|
||||||
if (!this.target || !this.dragEl) return;
|
if (!this.target || !this.dragEl) return;
|
||||||
this.dragStatus = ActionStatus.ING;
|
this.dragStatus = ActionStatus.ING;
|
||||||
|
|
||||||
const offset = getAbsolutePosition(this.target, { left, top });
|
const { left, top } = e;
|
||||||
|
|
||||||
// 流式布局
|
// 流式布局
|
||||||
if (this.ghostEl) {
|
if (this.ghostEl) {
|
||||||
this.dragEl.style.top = `${top}px`;
|
this.dragEl.style.top = `${top}px`;
|
||||||
this.ghostEl.style.top = `${offset.top}px`;
|
this.ghostEl.style.top = `${top + offset.top}px`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.dragEl.style.left = `${left}px`;
|
this.moveableHelper?.onDrag(e);
|
||||||
this.dragEl.style.top = `${top}px`;
|
|
||||||
|
|
||||||
this.target.style.left = `${offset.left}px`;
|
this.target.style.left = `${left + offset.left}px`;
|
||||||
this.target.style.top = `${offset.top}px`;
|
this.target.style.top = `${top + offset.top}px`;
|
||||||
})
|
})
|
||||||
.on('dragEnd', () => {
|
.on('dragEnd', () => {
|
||||||
// 点击不拖动时会触发dragStart和dragEnd,但是不会有drag事件
|
// 点击不拖动时会触发dragStart和dragEnd,但是不会有drag事件
|
||||||
|
Loading…
x
Reference in New Issue
Block a user