import { toNumber } from './tool' interface Position { x: number y: number } interface RegisterMoveablePanelOptions { wrapEl?: HTMLElement onmousedown?(position: Position, event: MouseEvent): void onmousemove?(position: Position, event: MouseEvent): void onmouseup?(position: Position, event: MouseEvent): void } export const registerMoveableElement = (el: HTMLElement, { onmousedown, onmousemove, onmouseup }: RegisterMoveablePanelOptions = {}) => { let elRect = el.getBoundingClientRect() const position = { x: 0, y: 0 } const update = (event: MouseEvent) => { let dx = event.pageX - elRect.x let dy = event.pageY - elRect.y if (dx < 0) dx = 0 if (dx > elRect.width) dx = elRect.width if (dy < 0) dy = 0 if (dy > elRect.height) dy = elRect.height position.x = toNumber(dx / elRect.width, { decimal: 2 }) position.y = toNumber(dy / elRect.height, { decimal: 2 }) } const _onmousemove = (event: MouseEvent) => { update(event) if (onmousemove) { onmousemove(position, event) } } const _onmouseup = (event: MouseEvent) => { document.removeEventListener('mousemove', _onmousemove) document.removeEventListener('mouseup', _onmouseup) if (onmouseup) { onmouseup(position, event) } } const _onmousedown = (event: MouseEvent) => { // elRect 可能不准确,这里更新一下 elRect = el.getBoundingClientRect() update(event) document.addEventListener('mousemove', _onmousemove) document.addEventListener('mouseup', _onmouseup) if (onmousedown) { onmousedown(position, event) } } el.addEventListener('mousedown', _onmousedown) return { destroy() { el.removeEventListener('mousedown', _onmousedown) }, } }