当前位置:首页 > JavaScript

js 实现 拖动

2026-02-01 08:11:02JavaScript

实现拖动的核心方法

使用HTML5的拖放API实现拖动功能。主要涉及draggable属性、dragstartdragoverdrop事件。

// 设置元素为可拖动
document.getElementById('dragItem').draggable = true;

// 拖动开始时存储数据
document.getElementById('dragItem').addEventListener('dragstart', function(e) {
    e.dataTransfer.setData('text/plain', e.target.id);
});

// 阻止默认行为以允许放置
document.getElementById('dropZone').addEventListener('dragover', function(e) {
    e.preventDefault();
});

// 处理放置操作
document.getElementById('dropZone').addEventListener('drop', function(e) {
    e.preventDefault();
    const data = e.dataTransfer.getData('text/plain');
    e.target.appendChild(document.getElementById(data));
});

使用鼠标事件实现拖动

通过监听mousedownmousemovemouseup事件实现更精细的控制。

let isDragging = false;
let offsetX, offsetY;

document.getElementById('dragItem').addEventListener('mousedown', function(e) {
    isDragging = true;
    offsetX = e.clientX - e.target.getBoundingClientRect().left;
    offsetY = e.clientY - e.target.getBoundingClientRect().top;
    e.target.style.position = 'absolute';
});

document.addEventListener('mousemove', function(e) {
    if (!isDragging) return;
    const dragItem = document.getElementById('dragItem');
    dragItem.style.left = (e.clientX - offsetX) + 'px';
    dragItem.style.top = (e.clientY - offsetY) + 'px';
});

document.addEventListener('mouseup', function() {
    isDragging = false;
});

使用第三方库简化实现

使用如interact.js等库可以更便捷地实现复杂拖动交互。

interact('.drag-item')
  .draggable({
    inertia: true,
    modifiers: [
      interact.modifiers.restrictRect({
        restriction: 'parent',
        endOnly: true
      })
    ],
    autoScroll: true,
    listeners: {
      move: dragMoveListener
    }
  });

function dragMoveListener(event) {
  const target = event.target;
  const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
  const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;

  target.style.transform = `translate(${x}px, ${y}px)`;
  target.setAttribute('data-x', x);
  target.setAttribute('data-y', y);
}

拖动限制与边界控制

为拖动元素添加边界限制,防止拖出可视区域。

document.addEventListener('mousemove', function(e) {
    if (!isDragging) return;
    const dragItem = document.getElementById('dragItem');
    const parentRect = dragItem.parentNode.getBoundingClientRect();
    const itemRect = dragItem.getBoundingClientRect();

    let newX = e.clientX - offsetX;
    let newY = e.clientY - offsetY;

    // 限制在父元素内
    newX = Math.max(parentRect.left, Math.min(newX, parentRect.right - itemRect.width));
    newY = Math.max(parentRect.top, Math.min(newY, parentRect.bottom - itemRect.height));

    dragItem.style.left = (newX - parentRect.left) + 'px';
    dragItem.style.top = (newY - parentRect.top) + 'px';
});

触摸设备支持

添加触摸事件处理以实现移动端兼容。

js 实现 拖动

let touchOffsetX, touchOffsetY;

document.getElementById('dragItem').addEventListener('touchstart', function(e) {
    const touch = e.touches[0];
    const rect = e.target.getBoundingClientRect();
    touchOffsetX = touch.clientX - rect.left;
    touchOffsetY = touch.clientY - rect.top;
    e.target.style.position = 'absolute';
});

document.addEventListener('touchmove', function(e) {
    const touch = e.touches[0];
    const dragItem = document.getElementById('dragItem');
    dragItem.style.left = (touch.clientX - touchOffsetX) + 'px';
    dragItem.style.top = (touch.clientY - touchOffsetY) + 'px';
    e.preventDefault();
});

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

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…