当前位置:首页 > 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 事件,逻辑与触摸事件类似。

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实现长按拖动

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

相关文章

vue.js实现轮播

vue.js实现轮播

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

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…