当前位置:首页 > JavaScript

js实现拖动div

2026-04-04 00:21:06JavaScript

实现拖动 div 的基本步骤

使用 JavaScript 实现拖动 div 的功能可以通过监听鼠标事件来完成。以下是实现的基本方法:

HTML 结构

<div id="draggable" style="width: 100px; height: 100px; background: #ccc; 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;
});

优化拖动体验

为了提升拖动体验,可以添加边界检查和拖动限制:

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 提升拖动效果

添加 CSS 可以提升拖动的视觉效果:

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

#draggable:active {
    cursor: grabbing;
}

支持触摸设备

如果需要支持触摸设备,可以添加触摸事件监听:

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

document.addEventListener('touchmove', (e) => {
    if (!isDragging) return;
    e.preventDefault();
    draggable.style.left = `${e.touches[0].clientX - offsetX}px`;
    draggable.style.top = `${e.touches[0].clientY - offsetY}px`;
});

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

封装为可复用的函数

可以将拖动逻辑封装为函数,方便复用:

js实现拖动div

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

注意事项

  • 确保拖动的元素设置了 position: absoluteposition: fixed
  • 避免在拖动过程中选中文本,可以通过 CSS 的 user-select: none 实现。
  • 对于复杂的拖动需求(如限制拖动方向或范围),可以进一步扩展逻辑。

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

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…

js实现刷新页面

js实现刷新页面

刷新页面的方法 在JavaScript中,可以通过多种方式实现页面刷新。以下是几种常见的方法: 使用 location.reload() 调用 location.reload() 方法可以重新加载当…

js实现上传图片预览

js实现上传图片预览

使用FileReader实现图片预览 通过FileReader对象读取用户选择的图片文件,并将其显示在页面上。这种方法适用于现代浏览器。 // HTML部分 <input type="file…

js实现菜单导航

js实现菜单导航

实现基础菜单导航结构 使用HTML和CSS创建菜单的基本结构,再通过JavaScript添加交互功能。HTML部分通常使用<ul>和<li>标签构建层级: <nav i…