当前位置:首页 > JavaScript

js实现拖拽

2026-01-08 12:20:11JavaScript

实现拖拽的基本步骤

使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedownmousemovemouseup。以下是实现的基本逻辑:

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

设置元素的定位方式

确保拖拽元素的CSS设置了position: absoluteposition: relative,否则lefttop属性不会生效:

js实现拖拽

#draggable {
    position: absolute;
    cursor: grab;
    user-select: none; /* 防止拖动时选中文本 */
}

处理边界限制

为防止元素被拖出视口,可以添加边界检查逻辑:

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

    const newX = e.clientX - offsetX;
    const newY = e.clientY - offsetY;
    const maxX = window.innerWidth - draggableElement.offsetWidth;
    const maxY = window.innerHeight - draggableElement.offsetHeight;

    draggableElement.style.left = `${Math.max(0, Math.min(newX, maxX))}px`;
    draggableElement.style.top = `${Math.max(0, Math.min(newY, maxY))}px`;
});

使用HTML5拖拽API

HTML5原生支持拖拽功能,通过draggable属性和拖拽事件实现:

js实现拖拽

<div id="draggable" draggable="true">拖拽我</div>
<script>
    const draggable = document.getElementById('draggable');

    draggable.addEventListener('dragstart', (e) => {
        e.dataTransfer.setData('text/plain', draggable.id);
    });

    document.addEventListener('dragover', (e) => {
        e.preventDefault(); // 允许放置
    });

    document.addEventListener('drop', (e) => {
        e.preventDefault();
        const id = e.dataTransfer.getData('text/plain');
        const element = document.getElementById(id);
        element.style.left = `${e.clientX}px`;
        element.style.top = `${e.clientY}px`;
    });
</script>

拖拽排序的实现

如果需要实现列表拖拽排序,可以结合拖拽事件和DOM操作:

const list = document.getElementById('sortable-list');
let draggedItem = null;

list.addEventListener('dragstart', (e) => {
    draggedItem = e.target;
    e.dataTransfer.effectAllowed = 'move';
});

list.addEventListener('dragover', (e) => {
    e.preventDefault();
    const target = e.target.closest('li');
    if (target && target !== draggedItem) {
        const rect = target.getBoundingClientRect();
        const next = (e.clientY - rect.top) / (rect.bottom - rect.top) > 0.5;
        list.insertBefore(draggedItem, next ? target.nextSibling : target);
    }
});

list.addEventListener('dragend', () => {
    draggedItem = null;
});

性能优化建议

对于频繁触发的mousemove事件,可以使用节流(throttle)减少计算压力:

function throttle(fn, delay) {
    let lastCall = 0;
    return function(...args) {
        const now = new Date().getTime();
        if (now - lastCall < delay) return;
        lastCall = now;
        fn.apply(this, args);
    };
}

document.addEventListener('mousemove', throttle((e) => {
    if (!isDragging) return;
    // 拖拽逻辑
}, 16)); // 约60fps

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

相关文章

vue实现模块拖拽

vue实现模块拖拽

Vue 实现模块拖拽的方法 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,结合 Vue 的事件绑定可以轻松实现拖拽功能。以下是一个基本示例: <template>…

前端实现拖拽功能vue

前端实现拖拽功能vue

实现拖拽功能的基本方法 在Vue中实现拖拽功能可以通过HTML5的拖放API或第三方库如vuedraggable来完成。HTML5的拖放API提供了原生支持,而vuedraggable则简化了列表拖拽…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &…

vue拖拽实现

vue拖拽实现

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

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.defin…

vue实现图片拖拽

vue实现图片拖拽

实现图片拖拽功能 在Vue中实现图片拖拽功能可以通过HTML5的拖放API结合Vue的事件处理来完成。以下是一个完整的实现方法: 基础拖拽实现 为图片元素添加draggable属性并绑定相关事件:…