所有代码
function elementDrag(element, clickFn) {
if (element) return console.error("元素拖拽需要传入元素!");
const maxX = window.innerWidth - element.offsetWidth;
const maxY = window.innerHeight - element.offsetHeight;
let startX,
startY,
offsetX,
offsetY,
isMoved = false;
function startDrag(e) {
e.preventDefault();
offsetX = element.offsetLeft;
offsetY = element.offsetTop;
if (e.type === "mousedown") {
startX = e.clientX;
startY = e.clientY;
document.addEventListener("mousemove", drag, { passive: false });
document.addEventListener("mouseup", stopDrag);
}
if (e.type === "touchstart") {
startX = e.touches[0].clientX;
startY = e.touches[0].clientY;
document.addEventListener("touchmove", drag, { passive: false });
document.addEventListener("touchend", stopDrag);
}
}
function drag(e) {
e.preventDefault();
let x, y, distanceX, distanceY;
if (e.type === "mousemove") {
distanceX = e.clientX - startX;
distanceY = e.clientY - startY;
}
if (e.type === "touchmove") {
distanceX = e.touches[0].clientX - startX;
distanceY = e.touches[0].clientY - startY;
}
x = offsetX + distanceX;
y = offsetY + distanceY;
if (Math.abs(distanceX) > 0 || Math.abs(distanceY) > 0) {
isMoved = true;
x = Math.min(Math.max(x, 0), maxX);
y = Math.min(Math.max(y, 0), maxY);
element.style.left = x + "px";
element.style.top = y + "px";
}
}
function stopDrag() {
if (!isMoved) {
clickFn && clickFn();
}
isMoved = false;
if (window.innerWidth <= 1024) {
document.removeEventListener("touchmove", drag);
document.removeEventListener("touchend", stopDrag);
} else {
document.removeEventListener("mousemove", drag);
document.removeEventListener("mouseup", stopDrag);
}
}
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
element.style.cursor = "move";
element.style.position = "fixed";
element.addEventListener(isMobile ? "touchstart" : "mousedown", startDrag);
}
使用方法
<template>
<div id="dragElement"></div>
</template>
<style>
#dragElement {
width: 100px;
height: 100px;
background-color: red;
left: 0;
top: 0;
}
</style>
<script>
elementDrag(document.getElementById("dragElement"), () => alert("我被点击了!"))
</script>