当前位置:首页 > 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 获取当前触摸点坐标,并更新元素位置。

js实现长按拖动

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 中重置状态。

js实现长按拖动

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实现跳转

js实现跳转

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

js 实现倒计时

js 实现倒计时

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

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…