UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 5.81 kB
{"version":3,"file":"draggable.mjs","sources":["../../../../src/_common/js/color-picker/draggable.ts"],"sourcesContent":["/* eslint-disable no-use-before-define */\nexport interface Coordinate {\n x: number;\n y: number;\n}\n\nexport type DraggableEvent = MouseEvent;\n\ninterface DraggableCallback {\n (coordinate: Coordinate, event?: DraggableEvent): void;\n}\n\nexport interface DraggableProps {\n start?: DraggableCallback;\n drag?: DraggableCallback;\n end?: DraggableCallback;\n}\n\ninterface DraggableHandles {\n start: (this: Draggable, event: DraggableEvent) => {};\n drag: (this: Draggable, event: DraggableEvent) => {};\n end: (this: Draggable, event: DraggableEvent) => {};\n}\n\n// 配置项\nconst defaultsOptions: DraggableProps = {\n start: (coordinate: Coordinate, event: DraggableEvent) => {},\n drag: (coordinate: Coordinate, event: DraggableEvent) => {},\n end: (coordinate: Coordinate, event: DraggableEvent) => {},\n};\n\nexport class Draggable {\n private dragging = false;\n\n private $el: HTMLElement;\n\n private props: DraggableProps;\n\n private handles: DraggableHandles;\n\n constructor(el: HTMLElement, options?: DraggableProps) {\n this.$el = el;\n this.props = { ...defaultsOptions, ...options };\n this.handles = {\n start: this.#dragStart.bind(this),\n drag: this.#drag.bind(this),\n end: this.#dragEnd.bind(this),\n };\n this.$el.addEventListener('mousedown', this.handles.start, false);\n }\n\n #dragStart(event: DraggableEvent) {\n if (this.dragging) {\n return;\n }\n // event.preventDefault();\n window.addEventListener('mousemove', this.handles.drag, false);\n window.addEventListener('mouseup', this.handles.end, false);\n window.addEventListener('contextmenu', this.handles.end, false);\n this.dragging = true;\n this.props.start(this.#getCoordinate(event), event);\n }\n\n #drag(event: DraggableEvent) {\n if (!this.dragging) {\n return;\n }\n this.props.drag(this.#getCoordinate(event), event);\n }\n\n #dragEnd(event: DraggableEvent) {\n setTimeout(() => {\n this.dragging = false;\n this.props.end(this.#getCoordinate(event), event);\n }, 0);\n window.removeEventListener('mousemove', this.handles.drag, false);\n window.removeEventListener('mouseup', this.handles.end, false);\n window.removeEventListener('contextmenu', this.handles.end, false);\n }\n\n #getCoordinate(event: DraggableEvent) {\n const rect = this.$el.getBoundingClientRect();\n const mouseEvent = event;\n const left = mouseEvent.clientX - rect.left;\n const top = mouseEvent.clientY - rect.top;\n return {\n y: Math.min(Math.max(0, top), rect.height),\n x: Math.min(Math.max(0, left), rect.width),\n };\n }\n\n destroy() {\n this.$el.removeEventListener('mousedown', this.handles.start, false);\n window.removeEventListener('mousemove', this.handles.drag, false);\n window.removeEventListener('mouseup', this.handles.end, false);\n window.removeEventListener('contextmenu', this.handles.end, false);\n }\n}\n\nexport default Draggable;\n"],"names":["end","_classCallCheck","_classPrivateMethodInitSpec","_defineProperty","_createClass","window","setTimeout","y","x"],"mappings":"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"}