当前位置:首页 > 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
分享给朋友:

相关文章

js实现继承

js实现继承

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

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现百叶窗

js实现百叶窗

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

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…