当前位置:首页 > JavaScript

js实现div拖动

2026-01-30 10:21:54JavaScript

实现 div 拖动的基本方法

使用 JavaScript 实现 div 拖动功能,可以通过监听鼠标事件(mousedownmousemovemouseup)来完成。以下是核心实现逻辑:

js实现div拖动

const draggableDiv = document.getElementById('draggable');

let isDragging = false;
let offsetX, offsetY;

draggableDiv.addEventListener('mousedown', (e) => {
    isDragging = true;
    offsetX = e.clientX - draggableDiv.getBoundingClientRect().left;
    offsetY = e.clientY - draggableDiv.getBoundingClientRect().top;
    draggableDiv.style.cursor = 'grabbing';
});

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

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

CSS 设置

确保 div 的定位方式为 absolutefixed,并添加基础样式:

js实现div拖动

#draggable {
    position: absolute;
    width: 100px;
    height: 100px;
    background-color: #3498db;
    cursor: grab;
    user-select: none; /* 防止拖动时选中文本 */
}

优化边界限制

为防止 div 被拖出可视区域,可以添加边界检查:

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

    const x = e.clientX - offsetX;
    const y = e.clientY - offsetY;
    const maxX = window.innerWidth - draggableDiv.offsetWidth;
    const maxY = window.innerHeight - draggableDiv.offsetHeight;

    draggableDiv.style.left = `${Math.max(0, Math.min(x, maxX))}px`;
    draggableDiv.style.top = `${Math.max(0, Math.min(y, maxY))}px`;
});

完整示例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <style>
        #draggable {
            position: absolute;
            width: 100px;
            height: 100px;
            background-color: #3498db;
            cursor: grab;
            user-select: none;
        }
    </style>
</head>
<body>
    <div id="draggable"></div>

    <script>
        const draggableDiv = document.getElementById('draggable');
        let isDragging = false;
        let offsetX, offsetY;

        draggableDiv.addEventListener('mousedown', (e) => {
            isDragging = true;
            offsetX = e.clientX - draggableDiv.getBoundingClientRect().left;
            offsetY = e.clientY - draggableDiv.getBoundingClientRect().top;
            draggableDiv.style.cursor = 'grabbing';
        });

        document.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            const x = e.clientX - offsetX;
            const y = e.clientY - offsetY;
            const maxX = window.innerWidth - draggableDiv.offsetWidth;
            const maxY = window.innerHeight - draggableDiv.offsetHeight;
            draggableDiv.style.left = `${Math.max(0, Math.min(x, maxX))}px`;
            draggableDiv.style.top = `${Math.max(0, Math.min(y, maxY))}px`;
        });

        document.addEventListener('mouseup', () => {
            isDragging = false;
            draggableDiv.style.cursor = 'grab';
        });
    </script>
</body>
</html>

兼容触摸设备

如需支持触摸屏设备,可以添加触摸事件:

draggableDiv.addEventListener('touchstart', (e) => {
    isDragging = true;
    const touch = e.touches[0];
    offsetX = touch.clientX - draggableDiv.getBoundingClientRect().left;
    offsetY = touch.clientY - draggableDiv.getBoundingClientRect().top;
});

document.addEventListener('touchmove', (e) => {
    if (!isDragging) return;
    const touch = e.touches[0];
    const x = touch.clientX - offsetX;
    const y = touch.clientY - offsetY;
    draggableDiv.style.left = `${x}px`;
    draggableDiv.style.top = `${y}px`;
    e.preventDefault(); // 阻止默认滚动行为
});

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

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

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

vue 实现拖动

vue 实现拖动

实现拖动的核心方法 在Vue中实现拖动功能可以通过HTML5的拖放API或第三方库如vuedraggable。以下是两种常见方案的实现细节。 使用HTML5原生拖放API HTML5提供了dragg…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js画图实现

js画图实现

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