当前位置:首页 > 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 拖拽推荐手动实现。

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

js实现div拖拽

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

相关文章

vue 实现卡片拖拽

vue 实现卡片拖拽

Vue 实现卡片拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableElem…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现分页

js实现分页

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

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…