当前位置:首页 > JavaScript

js实现拖拽方法实现

2026-04-06 15:06:52JavaScript

使用原生 JavaScript 实现拖拽功能

拖拽功能可以通过监听鼠标事件来实现,以下是完整的实现步骤:

HTML 结构

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

JavaScript 实现

js实现拖拽方法实现

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`;
    draggable.style.position = 'absolute';
});

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

使用事件委托优化多元素拖拽

如果需要多个元素可拖拽,可以使用事件委托:

document.addEventListener('mousedown', (e) => {
    if (!e.target.classList.contains('draggable')) return;

    const draggable = e.target;
    let isDragging = true;
    let offsetX = e.clientX - draggable.getBoundingClientRect().left;
    let offsetY = e.clientY - draggable.getBoundingClientRect().top;

    const moveHandler = (e) => {
        if (!isDragging) return;
        draggable.style.left = `${e.clientX - offsetX}px`;
        draggable.style.top = `${e.clientY - offsetY}px`;
        draggable.style.position = 'absolute';
    };

    const upHandler = () => {
        isDragging = false;
        document.removeEventListener('mousemove', moveHandler);
        document.removeEventListener('mouseup', upHandler);
    };

    document.addEventListener('mousemove', moveHandler);
    document.addEventListener('mouseup', upHandler);
});

添加边界限制

防止元素被拖出可视区域:

js实现拖拽方法实现

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

使用 CSS Transform 优化性能

使用 transform 代替 top/left 可以获得更好的性能:

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

    draggable.style.transform = `translate(${e.clientX - offsetX}px, ${e.clientY - offsetY}px)`;
});

添加拖拽开始/结束回调

可以添加自定义事件或回调函数:

draggable.addEventListener('mousedown', (e) => {
    // 触发自定义事件
    draggable.dispatchEvent(new CustomEvent('dragstart'));
});

document.addEventListener('mouseup', () => {
    if (isDragging) {
        draggable.dispatchEvent(new CustomEvent('dragend'));
    }
    isDragging = false;
});

这些方法提供了从基础到进阶的拖拽实现方案,可以根据具体需求选择适合的方式。

标签: 拖拽方法
分享给朋友:

相关文章

vue 拖拽排序 实现

vue 拖拽排序 实现

实现拖拽排序的基本思路 在Vue中实现拖拽排序通常需要借助HTML5的拖放API或第三方库如sortablejs、vuedraggable等。以下是两种常见实现方式: 使用HTML5原生拖放API…

vue 实现拖拽插件

vue 实现拖拽插件

Vue 拖拽插件实现方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中可以直接使用这些 API。…

vue实现表单拖拽

vue实现表单拖拽

实现表单拖拽的基本思路 在Vue中实现表单拖拽功能通常需要结合HTML5的拖放API和Vue的数据绑定特性。通过监听拖放事件,动态更新表单元素的顺序或位置。 使用HTML5拖放API HTML5提供…

vue实现元素拖拽

vue实现元素拖拽

Vue 实现元素拖拽的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性结合事件监听实现拖拽功能。 <template>…

vue 实现div拖拽

vue 实现div拖拽

实现 div 拖拽的基本思路 在 Vue 中实现 div 拖拽功能,可以通过监听鼠标事件(mousedown、mousemove、mouseup)来实现。核心逻辑是记录拖拽起始位置,计算位移并更新 d…

vue原生实现拖拽

vue原生实现拖拽

Vue 原生实现拖拽功能 在 Vue 中实现拖拽功能可以通过 HTML5 的拖拽 API 结合 Vue 的事件绑定和数据响应式特性来完成。以下是几种常见的实现方式: 使用 HTML5 拖拽 API…