鼠标的拖动效果

1、变量的设置
js 复制代码
let isDragging = false;
let startX;
let startY;
let endX;
let endY;
let box = null;
  • isDragging : 表示是否推拽
  • startX、startY:表示起始坐标,相对于元素
  • endX、endY:表示结束坐标,相对于元素
  • box:表示要拖动的盒子
2、设置监听事件

设置监听事件,并初始化盒子(box)

js 复制代码
// 为鼠标按下事件设置监听
titleFile.addEventListener('mousedown', (e) => {
    box = createFileBox; // 初始化被移动的元素
    mouseMove(e); // 调用移动鼠标的函数
});
3、移动鼠标
  • 第一次移动
    • 首先判断是否为第一次移动,如果是第一次移动,那末直接让初始的位置为当前鼠标的位置。
    • 然后尝试获取盒子的位置,并初始化。
  • 非第一次移动
    • 将上一次移动的末位置作为当前的初始位置。
js 复制代码
function mouseMove(e){
    isDragging = true;
    if(startX  === undefined || startY === undefined) {
        startX = e.clientX;
        startY = e.clientY;
    } else {
        startX = e.clientX - endX;
        startY = e.clientY - endY;
    }
    let ox = box.style.left;
    let oy = box.style.top;
    if(ox === '' || ox === null || oy === '' || oy === null) {
        box.style.left = '0px';
        box.style.top = '0px';
    }
}
3、鼠标移动事件

由于要移动的盒子时使用的相对定位,因此导致坐标不一致,鼠标是根据左上角为原点进行定位,而我的是根据初始位置的中间位置进行定位。因此需要将鼠标的坐标转化为盒子所在坐标系的坐标。

js 复制代码
// 鼠标移动事件
document.addEventListener('mousemove', (e) => {
    if (isDragging) {
        e.preventDefault(); // 阻止默认行为
        // 计算要移动的距离,即,元素元素要移动的距离
        endX = e.clientX - startX;
        endY = e.clientY - startY;
        box.style.left = `${endX}px`;
        box.style.top = `${endY}px`;
    }
});
4、鼠标释放事件
js 复制代码
// 鼠标释放事件
document.addEventListener('mouseup', () => {
    isDragging = false;
});
5、清理鼠标事件
js 复制代码
function mouseClear() {
    startX = undefined;
    startY = undefined;
    endX = undefined;
    endY = undefined;
    if(box !== null) {
        box.style.left = '0px';
        box.style.top = '0px';
    }
    box = null;
}
相关推荐
重生之小比特5 分钟前
【C++进阶】红黑树的实现
java·开发语言·c++
纪念 2296 分钟前
C++算法(一)
开发语言·c++·算法
怕浪猫1 小时前
分享一个做视频的skill,这条白板视频,每一笔都是代码画的
前端·javascript·面试
Yunovian2 小时前
AI时代,针对模型与应用,浅谈一下各编程语言
开发语言·c++·人工智能·python·ai·rust·ai编程
周杰伦fans3 小时前
构建真正智能的CAD AI绘图代理
开发语言·人工智能·c#
OpsEye5 小时前
当企业不再只关心能不能调用模型,而是关心值不值得调用
javascript·ai编程
FYKJ_20105 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
javascript·vue.js·spring boot·mysql·typescript·spark·express
zhanghaha13145 小时前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
释厄6235 小时前
多黑洞具现论·物理/生物/金融三域显化·虚拟宇宙黑洞·奇点=0 圆圈
开发语言·数据结构·人工智能·程序人生·安全威胁分析
晓得迷路了6 小时前
栗子前端技术周刊第 148 期 - Turborepo 2.11、Chrome 154 iframe、Node.js 26...
前端·javascript·css