当前位置:首页 > JavaScript

js实现拖拽方法实现

2026-04-06 15:06:52JavaScript

使用原生 JavaScript 实现拖拽功能

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

HTML 结构

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

JavaScript 实现

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

添加边界限制

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

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

添加拖拽开始/结束回调

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

js实现拖拽方法实现

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的Drag and Drop API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明。 使用HTML5 Dra…

Vue实现拖拽布局

Vue实现拖拽布局

Vue 实现拖拽布局的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

div拖拽实现vue

div拖拽实现vue

实现 Vue 中的 div 拖拽功能 在 Vue 中实现 div 拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 完成。以下是两种方法的详细实现: 使用 H…

vue 实现拖拽布局

vue 实现拖拽布局

Vue 实现拖拽布局的方法 使用原生HTML5拖拽API 通过HTML5的draggable属性和Vue的事件绑定实现基础拖拽功能。在元素上添加draggable="true",并通过@dragsta…

vue项目实现方法

vue项目实现方法

Vue 项目实现方法 初始化项目 使用 Vue CLI 或 Vite 创建项目。Vue CLI 适合传统项目,Vite 适合现代轻量级项目。安装依赖后,通过命令行工具运行开发服务器。 # Vue C…

vue badge 实现方法

vue badge 实现方法

使用组件库实现 Badge Vue 生态中主流组件库(如 Element UI、Ant Design Vue、Vuetify 等)均提供现成的 Badge 组件。 以 Element UI 为例:…