当前位置:首页 > JavaScript

js实现拖动div

2026-02-28 23:51:42JavaScript

实现拖动div的基本思路

通过监听鼠标事件(mousedown、mousemove、mouseup)来实现div的拖动效果。需要记录鼠标按下时的初始位置和div的初始位置,计算移动距离并更新div的位置。

HTML结构准备

创建一个可拖动的div元素,并为其添加必要的样式:

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

优化拖动体验

为防止拖动时选中文本,可以添加CSS样式:

#draggable {
    user-select: none;
    cursor: grab;
}

处理边界情况

确保拖动不会超出视口边界:

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

    let left = e.clientX - offsetX;
    let top = e.clientY - offsetY;

    // 限制在视口内
    left = Math.max(0, Math.min(left, window.innerWidth - draggable.offsetWidth));
    top = Math.max(0, Math.min(top, window.innerHeight - draggable.offsetHeight));

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

封装为可复用函数

将拖动功能封装为可复用的函数:

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

    element.addEventListener('mousedown', (e) => {
        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'));

支持触摸设备

添加触摸事件支持:

js实现拖动div

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

    const startDrag = (clientX, clientY) => {
        isDragging = true;
        offsetX = clientX - element.offsetLeft;
        offsetY = clientY - element.offsetTop;
    };

    const drag = (clientX, clientY) => {
        if (!isDragging) return;
        element.style.left = `${clientX - offsetX}px`;
        element.style.top = `${clientY - offsetY}px`;
    };

    const endDrag = () => {
        isDragging = false;
    };

    // 鼠标事件
    element.addEventListener('mousedown', (e) => startDrag(e.clientX, e.clientY));
    document.addEventListener('mousemove', (e) => drag(e.clientX, e.clientY));
    document.addEventListener('mouseup', endDrag);

    // 触摸事件
    element.addEventListener('touchstart', (e) => {
        e.preventDefault();
        startDrag(e.touches[0].clientX, e.touches[0].clientY);
    });
    document.addEventListener('touchmove', (e) => {
        e.preventDefault();
        drag(e.touches[0].clientX, e.touches[0].clientY);
    });
    document.addEventListener('touchend', endDrag);
}

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

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…