当前位置:首页 > JavaScript

js实现长按拖动

2026-02-02 16:33:59JavaScript

实现长按拖动的步骤

监听触摸事件

使用 touchstarttouchmovetouchend 事件来跟踪触摸操作。长按可以通过 setTimeout 实现,在触摸开始时设置定时器,若在指定时间内未释放则触发拖动。

let timer;
let isDragging = false;

element.addEventListener('touchstart', (e) => {
    timer = setTimeout(() => {
        isDragging = true;
        // 初始化拖动位置
    }, 500); // 长按时间阈值
});

element.addEventListener('touchend', () => {
    clearTimeout(timer);
    if (!isDragging) return;
    // 结束拖动逻辑
    isDragging = false;
});

element.addEventListener('touchmove', (e) => {
    if (!isDragging) return;
    e.preventDefault();
    // 更新元素位置
});

计算拖动位置

touchmove 事件中,通过 e.touches[0].clientXe.touches[0].clientY 获取当前触摸点坐标,并更新元素位置。

let startX, startY;

element.addEventListener('touchstart', (e) => {
    startX = e.touches[0].clientX;
    startY = e.touches[0].clientY;
});

element.addEventListener('touchmove', (e) => {
    const deltaX = e.touches[0].clientX - startX;
    const deltaY = e.touches[0].clientY - startY;
    element.style.transform = `translate(${deltaX}px, ${deltaY}px)`;
});

防止误触

touchstart 中清除之前的定时器,避免多次触发长按逻辑。在 touchend 中重置状态。

element.addEventListener('touchstart', () => {
    clearTimeout(timer);
    timer = setTimeout(() => {
        isDragging = true;
    }, 500);
});

element.addEventListener('touchend', () => {
    clearTimeout(timer);
    if (isDragging) {
        isDragging = false;
    }
});

完整示例

以下是一个完整的长按拖动实现示例:

const element = document.getElementById('drag-element');
let timer;
let isDragging = false;
let startX, startY;

element.addEventListener('touchstart', (e) => {
    e.preventDefault();
    startX = e.touches[0].clientX;
    startY = e.touches[0].clientY;
    timer = setTimeout(() => {
        isDragging = true;
        element.style.cursor = 'grabbing';
    }, 500);
});

element.addEventListener('touchmove', (e) => {
    if (!isDragging) return;
    e.preventDefault();
    const deltaX = e.touches[0].clientX - startX;
    const deltaY = e.touches[0].clientY - startY;
    element.style.transform = `translate(${deltaX}px, ${deltaY}px)`;
});

element.addEventListener('touchend', () => {
    clearTimeout(timer);
    if (isDragging) {
        element.style.cursor = 'grab';
        isDragging = false;
    }
});

兼容鼠标事件

如果需要支持鼠标拖动,可以添加 mousedownmousemovemouseup 事件,逻辑与触摸事件类似。

js实现长按拖动

element.addEventListener('mousedown', (e) => {
    e.preventDefault();
    startX = e.clientX;
    startY = e.clientY;
    timer = setTimeout(() => {
        isDragging = true;
        element.style.cursor = 'grabbing';
    }, 500);
});

document.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    e.preventDefault();
    const deltaX = e.clientX - startX;
    const deltaY = e.clientY - startY;
    element.style.transform = `translate(${deltaX}px, ${deltaY}px)`;
});

document.addEventListener('mouseup', () => {
    clearTimeout(timer);
    if (isDragging) {
        element.style.cursor = 'grab';
        isDragging = false;
    }
});

通过以上方法,可以实现长按拖动功能,并兼容触摸和鼠标操作。

标签: 拖动js
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…