feat: upgrade hooks type

This commit is contained in:
IchliebedichZhu 2024-03-01 21:26:33 +00:00
parent f11a4c5090
commit 0d59f5c58f

View File

@ -5,17 +5,34 @@
* @LastEditors: ShawnPhang <https://m.palxp.cn> * @LastEditors: ShawnPhang <https://m.palxp.cn>
* @LastEditTime: 2023-11-22 18:11:15 * @LastEditTime: 2023-11-22 18:11:15
*/ */
import store from '@/store' import store from '@/store'
export default class dragHelper {
private cloneEl: any = null type TInitial = {
offsetX: number
offsetY: number
pageX: number
pageY: number
width: number
height: number
finallySize: number
flag: number
x: number
y: number
}
type TQueueFunction = () => void
export default class DragHelper {
private cloneEl?: HTMLElement | null
private dragging: boolean = false private dragging: boolean = false
private initial: any = {} private initial: Partial<TInitial> = {}
private queue: any = [] private queue: TQueueFunction[] = []
constructor() { constructor() {
window.addEventListener('mousemove', (e) => { window.addEventListener('mousemove', (e) => {
if (this.dragging && this.cloneEl) { if (this.dragging && this.cloneEl) {
const { offsetX, offsetY, width, height } = this.initial const { width, height } = this.initial as TInitial
// this.moveFlutter(e.pageX - offsetX, e.pageY - offsetY, this.distance(e)) // this.moveFlutter(e.pageX - offsetX, e.pageY - offsetY, this.distance(e))
this.moveFlutter(e.pageX - width / 2, e.pageY - height / 2, this.distance(e)) this.moveFlutter(e.pageX - width / 2, e.pageY - height / 2, this.distance(e))
} else { } else {
@ -23,10 +40,18 @@ export default class dragHelper {
} }
}) })
// 鼠标抬起 // 鼠标抬起
window.addEventListener('mouseup', (e: any) => { window.addEventListener('mouseup', (e) => {
;(window as any).document.getElementById('app').classList.remove('drag_active') const el = window.document.getElementById('app')
const cl = e.target.classList if (!el || !e.target) return
if (e.target?.id === 'page-design-canvas' || cl.contains('target') || cl.contains('drop__mask') || cl.contains('edit-text')) { el.classList.remove('drag_active')
const target = e.target as HTMLElement
const cl = target.classList
if (
target.id === 'page-design-canvas' ||
cl.contains('target') ||
cl.contains('drop__mask') ||
cl.contains('edit-text')
) {
setTimeout(() => { setTimeout(() => {
this.finish(true) this.finish(true)
}, 10) }, 10)
@ -44,29 +69,39 @@ export default class dragHelper {
/** /**
* mousedown * mousedown
*/ */
public start(e: any, finallySize: any) { public start(e: MouseEvent, finallySize: number) {
if (!this.cloneEl) { if (!this.cloneEl) {
store.commit('setDraging', true) store.commit('setDraging', true)
;(window as any).document.getElementById('app').classList.add('drag_active') // 整个鼠标全局变成抓取 const app = window.document.getElementById('app')
if (!app || !e) return
app.classList.add('drag_active') // 整个鼠标全局变成抓取
const target = e.target as HTMLElement
// 选中了元素 // 选中了元素
this.cloneEl = e.target.cloneNode(true) this.cloneEl = (target.cloneNode(true) as HTMLElement)
this.cloneEl.classList.add('flutter') this.cloneEl.classList.add('flutter')
// 初始化数据 // 初始化数据
this.init(e, e.target, finallySize || e.target.offsetWidth, Math.random()) this.init(e, target, finallySize || target.offsetWidth, Math.random())
// 加载原图 // 加载原图
// simulate(cloneEl.src, initial.flag) // simulate(cloneEl.src, initial.flag)
this.cloneEl.style.width = e.target.offsetWidth this.cloneEl.style.width = `${target.offsetWidth}`
// e.target.parentElement.parentElement.appendChild(this.cloneEl) // e.target.parentElement.parentElement.appendChild(this.cloneEl)
;(window as any).document.getElementById('widget-panel').appendChild(this.cloneEl) const widgetPanel = window.document.getElementById('widget-panel')
if (!widgetPanel) return
widgetPanel.appendChild(this.cloneEl)
this.dragging = true this.dragging = true
e.target.classList.add('hide') // 放在最后 target.classList.add('hide') // 放在最后
this.queue.push(() => { this.queue.push(() => {
e.target.classList.remove('hide') target.classList.remove('hide')
}) })
} }
} }
// 开始拖动初始化 // 开始拖动初始化
private init({ offsetX, offsetY, pageX, pageY, x, y }: any, { offsetWidth: width, offsetHeight: height }: any, finallySize: number, flag: any) { private init(
{ offsetX, offsetY, pageX, pageY, x, y }: MouseEvent,
{ offsetWidth: width, offsetHeight: height }: HTMLElement,
finallySize: number,
flag: number
) {
this.initial = { offsetX, offsetY, pageX, pageY, width, height, finallySize, flag, x, y } this.initial = { offsetX, offsetY, pageX, pageY, width, height, finallySize, flag, x, y }
// store.commit('setDragInitData', { offsetX: 0, offsetY: 0 }) // store.commit('setDragInitData', { offsetX: 0, offsetY: 0 })
this.moveFlutter(pageX - offsetX, pageY - offsetY, 0, 0.3) this.moveFlutter(pageX - offsetX, pageY - offsetY, 0, 0.3)
@ -76,17 +111,20 @@ export default class dragHelper {
} }
// 改变漂浮元素(合并多个操作) // 改变漂浮元素(合并多个操作)
private moveFlutter(x: number, y: number, d = 0, lazy = 0) { private moveFlutter(x: number, y: number, d = 0, lazy = 0) {
const { width, height, finallySize } = this.initial const { width, height, finallySize } = this.initial as TInitial
let scale: any = null let scale: string | null = null
if (width > finallySize) { if (!d) {
scale = d ? (width - d >= finallySize ? `transform: scale(${(width - d) / width});` : null) : null if (width > finallySize) {
} else scale = d ? (width + d <= finallySize ? `transform: scale(${(width + d) / width})` : null) : null scale = width - d >= finallySize ? `transform: scale(${(width - d) / width});` : null
} else scale = width + d <= finallySize ? `transform: scale(${(width + d) / width})` : null
}
const options = [`left: ${x}px`, `top: ${y}px`, `width: ${width}px`, `height: ${height}px`] const options = [`left: ${x}px`, `top: ${y}px`, `width: ${width}px`, `height: ${height}px`]
scale && options.push(scale) scale && options.push(scale)
options.push(`transition: all ${lazy}s`) options.push(`transition: all ${lazy}s`)
this.changeStyle(options) this.changeStyle(options)
} }
private changeStyle(arr: any) { private changeStyle(arr: string[]) {
if (!this.cloneEl) return
const original = this.cloneEl.style.cssText.split(';') const original = this.cloneEl.style.cssText.split(';')
original.pop() original.pop()
this.cloneEl.style.cssText = original.concat(arr).join(';') + ';' this.cloneEl.style.cssText = original.concat(arr).join(';') + ';'
@ -103,12 +141,12 @@ export default class dragHelper {
return return
} }
if (!done) { if (!done) {
const { pageX, offsetX, pageY, offsetY } = this.initial const { pageX, offsetX, pageY, offsetY } = this.initial as TInitial
this.changeStyle([`left: ${pageX - offsetX}px`, `top: ${pageY - offsetY}px`, 'transform: scale(1)', 'transition: all 0.3s']) this.changeStyle([`left: ${pageX - offsetX}px`, `top: ${pageY - offsetY}px`, 'transform: scale(1)', 'transition: all 0.3s'])
} }
setTimeout( setTimeout(
() => { () => {
this.queue.length && this.queue.shift()() this.queue.length && (this.queue.shift() as TQueueFunction)()
this.cloneEl && this.cloneEl.remove() this.cloneEl && this.cloneEl.remove()
this.cloneEl = null this.cloneEl = null
}, },
@ -116,8 +154,8 @@ export default class dragHelper {
) )
} }
// 计算两点之间距离 // 计算两点之间距离
private distance({ pageX, pageY }: any) { private distance({ pageX, pageY }: { pageX: number, pageY: number }) {
const { pageX: x, pageY: y } = this.initial const { pageX: x, pageY: y } = this.initial as TInitial
return Math.hypot(pageX - x, pageY - y) return Math.hypot(pageX - x, pageY - y)
} }
} }