当前位置:首页 > JavaScript

js实现长按拖动

2026-03-15 16:50:47JavaScript

实现长按拖动的核心逻辑

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

监听长按事件

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

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);
}

防止文本选中和默认行为

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

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属性可获得更好的性能:

js实现长按拖动

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
分享给朋友:

相关文章

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现图片放大缩小

js实现图片放大缩小

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

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…