当前位置:首页 > JavaScript

js实现长按拖动

2026-04-07 10:14:45JavaScript

实现长按拖动的 JavaScript 方法

监听长按事件

通过 setTimeout 实现长按判断,当鼠标或触摸按住超过设定时间(如 500ms)时触发拖动逻辑。监听 mousedowntouchstart 事件,记录初始位置。

js实现长按拖动

let pressTimer;
const element = document.getElementById('draggable');

element.addEventListener('mousedown', (e) => {
  pressTimer = setTimeout(() => {
    startDrag(e);
  }, 500); // 长按时间阈值
});

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

初始化拖动状态

startDrag 函数中记录初始坐标和元素位置,绑定移动和结束事件的监听器。

js实现长按拖动

function startDrag(e) {
  const rect = element.getBoundingClientRect();
  const offsetX = e.clientX - rect.left;
  const offsetY = e.clientY - rect.top;

  document.addEventListener('mousemove', drag);
  document.addEventListener('mouseup', endDrag);

  function drag(e) {
    element.style.left = `${e.clientX - offsetX}px`;
    element.style.top = `${e.clientY - offsetY}px`;
  }

  function endDrag() {
    document.removeEventListener('mousemove', drag);
    document.removeEventListener('mouseup', endDrag);
  }
}

处理触摸事件

适配移动端触摸操作,监听 touchstarttouchmovetouchend 事件,注意阻止默认行为避免页面滚动。

element.addEventListener('touchstart', (e) => {
  pressTimer = setTimeout(() => {
    startTouchDrag(e);
  }, 500);
});

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

function startTouchDrag(e) {
  const touch = e.touches[0];
  const rect = element.getBoundingClientRect();
  const offsetX = touch.clientX - rect.left;
  const offsetY = touch.clientY - rect.top;

  document.addEventListener('touchmove', touchDrag);
  document.addEventListener('touchend', endTouchDrag);

  function touchDrag(e) {
    e.preventDefault();
    const touch = e.touches[0];
    element.style.left = `${touch.clientX - offsetX}px`;
    element.style.top = `${touch.clientY - offsetY}px`;
  }

  function endTouchDrag() {
    document.removeEventListener('touchmove', touchDrag);
    document.removeEventListener('touchend', endTouchDrag);
  }
}

CSS 样式要求

确保元素使用 position: absoluteposition: fixed,并通过 lefttop 控制位置。

#draggable {
  position: absolute;
  cursor: grab;
  user-select: none; /* 防止拖动时选中文本 */
}

优化与注意事项

  • 性能优化:使用 transform 替代 left/top 减少重排。
  • 防误触:在移动端增加 touch-action: none 避免与浏览器手势冲突。
  • 兼容性:检查 Passive Event Listeners 是否需要用于 touchmove

通过以上方法,可以实现跨端的长按拖动功能,同时兼顾性能和交互体验。

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

相关文章

vue网页实现拖动效果

vue网页实现拖动效果

Vue 实现拖动效果的方法 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动效果。 <template> &…

js实现验证

js实现验证

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

vue 实现拖动

vue 实现拖动

实现拖动的核心方法 在Vue中实现拖动功能可以通过HTML5的拖放API或第三方库如vuedraggable。以下是两种常见方案的实现细节。 使用HTML5原生拖放API HTML5提供了dragg…

js实现复制到剪贴板

js实现复制到剪贴板

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

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…