UNPKG

vue3-draggable-resizable

Version:

[Vue3 Component] 拖拽缩放并具有自动吸附对齐、参考线等功能

93 lines (84 loc) 2.6 kB
import { ContainerProvider, ParentSize, ReferenceLineMap, ResizingHandle } from './types' import { ALL_HANDLES } from './Vue3DraggableResizable' export const IDENTITY = Symbol('Vue3DraggableResizable') export function getElSize(el: Element) { const style = window.getComputedStyle(el) return { width: parseFloat(style.getPropertyValue('width')), height: parseFloat(style.getPropertyValue('height')) } } function createEventListenerFunction( type: 'addEventListener' | 'removeEventListener' ) { return <K extends keyof HTMLElementEventMap>( el: HTMLElement, events: K | K[], handler: any ) => { if (!el) { return } if (typeof events === 'string') { events = [events] } events.forEach((e) => el[type](e, handler, { passive: false })) } } export const addEvent = createEventListenerFunction('addEventListener') export const removeEvent = createEventListenerFunction('removeEventListener') export function filterHandles(handles: ResizingHandle[]) { if (handles && handles.length > 0) { const result: ResizingHandle[] = [] handles.forEach((item) => { if (ALL_HANDLES.includes(item) && !result.includes(item)) { result.push(item) } }) return result } else { return [] } } export function getId() { return String(Math.random()).substr(2) + String(Date.now()) } export function getReferenceLineMap( containerProvider: ContainerProvider, parentSize: ParentSize, id?: string ) { if (containerProvider.disabled.value) { return null } const referenceLine = { row: [] as number[], col: [] as number[] } const { parentWidth, parentHeight } = parentSize referenceLine.row.push(...containerProvider.adsorbRows) referenceLine.col.push(...containerProvider.adsorbCols) if (containerProvider.adsorbParent.value) { referenceLine.row.push(0, parentHeight.value, parentHeight.value / 2) referenceLine.col.push(0, parentWidth.value, parentWidth.value / 2) } const widgetPositionStore = containerProvider.getPositionStore(id) Object.values(widgetPositionStore).forEach(({ x, y, w, h }) => { referenceLine.row.push(y, y + h, y + h / 2) referenceLine.col.push(x, x + w, x + w / 2) }) const referenceLineMap: ReferenceLineMap = { row: referenceLine.row.reduce((pre, cur) => { return { ...pre, [cur]: { min: cur - 5, max: cur + 5, value: cur } } }, {}), col: referenceLine.col.reduce((pre, cur) => { return { ...pre, [cur]: { min: cur - 5, max: cur + 5, value: cur } } }, {}) } return referenceLineMap }