|
@@ -0,0 +1,178 @@
|
|
|
+import { ref } from 'vue'
|
|
|
+
|
|
|
+export const useResize = (props?: {
|
|
|
+ minHeightPx?: number
|
|
|
+ minWidthPx?: number
|
|
|
+ initHeight?: number
|
|
|
+ initWidth?: number
|
|
|
+}) => {
|
|
|
+ const {
|
|
|
+ minHeightPx = 400,
|
|
|
+ minWidthPx = window.innerWidth / 2,
|
|
|
+ initHeight = 400,
|
|
|
+ initWidth = window.innerWidth / 2
|
|
|
+ } = props || {}
|
|
|
+ // 屏幕宽度的 50% 作为最小宽度
|
|
|
+ // const minWidthPx = window.innerWidth / 2
|
|
|
+ // 固定的最小高度 400px
|
|
|
+ // const minHeightPx = 400
|
|
|
+ // 初始高度限制为 400px
|
|
|
+ const maxHeight = ref(initHeight + 'px')
|
|
|
+ // 初始宽度限制为 50%
|
|
|
+ const minWidth = ref(initWidth + 'px')
|
|
|
+ const setupDrag = (elDialog: any, el: any) => {
|
|
|
+ // 获取对话框元素
|
|
|
+ // 是否正在调整大小的标志
|
|
|
+ let isResizing = false
|
|
|
+ // 当前调整的方向
|
|
|
+ let currentResizeDirection = ''
|
|
|
+
|
|
|
+ // 鼠标移动时的事件处理器,用于检测鼠标位置并设置相应的光标样式
|
|
|
+ const handleMouseMove = (e: any) => {
|
|
|
+ const rect = elDialog.getBoundingClientRect()
|
|
|
+ // 鼠标相对于对话框左侧的偏移量
|
|
|
+ const offsetX = e.clientX - rect.left
|
|
|
+ // 鼠标相对于对话框顶部的偏移量
|
|
|
+ const offsetY = e.clientY - rect.top
|
|
|
+ const width = elDialog.clientWidth
|
|
|
+ const height = elDialog.clientHeight
|
|
|
+
|
|
|
+ // 获取对话框的内边距
|
|
|
+ const computedStyle = window.getComputedStyle(elDialog)
|
|
|
+ const paddingLeft = parseFloat(computedStyle.paddingLeft)
|
|
|
+ const paddingRight = parseFloat(computedStyle.paddingRight)
|
|
|
+ const paddingBottom = parseFloat(computedStyle.paddingBottom)
|
|
|
+ const paddingTop = parseFloat(computedStyle.paddingTop)
|
|
|
+
|
|
|
+ // 根据鼠标位置设置相应的光标样式和调整方向
|
|
|
+ if (!isResizing) {
|
|
|
+ if (offsetX < paddingLeft && offsetY > paddingTop && offsetY < height - paddingBottom) {
|
|
|
+ elDialog.style.cursor = 'ew-resize' // 左右箭头
|
|
|
+ currentResizeDirection = 'left'
|
|
|
+ } else if (
|
|
|
+ offsetX > width - paddingRight &&
|
|
|
+ offsetY > paddingTop &&
|
|
|
+ offsetY < height - paddingBottom
|
|
|
+ ) {
|
|
|
+ elDialog.style.cursor = 'ew-resize' // 左右箭头
|
|
|
+ currentResizeDirection = 'right'
|
|
|
+ } else if (
|
|
|
+ offsetY < paddingTop &&
|
|
|
+ offsetX > paddingLeft &&
|
|
|
+ offsetX < width - paddingRight
|
|
|
+ ) {
|
|
|
+ elDialog.style.cursor = 'ns-resize' // 上下箭头
|
|
|
+ currentResizeDirection = 'top'
|
|
|
+ } else if (
|
|
|
+ offsetY > height - paddingBottom &&
|
|
|
+ offsetX > paddingLeft &&
|
|
|
+ offsetX < width - paddingRight
|
|
|
+ ) {
|
|
|
+ elDialog.style.cursor = 'ns-resize' // 上下箭头
|
|
|
+ currentResizeDirection = 'bottom'
|
|
|
+ } else if (offsetX < paddingLeft && offsetY < paddingTop) {
|
|
|
+ elDialog.style.cursor = 'nwse-resize' // 左上右下箭头
|
|
|
+ currentResizeDirection = 'top-left'
|
|
|
+ } else if (offsetX > width - paddingRight && offsetY < paddingTop) {
|
|
|
+ elDialog.style.cursor = 'nesw-resize' // 右上左下箭头
|
|
|
+ currentResizeDirection = 'top-right'
|
|
|
+ } else if (offsetX < paddingLeft && offsetY > height - paddingBottom) {
|
|
|
+ elDialog.style.cursor = 'nesw-resize' // 右上左下箭头
|
|
|
+ currentResizeDirection = 'bottom-left'
|
|
|
+ } else if (offsetX > width - paddingRight && offsetY > height - paddingBottom) {
|
|
|
+ elDialog.style.cursor = 'nwse-resize' // 左上右下箭头
|
|
|
+ currentResizeDirection = 'bottom-right'
|
|
|
+ } else {
|
|
|
+ elDialog.style.cursor = 'default'
|
|
|
+ currentResizeDirection = ''
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 鼠标按下时的事件处理器,开始调整对话框大小
|
|
|
+ const handleMouseDown = (e) => {
|
|
|
+ if (currentResizeDirection) {
|
|
|
+ isResizing = true
|
|
|
+
|
|
|
+ const initialX = e.clientX
|
|
|
+ const initialY = e.clientY
|
|
|
+ const initialWidth = elDialog.clientWidth
|
|
|
+ const initialHeight = el.querySelector('.el-dialog__body').clientHeight
|
|
|
+
|
|
|
+ // 调整大小的事件处理器
|
|
|
+ const handleResizing = (e: any) => {
|
|
|
+ if (!isResizing) return
|
|
|
+
|
|
|
+ let newWidth = initialWidth
|
|
|
+ let newHeight = initialHeight
|
|
|
+
|
|
|
+ // 根据当前调整方向计算新的宽度和高度
|
|
|
+ if (currentResizeDirection.includes('right')) {
|
|
|
+ newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
|
|
|
+ minWidth.value = `${newWidth}px`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentResizeDirection.includes('left')) {
|
|
|
+ newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
|
|
|
+ minWidth.value = `${newWidth}px`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentResizeDirection.includes('bottom')) {
|
|
|
+ newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
|
|
|
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentResizeDirection.includes('top')) {
|
|
|
+ newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
|
|
|
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentResizeDirection === 'top-left') {
|
|
|
+ newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
|
|
|
+ minWidth.value = `${newWidth}px`
|
|
|
+ newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
|
|
|
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentResizeDirection === 'top-right') {
|
|
|
+ newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
|
|
|
+ minWidth.value = `${newWidth}px`
|
|
|
+ newHeight = Math.max(minHeightPx, initialHeight - (e.clientY - initialY) * 2 - 20)
|
|
|
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentResizeDirection === 'bottom-left') {
|
|
|
+ newWidth = Math.max(minWidthPx, initialWidth - (e.clientX - initialX) * 2)
|
|
|
+ minWidth.value = `${newWidth}px`
|
|
|
+ newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
|
|
|
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
|
|
|
+ }
|
|
|
+
|
|
|
+ if (currentResizeDirection === 'bottom-right') {
|
|
|
+ newWidth = Math.max(minWidthPx, initialWidth + (e.clientX - initialX) * 2)
|
|
|
+ minWidth.value = `${newWidth}px`
|
|
|
+ newHeight = Math.max(minHeightPx, initialHeight + (e.clientY - initialY) * 2 - 20)
|
|
|
+ maxHeight.value = `${Math.min(newHeight, window.innerHeight - 165)}px`
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 停止调整大小的事件处理器
|
|
|
+ const stopResizing = () => {
|
|
|
+ isResizing = false
|
|
|
+ document.removeEventListener('mousemove', handleResizing)
|
|
|
+ document.removeEventListener('mouseup', stopResizing)
|
|
|
+ }
|
|
|
+
|
|
|
+ document.addEventListener('mousemove', handleResizing)
|
|
|
+ document.addEventListener('mouseup', stopResizing)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ elDialog.addEventListener('mousemove', handleMouseMove)
|
|
|
+ elDialog.addEventListener('mousedown', handleMouseDown)
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ setupDrag,
|
|
|
+ maxHeight,
|
|
|
+ minWidth
|
|
|
+ }
|
|
|
+}
|