/**
* 处理拖拽指令
* @param {HTMLElement} el 绑定拖拽指令的元素
* @param {Function} moveingCallback 拖拽中的回调
* @param {Function} moveEndCallback 拖拽结束后的回调
* @param {boolean} parent 是否是父元素实现拖拽
* @param {boolean} containment 限制拖拽区域为父元素。否则验证区域是window
*/
const handlerDragEvent = (el: HTMLElement, moveingCallback?: Function, moveEndCallback?: Function, parent?: boolean, containment?: boolean) => {
const mousedown = (e) => {
e.preventDefault();
const disx = e.pageX - (parent ? el.parentElement.offsetLeft : el.offsetLeft);
const disy = e.pageY - (parent ? el.parentElement.offsetTop : el.offsetTop);
const maxTop = containment ? (el.parentElement.offsetHeight - el.offsetHeight) : (window.innerHeight - el.offsetHeight);
const maxLeft = containment ? (el.parentElement.offsetWidth - el.offsetWidth) : (window.innerWidth - el.offsetWidth);
const mousemove = (event) => {
// 设置触发的是移动指令,控制不触发发点击事件
event.preventDefault();
let left = event.pageX - disx;
if (left < 0) left = 0;
if (left > maxLeft) left = maxLeft > 0 ? maxLeft : 0;
let top = event.pageY - disy;
if (top < 0) top = 0;
if (top > maxTop) top = maxTop > 0 ? maxTop : 0;
if (parent) {
el.parentElement.style.left = `${ left }px`;
el.parentElement.style.top = `${ top }px`;
} else {
el.style.left = `${ left }px`;
el.style.top = `${ top }px`;
}
if (moveingCallback) moveingCallback(left, top);
};
document.addEventListener('mousemove', mousemove);
const mouseup = (event) => {
event.preventDefault();
if (moveEndCallback) moveEndCallback();
document.removeEventListener('mousemove', mousemove);
document.removeEventListener('mouseup', mouseup);
};
document.addEventListener('mouseup', mouseup);
};
el.addEventListener('mousedown', mousedown);
};
export default handlerDragEvent;