This commit is contained in:
zuowei1216
2025-12-22 21:06:29 +08:00
parent 8ea58fe480
commit 1b19ff1b92
179 changed files with 21895 additions and 3774 deletions

View File

@@ -0,0 +1,174 @@
//引入操作dom元素的
import { insertBefore, insertAfter, getTop, getLeft, getPosition, setPosition } from './dom.js'
class Drap {
static status = {
downIndex: null,
upIndex: null,
node: null,
transparentNode: null,
time: null,
callback: null,
styleWidth: null,
styleHeight: null,
}
/**
* 鼠标松开
* @returns
*/
static onMouseUp() {
Drap.status.time && clearTimeout(Drap.status.time);
let obj = Object.assign({}, Drap.status); //浅复制一份
Drap.resetStatus(); //重置
if (obj.downIndex != null && obj.upIndex != null && obj.downIndex != obj.upIndex) {
Drap.status.callback && Drap.status.callback(obj);
Drap.status.callback = null;
}
document.removeEventListener('mouseup', DragFolder.onMouseUp);
document.removeEventListener('mousemove', DragFolder.onMouseMove);
return false;
}
/**
* 鼠标移动
* @param {*} e
*/
static onMouseMove(e) {
let res = getPosition(e);
setPosition(Drap.status.node, res.x, res.y);
}
/**
* 重置状态
* @returns
*/
static resetStatus() {
if (Drap.status.downIndex == null)
return;
Drap.status.downIndex = null;
Drap.status.upIndex = null;
Drap.status.upIndex = null;
Drap.status.time = null;
if (Drap.status.node != null) {
Drap.status.node.style.width = Drap.status.styleWidth;
Drap.status.node.style.height = Drap.status.styleHeight;
Drap.status.node.style.position = "static";
}
Drap.status.transparentNode && Drap.status.transparentNode.remove();
Drap.status.transparentNode = null;
}
constructor(el, option = {}) {
let config = {
direction: 'x', //默认配置 左右方向
callback: null,
}
Object.assign(config, option);
this.option = config;
this.el = el;
this.downTime = 300;
this.init();
}
/**
* 初始化
*/
init() {
// console.log(this.option);
this.el.onmousedown = (e) => {
this.onMouseDown(e)
return false
}
this.el.onmousemove = (e) => {
this.onMouseMove(e);
}
}
/**
* 鼠标按下事件
* @param {*} e
*/
onMouseDown(e) {
document.addEventListener('mouseup', Drap.onMouseUp);
Drap.status.time = setTimeout(() => {
Drap.status.downIndex = this.option.index;
Drap.status.node = this.el;
Drap.status.transparentNode = this.el.cloneNode(true); //克隆节点
Drap.status.callback = this.option.callback;
console.log(this.el.offsetWidth);
Drap.status.styleWidth = Drap.status.node.style.width;
Drap.status.styleHeight = Drap.status.node.style.height;
Drap.status.node.style.width = this.el.offsetWidth + "px";
Drap.status.node.style.height = this.el.offsetHeight + "px"
//处理节点显示
Drap.status.node.style.position = "fixed";
Drap.status.transparentNode.style.cssText += ";opacity: 0;"
insertBefore(Drap.status.transparentNode, this.el);
document.addEventListener('mousemove', Drap.onMouseMove);
}, this.downTime);
}
/**
* 鼠标移动事件
* @param {*} e
* @returns
*/
onMouseMove(e) {
if (Drap.status.downIndex == null)
return false;
let left = getLeft(this.el) + this.el.offsetWidth / 2;
let top = getTop(this.el) + this.el.offsetHeight / 2;
let obj = getPosition(e);
let min = Drap.status.downIndex < this.option.index;
//左右方向进行拖拽
Drap.status.upIndex = this.option.index;
if (this.option.direction == 'x') {
if (obj.x < left) {
// console.log('左边');
insertBefore(Drap.status.transparentNode, this.el)
} else {
// console.log('右边');
insertAfter(Drap.status.transparentNode, this.el)
Drap.status.upIndex += min ? 0 : 1; //按下大于松开的下标+1
}
return;
}
//上下方向拖拽
if (obj.y < top) {
// console.log('上边');
insertBefore(Drap.status.transparentNode, this.el);
} else {
// console.log('下边');
insertAfter(Drap.status.transparentNode, this.el);
Drap.status.upIndex += min ? 0 : 1; //按下大于松开的下标+1
}
}
}
//导出vue指令用到的对象
export const drag = {
mounted(el, binding) {
new Drap(el, binding.value || {})
}
}