linkpi_firmware_history/rootfs/link/web/js/drag.js

165 lines
4.8 KiB
JavaScript
Raw Normal View History

2024-02-15 22:07:30 +01:00
class Draggable {
/**
*
* @param {*} elem -拖拽的元素
* @param {*} dragHandle -拖拽的手柄
* @param {*} resizeHandle -缩放的手柄
* @param {*} resizeHandle -是否按照像素定位(不是则为百分比)
* @param {*} dragFn - 拖拽完成后的回调
* @param {*} resizeFn - 缩放完成后的回调
*/
constructor(container, elem, dragHandle, resizeHandle, isPixel, dragFn, resizeFn) {
this.container = container;
this.elem = elem;
this.dragHandle = dragHandle;
this.resizeHandle = resizeHandle;
this.isPixel = isPixel;
this.dragFn = dragFn;
this.resizeFn = resizeFn;
this.dragMinWidth = 5; //最小宽度
this.dragMinHeight = 5; //最大宽度
this.init();
this.drag();
this.resize();
}
init() {
if (getStyle(this.container, "position") === "") {
this.container.style.position = "relative";
}
if (getStyle(this.elem, "position") === "") {
this.elem.style.position = "absolute";
}
}
drag() {
if(this.dragHandle === null || this.dragHandle === undefined)
return;
let disX = 0;
let disY = 0;
let realL = "";
let realT = "";
this.dragHandle = this.dragHandle || this.elem;
this.dragHandle.style.cursor = "move";
this.dragHandle.onmousedown = event => {
var event = event || window.event;
disX = event.clientX - this.elem.offsetLeft;
disY = event.clientY - this.elem.offsetTop;
document.onmousemove = event => {
var event = event || window.event;
let iL = event.clientX - disX;
let iT = event.clientY - disY;
let maxL = this.elem.parentNode.clientWidth - this.elem.offsetWidth;
let maxT = this.elem.parentNode.clientHeight - this.elem.offsetHeight;
iL <= 0 && (iL = 0);
iT <= 0 && (iT = 0);
iL >= maxL && (iL = maxL);
iT >= maxT && (iT = maxT);
// this.elem.style.left = iL + "px";
// this.elem.style.top = iT + "px";
if (this.isPixel) {
//按像素
realL = iL + "px";
realT = iT + "px";
} else {
//按百分比
realL = (iL / this.elem.parentNode.clientWidth) * 100 + "%";
realT = (iT / this.elem.parentNode.clientHeight) * 100 + "%";
}
this.elem.style.left = realL;
this.elem.style.top = realT;
return false
};
document.onmouseup = () => {
document.onmousemove = null;
document.onmouseup = null;
this.releaseCapture && this.releaseCapture()
if (this.dragFn) {
this.dragFn({
left: realL,
top: realT
});
}
};
this.setCapture && this.setCapture();
return false
};
}
resize() {
if(this.resizeHandle === null || this.resizeHandle === undefined)
return;
this.resizeHandle.onmousedown = event => {
var event = event || window.event;
let disX = event.clientX - this.resizeHandle.offsetLeft;
let disY = event.clientY - this.resizeHandle.offsetTop;
let iW = 0;
let iH = 0;
let realW = "";
let realH = "";
document.onmousemove = event => {
var event = event || window.event;
let iL = event.clientX - disX;
let iT = event.clientY - disY;
let maxW = this.elem.parentNode.clientWidth - this.elem.offsetLeft;
let maxH = this.elem.parentNode.clientHeight - this.elem.offsetTop;
iW = this.resizeHandle.offsetWidth + iL;
iH = this.resizeHandle.offsetHeight + iT;
// 宽
iW < this.dragMinWidth && (iW = this.dragMinWidth);
iW > maxW && (iW = maxW);
// lockX || (this.elem.style.width = iW + "px");
if (this.isPixel) {
realW = iW + "px";
} else {
realW = (iW / this.elem.parentNode.clientWidth) * 100 + "%";
}
this.elem.style.width = realW;
// 高
iH < this.dragMinHeight && (iH = this.dragMinHeight);
iH > maxH && (iH = maxH);
// lockY || (this.elem.style.height = iH + "px");
if (this.isPixel) {
realH = iH + "px"
} else {
realH = (iH / this.elem.parentNode.clientHeight) * 100 + "%"
}
this.elem.style.height = realH;
if ((iW == this.dragMinWidth) || (iH == this.dragMinHeight)) document.onmousemove = null;
return false;
};
document.onmouseup = () => {
document.onmousemove = null;
document.onmouseup = null;
if (this.resizeFn) {
this.resizeFn({
width: realW,
height: realH
});
}
};
return false;
}
}
}
function getStyle(obj, attr) {
const style = obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj, false)[attr];
if (!style || style === "static") {
return "";
}
return style;
}