当前位置:首页 > JavaScript

js 实现拖拽

2026-04-03 22:23:10JavaScript

基础拖拽实现

使用原生JavaScript实现拖拽功能需要监听三个主要事件:mousedownmousemovemouseup。以下是核心代码示例:

const draggable = document.getElementById('draggable');
let isDragging = false;
let offsetX, offsetY;

draggable.addEventListener('mousedown', (e) => {
  isDragging = true;
  offsetX = e.clientX - draggable.getBoundingClientRect().left;
  offsetY = e.clientY - draggable.getBoundingClientRect().top;
  draggable.style.cursor = 'grabbing';
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  draggable.style.left = `${e.clientX - offsetX}px`;
  draggable.style.top = `${e.clientY - offsetY}px`;
});

document.addEventListener('mouseup', () => {
  isDragging = false;
  draggable.style.cursor = 'grab';
});

拖拽边界限制

为防止元素被拖出可视区域,需要添加边界检查逻辑:

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;

  const x = e.clientX - offsetX;
  const y = e.clientY - offsetY;
  const maxX = window.innerWidth - draggable.offsetWidth;
  const maxY = window.innerHeight - draggable.offsetHeight;

  draggable.style.left = `${Math.max(0, Math.min(x, maxX))}px`;
  draggable.style.top = `${Math.max(0, Math.min(y, maxY))}px`;
});

拖拽元素层级管理

确保被拖拽元素始终位于其他元素上方:

draggable.addEventListener('mousedown', () => {
  const maxZ = Math.max(...[...document.querySelectorAll('.draggable')]
    .map(el => parseInt(el.style.zIndex || 0)));
  draggable.style.zIndex = maxZ + 1;
});

拖拽性能优化

使用CSS transform替代top/left属性提升性能:

draggable.style.transform = `translate(${x}px, ${y}px)`;

拖拽事件委托

对于动态生成的多个可拖拽元素,使用事件委托:

document.addEventListener('mousedown', (e) => {
  if (!e.target.classList.contains('draggable')) return;
  // 拖拽逻辑
});

HTML5拖拽API

现代浏览器支持原生拖拽API,适用于更复杂的场景:

draggable.draggable = true;

draggable.addEventListener('dragstart', (e) => {
  e.dataTransfer.setData('text/plain', draggable.id);
});

document.addEventListener('dragover', (e) => {
  e.preventDefault();
});

document.addEventListener('drop', (e) => {
  e.preventDefault();
  const id = e.dataTransfer.getData('text/plain');
  const element = document.getElementById(id);
  element.style.left = `${e.clientX}px`;
  element.style.top = `${e.clientY}px`;
});

触摸屏支持

添加触摸事件支持实现移动端兼容:

draggable.addEventListener('touchstart', (e) => {
  const touch = e.touches[0];
  offsetX = touch.clientX - draggable.getBoundingClientRect().left;
  offsetY = touch.clientY - draggable.getBoundingClientRect().top;
});

document.addEventListener('touchmove', (e) => {
  const touch = e.touches[0];
  // 与mousemove相同逻辑
});

拖拽释放回调

添加拖拽结束时的回调处理:

js 实现拖拽

function onDragEnd() {
  // 自定义逻辑
}

document.addEventListener('mouseup', () => {
  isDragging = false;
  onDragEnd();
});

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

相关文章

js实现跳转

js实现跳转

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

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

原生js实现轮播图

原生js实现轮播图

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

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…