当前位置:首页 > JavaScript

js 实现拖拽

2026-04-07 04:45:58JavaScript

实现拖拽的基本步骤

拖拽功能通常涉及三个主要事件:mousedownmousemovemouseup。以下是实现拖拽的核心逻辑。

初始化拖拽元素 为需要拖拽的元素添加 mousedown 事件监听器,记录初始位置。

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

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

处理拖拽移动mousemove 事件中更新元素的位置,确保鼠标移动时元素跟随。

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

结束拖拽mouseup 事件中重置拖拽状态,恢复光标样式。

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

完整代码示例

以下是一个完整的拖拽实现示例,包含 HTML 和 CSS 部分。

HTML 结构

<div id="draggable" style="width: 100px; height: 100px; background: blue; position: absolute; cursor: grab;"></div>

JavaScript 实现

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

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

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

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

注意事项

  • 元素定位:拖拽元素必须设置为 position: absoluteposition: relative,否则 lefttop 属性无效。
  • 性能优化:频繁触发 mousemove 事件可能影响性能,必要时可使用防抖(debounce)或节流(throttle)。
  • 触摸屏支持:如需支持触摸设备,需额外监听 touchstarttouchmovetouchend 事件。

触摸屏支持扩展

为支持触摸设备,可扩展如下代码:

js  实现拖拽

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

document.addEventListener('touchmove', (e) => {
    if (!isDragging) return;
    const touch = e.touches[0];
    draggableElement.style.left = `${touch.clientX - offsetX}px`;
    draggableElement.style.top = `${touch.clientY - offsetY}px`;
});

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

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

相关文章

vue实现拖拽计算器

vue实现拖拽计算器

Vue实现拖拽计算器的步骤 创建Vue项目 使用Vue CLI创建一个新项目,确保已安装Vue和必要的依赖项。通过命令行初始化项目并安装依赖。 vue create drag-calculator…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现 功能

js实现 功能

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

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…