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

相关文章

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

vue实现拖拽放置

vue实现拖拽放置

Vue 实现拖拽放置功能 拖拽放置功能可以通过 Vue 的指令或第三方库实现。以下是两种常见的方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 dragga…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…