当前位置:首页 > JavaScript

js实现长按拖动

2026-03-15 16:50:47JavaScript

实现长按拖动的核心逻辑

长按拖动需要结合mousedownmousemovemouseup事件,并添加定时器判断长按操作。以下是具体实现方法:

监听长按事件

使用setTimeoutmousedown时启动计时器,达到设定时间后触发拖动逻辑。若在时间内触发mouseup则清除计时器。

js实现长按拖动

let pressTimer;
const longPressDelay = 500; // 长按判定时间(毫秒)

element.addEventListener('mousedown', (e) => {
  pressTimer = setTimeout(() => {
    startDrag(e); // 长按时间到达后执行拖动
  }, longPressDelay);
});

element.addEventListener('mouseup', () => {
  clearTimeout(pressTimer); // 取消长按判定
});

实现拖动功能

记录初始位置并计算偏移量,通过CSS变换实现元素跟随鼠标移动。

let isDragging = false;
let initialX, initialY;

function startDrag(e) {
  isDragging = true;
  initialX = e.clientX - element.getBoundingClientRect().left;
  initialY = e.clientY - element.getBoundingClientRect().top;

  document.addEventListener('mousemove', drag);
  document.addEventListener('mouseup', stopDrag);
}

function drag(e) {
  if (!isDragging) return;
  element.style.left = `${e.clientX - initialX}px`;
  element.style.top = `${e.clientY - initialY}px`;
}

function stopDrag() {
  isDragging = false;
  document.removeEventListener('mousemove', drag);
}

防止文本选中和默认行为

长按操作可能触发文本选择或默认菜单,需要阻止这些行为。

js实现长按拖动

element.addEventListener('mousedown', (e) => {
  e.preventDefault(); // 阻止默认行为
});

// CSS防止文本选中
.draggable {
  user-select: none;
  -webkit-user-select: none;
}

完整示例代码

<style>
  .box {
    width: 100px;
    height: 100px;
    background: red;
    position: absolute;
    user-select: none;
  }
</style>

<div class="box" id="draggable"></div>

<script>
  const element = document.getElementById('draggable');
  let pressTimer, isDragging = false;
  let initialX, initialY;
  const longPressDelay = 500;

  element.addEventListener('mousedown', (e) => {
    e.preventDefault();
    pressTimer = setTimeout(() => {
      startDrag(e);
    }, longPressDelay);
  });

  element.addEventListener('mouseup', () => {
    clearTimeout(pressTimer);
  });

  function startDrag(e) {
    isDragging = true;
    initialX = e.clientX - element.getBoundingClientRect().left;
    initialY = e.clientY - element.getBoundingClientRect().top;

    document.addEventListener('mousemove', drag);
    document.addEventListener('mouseup', stopDrag);
  }

  function drag(e) {
    if (!isDragging) return;
    element.style.left = `${e.clientX - initialX}px`;
    element.style.top = `${e.clientY - initialY}px`;
  }

  function stopDrag() {
    isDragging = false;
    document.removeEventListener('mousemove', drag);
  }
</script>

触摸屏设备适配

对于移动设备,需要处理touchstarttouchmovetouchend事件。

element.addEventListener('touchstart', (e) => {
  e.preventDefault();
  pressTimer = setTimeout(() => {
    startDrag(e.touches[0]);
  }, longPressDelay);
});

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

// 修改drag函数处理触摸事件
function drag(e) {
  if (!isDragging) return;
  const clientX = e.clientX || e.touches[0].clientX;
  const clientY = e.clientY || e.touches[0].clientY;
  element.style.left = `${clientX - initialX}px`;
  element.style.top = `${clientY - initialY}px`;
}

性能优化建议

使用transform代替top/left属性可获得更好的性能:

function drag(e) {
  if (!isDragging) return;
  const x = (e.clientX || e.touches[0].clientX) - initialX;
  const y = (e.clientY || e.touches[0].clientY) - initialY;
  element.style.transform = `translate(${x}px, ${y}px)`;
}

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

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

vue拖动实现

vue拖动实现

Vue 拖动实现方法 在 Vue 中实现拖动功能可以通过多种方式完成,以下介绍几种常见的方法: 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以直接在 Vue 中使用。通过…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…