当前位置:首页 > JavaScript

js实现div拖拽

2026-01-30 14:52:50JavaScript

实现 div 拖拽的基本步骤

通过 JavaScript 实现 div 拖拽功能需要监听鼠标事件(mousedownmousemovemouseup),并在事件触发时更新 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 的 position 设置为 absolutefixed,并初始化 cursor 样式。

#draggable {
    position: absolute;
    width: 100px;
    height: 100px;
    background-color: lightblue;
    cursor: grab;
    user-select: none;
}

处理边界限制

防止 div 被拖出可视区域,可以在 mousemove 事件中添加边界检查逻辑。

document.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    const newX = e.clientX - offsetX;
    const newY = e.clientY - offsetY;
    const maxX = window.innerWidth - draggableDiv.offsetWidth;
    const maxY = window.innerHeight - draggableDiv.offsetHeight;

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

支持触摸设备

为兼容移动设备,需添加触摸事件(touchstarttouchmovetouchend)的处理逻辑。

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

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

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

封装为可复用函数

将拖拽逻辑封装为函数,方便多个元素调用。

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

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

    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;
        element.style.cursor = 'grab';
    });
}

// 调用
makeDraggable(document.getElementById('draggable'));

使用 HTML5 拖拽 API

HTML5 提供了原生拖拽 API,但更适合文件拖放等场景,div 拖拽推荐手动实现。

js实现div拖拽

<div id="draggable" draggable="true"></div>
<script>
    document.getElementById('draggable').addEventListener('dragstart', (e) => {
        e.dataTransfer.setData('text/plain', 'drag-data');
    });
</script>

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

相关文章

js实现倒计时

js实现倒计时

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

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 dragg…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…