import _ from 'lodash';
|
import { ref } from 'vue';
|
|
export type UseDragSideOption = {
|
maxWidth: number;
|
minWidth: number;
|
defaultWidth: number;
|
};
|
|
export const useDragSidebar = (option?: Partial<UseDragSideOption>,cb?:Function) => {
|
const { maxWidth, minWidth, defaultWidth } = _.defaults(option, {
|
maxWidth: Infinity,
|
minWidth: 120,
|
defaultWidth: 300,
|
} as UseDragSideOption);
|
const resizeRef = ref<HTMLDivElement>(null);
|
const draggableWidth = ref(defaultWidth);
|
|
const dragControllerDiv = () => {
|
const resize = resizeRef.value;
|
resize.onmousedown = function (e) {
|
// 颜色改变提醒
|
resize.style.background = '#818181';
|
let startX = e.clientX;
|
(resize as any).left = resize.offsetLeft;
|
document.onmousemove = function (e) {
|
// 计算并应用位移量
|
const endX = e.clientX;
|
const moveLen = endX - startX;
|
startX = endX;
|
if ((draggableWidth.value > maxWidth && moveLen < 0) || (draggableWidth.value < minWidth && moveLen > 0)) {
|
return;
|
}
|
cb?.();
|
draggableWidth.value -= moveLen;
|
};
|
document.onmouseup = function () {
|
// 颜色恢复
|
resize.style.background = '';
|
document.onmousemove = null;
|
document.onmouseup = null;
|
};
|
return false;
|
};
|
};
|
|
return {
|
dragControllerDiv,
|
resizeRef,
|
draggableWidth,
|
};
|
};
|