当前位置:首页 > JavaScript

js实现拖拽

2026-01-08 12:20:11JavaScript

实现拖拽的基本步骤

使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedownmousemovemouseup。以下是实现的基本逻辑:

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

let isDragging = false;
let offsetX, offsetY;

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

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

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

设置元素的定位方式

确保拖拽元素的CSS设置了position: absoluteposition: relative,否则lefttop属性不会生效:

#draggable {
    position: absolute;
    cursor: grab;
    user-select: none; /* 防止拖动时选中文本 */
}

处理边界限制

为防止元素被拖出视口,可以添加边界检查逻辑:

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

    const newX = e.clientX - offsetX;
    const newY = e.clientY - offsetY;
    const maxX = window.innerWidth - draggableElement.offsetWidth;
    const maxY = window.innerHeight - draggableElement.offsetHeight;

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

使用HTML5拖拽API

HTML5原生支持拖拽功能,通过draggable属性和拖拽事件实现:

<div id="draggable" draggable="true">拖拽我</div>
<script>
    const draggable = document.getElementById('draggable');

    draggable.addEventListener('dragstart', (e) => {
        e.dataTransfer.setData('text/plain', draggable.id);
    });

    document.addEventListener('dragover', (e) => {
        e.preventDefault(); // 允许放置
    });

    document.addEventListener('drop', (e) => {
        e.preventDefault();
        const id = e.dataTransfer.getData('text/plain');
        const element = document.getElementById(id);
        element.style.left = `${e.clientX}px`;
        element.style.top = `${e.clientY}px`;
    });
</script>

拖拽排序的实现

如果需要实现列表拖拽排序,可以结合拖拽事件和DOM操作:

const list = document.getElementById('sortable-list');
let draggedItem = null;

list.addEventListener('dragstart', (e) => {
    draggedItem = e.target;
    e.dataTransfer.effectAllowed = 'move';
});

list.addEventListener('dragover', (e) => {
    e.preventDefault();
    const target = e.target.closest('li');
    if (target && target !== draggedItem) {
        const rect = target.getBoundingClientRect();
        const next = (e.clientY - rect.top) / (rect.bottom - rect.top) > 0.5;
        list.insertBefore(draggedItem, next ? target.nextSibling : target);
    }
});

list.addEventListener('dragend', () => {
    draggedItem = null;
});

性能优化建议

对于频繁触发的mousemove事件,可以使用节流(throttle)减少计算压力:

function throttle(fn, delay) {
    let lastCall = 0;
    return function(...args) {
        const now = new Date().getTime();
        if (now - lastCall < delay) return;
        lastCall = now;
        fn.apply(this, args);
    };
}

document.addEventListener('mousemove', throttle((e) => {
    if (!isDragging) return;
    // 拖拽逻辑
}, 16)); // 约60fps

js实现拖拽

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

相关文章

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &…

vue实现模块拖拽

vue实现模块拖拽

Vue 实现模块拖拽的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dro…

vue 实现拖拽

vue 实现拖拽

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

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="sli…

js 实现vue

js 实现vue

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