zsqy-naive-ui/src/directives/draggable.ts

50 lines
1.5 KiB
TypeScript
Raw Normal View History

2024-01-05 17:28:54 +08:00
/*
1absoluterelative
2(onmousedown) left top
3(onmousemove) left top
4(onmouseup)
使 Dom v-draggable
<div class="dialog-model" v-draggable></div>
*/
import type { Directive } from 'vue';
2024-01-05 17:28:54 +08:00
interface ElType extends HTMLElement {
parentNode: any;
}
const draggable: Directive = {
mounted: function (el: ElType) {
el.style.cursor = 'move';
el.style.position = 'absolute';
2024-01-05 17:28:54 +08:00
el.onmousedown = function (e) {
const disX = e.pageX - el.offsetLeft;
const disY = e.pageY - el.offsetTop;
document.onmousemove = function (e) {
let x = e.pageX - disX;
let y = e.pageY - disY;
const maxX = el.parentNode.offsetWidth - el.offsetWidth;
const maxY = el.parentNode.offsetHeight - el.offsetHeight;
if (x < 0) {
x = 0;
} else if (x > maxX) {
x = maxX;
}
if (y < 0) {
y = 0;
} else if (y > maxY) {
y = maxY;
}
el.style.left = x + 'px';
el.style.top = y + 'px';
2024-01-05 17:28:54 +08:00
};
document.onmouseup = function () {
document.onmousemove = document.onmouseup = null;
};
};
},
};
export default draggable;