当前位置:首页 > JavaScript

JS拖拽的实现

2026-02-28 20:35:55JavaScript

基本拖拽实现

使用原生JavaScript实现拖拽功能需要监听三个事件:mousedownmousemovemouseup。在mousedown事件中记录初始位置,在mousemove事件中计算偏移量并更新元素位置,在mouseup事件中移除事件监听。

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

限制拖拽范围

通过判断元素位置是否超出边界,可以限制拖拽范围。在mousemove事件中添加边界检查逻辑。

JS拖拽的实现

document.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    let left = e.clientX - offsetX;
    let top = e.clientY - offsetY;

    const maxX = window.innerWidth - draggable.offsetWidth;
    const maxY = window.innerHeight - draggable.offsetHeight;

    left = Math.max(0, Math.min(left, maxX));
    top = Math.max(0, Math.min(top, maxY));

    draggable.style.left = `${left}px`;
    draggable.style.top = `${top}px`;
});

拖拽手柄实现

有时只需要元素的一部分(如标题栏)可拖拽。通过检查事件目标是否为手柄元素来实现。

JS拖拽的实现

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

拖拽性能优化

频繁触发mousemove事件可能影响性能。使用requestAnimationFrame优化位置更新。

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

拖拽事件兼容性

为支持移动端触摸事件,可以添加touchstarttouchmovetouchend事件监听。注意触摸事件的坐标获取方式不同。

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

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`;
    e.preventDefault();
});

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

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

相关文章

vue实现拖拽div

vue实现拖拽div

Vue 实现拖拽 Div 的方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,结合 Vue 的事件绑定可以快速实现拖拽功能。以下是实现步骤: <template&…

JS实现跳表

JS实现跳表

跳表的基本概念 跳表(Skip List)是一种基于概率的数据结构,允许快速查询、插入和删除操作,时间复杂度平均为O(log n)。它通过多层链表实现,每一层都是下一层的子集,高层链表跳过多个元素,从…

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实现dom拖拽

vue实现dom拖拽

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