当前位置:首页 > JavaScript

js实现拖动元素

2026-03-16 03:21:51JavaScript

实现拖动元素的基本思路

使用JavaScript实现元素拖动主要涉及三个事件:mousedownmousemovemouseup。通过监听这些事件,可以计算元素的位移并更新其位置。

基本实现步骤

HTML结构需要一个可拖动的元素:

js实现拖动元素

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

JavaScript部分:

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

draggable.addEventListener('mousedown', (e) => {
    isDragging = true;
    offsetX = e.clientX - draggable.offsetLeft;
    offsetY = e.clientY - draggable.offsetTop;
});

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;
});

优化拖动体验

为了防止拖动时选中文本或触发其他默认行为,可以在mousedown事件中阻止默认行为:

js实现拖动元素

draggable.addEventListener('mousedown', (e) => {
    e.preventDefault();
    isDragging = true;
    offsetX = e.clientX - draggable.offsetLeft;
    offsetY = e.clientY - draggable.offsetTop;
});

支持触摸设备

为支持触摸屏设备,需添加touchstarttouchmovetouchend事件:

draggable.addEventListener('touchstart', (e) => {
    const touch = e.touches[0];
    isDragging = true;
    offsetX = touch.clientX - draggable.offsetLeft;
    offsetY = touch.clientY - draggable.offsetTop;
});

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

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

封装为可复用函数

将拖动逻辑封装为函数,方便复用:

function makeDraggable(element) {
    let isDragging = false;
    let offsetX, offsetY;

    element.addEventListener('mousedown', (e) => {
        e.preventDefault();
        isDragging = true;
        offsetX = e.clientX - element.offsetLeft;
        offsetY = e.clientY - element.offsetTop;
    });

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

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

makeDraggable(document.getElementById('draggable'));

注意事项

  • 确保拖动元素的CSS包含position: absoluteposition: relative,否则offsetLeftoffsetTop可能不准确。
  • 拖动性能优化:频繁的mousemove事件可能影响性能,可通过节流(throttle)减少事件触发频率。
  • 边界检查:可根据需要添加边界限制,防止元素被拖出可视区域。

标签: 拖动元素
分享给朋友:

相关文章

vue拖动实现

vue拖动实现

Vue 拖动实现方法 在 Vue 中实现拖动功能可以通过多种方式完成,以下介绍几种常见的方法: 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以直接在 Vue 中使用。通过…

vue实现删除元素

vue实现删除元素

使用 v-if 或 v-show 控制元素显示 通过 v-if 或 v-show 指令可以动态控制元素的显示与隐藏。v-if 会直接移除 DOM 元素,而 v-show 仅通过 CSS 的 displ…

vue实现向上拖动

vue实现向上拖动

Vue 实现向上拖动功能 实现向上拖动功能通常需要结合 Vue 的指令和事件处理,以及原生 JavaScript 的拖拽 API。以下是几种常见的方法: 使用 HTML5 拖放 API 通过 HTM…

vue实现拖动宽度

vue实现拖动宽度

Vue 实现拖动调整宽度 在 Vue 中实现拖动调整宽度可以通过监听鼠标事件和使用 CSS 样式来实现。以下是具体实现方法: 使用鼠标事件监听 创建一个可拖动的分隔条,通过监听 mousedown、…

vue 实现表格列拖动

vue 实现表格列拖动

实现表格列拖动的核心方法 使用 Vue 实现表格列拖动功能主要依赖 HTML5 的拖放 API 和 Vue 的数据绑定特性。以下是具体实现步骤: 基础拖放 API 设置 为表格列头添加 dragga…

vue表格宽度拖动实现

vue表格宽度拖动实现

vue表格宽度拖动实现 在Vue中实现表格宽度拖动功能,可以通过监听鼠标事件并结合CSS样式调整来实现。以下是具体实现方法: 使用原生事件监听 创建一个可拖动的列分隔线,通过监听mousedown、…