拖动我 <…">
当前位置:首页 > JavaScript

js实现 拖动

2026-01-15 15:26:44JavaScript

实现拖动的步骤

HTML 结构 创建一个可拖动的元素和一个放置区域:

<div id="draggable" draggable="true">拖动我</div>
<div id="droptarget">放置区</div>

CSS 样式 为拖动和放置状态添加视觉反馈:

#draggable {
  width: 100px;
  padding: 10px;
  background: #f0f0f0;
  border: 1px solid #ccc;
  cursor: move;
}

#droptarget {
  width: 200px;
  height: 200px;
  padding: 20px;
  border: 2px dashed #999;
  margin-top: 20px;
}

.dragging {
  opacity: 0.5;
}

.highlight {
  border-color: #00f;
  background: #eef;
}

JavaScript 逻辑 实现拖动事件处理:

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

// 拖动开始
draggable.addEventListener('dragstart', (e) => {
  e.dataTransfer.setData('text/plain', e.target.id);
  e.target.classList.add('dragging');
});

// 拖动结束
draggable.addEventListener('dragend', (e) => {
  e.target.classList.remove('dragging');
});

// 进入放置区域
droptarget.addEventListener('dragover', (e) => {
  e.preventDefault();
  e.target.classList.add('highlight');
});

// 离开放置区域
droptarget.addEventListener('dragleave', (e) => {
  e.target.classList.remove('highlight');
});

// 放置元素
droptarget.addEventListener('drop', (e) => {
  e.preventDefault();
  e.target.classList.remove('highlight');
  const id = e.dataTransfer.getData('text/plain');
  const draggedElement = document.getElementById(id);
  e.target.appendChild(draggedElement);
});

高级功能扩展

限制拖动方向 通过比较坐标实现水平或垂直限制:

let startX;
draggable.addEventListener('dragstart', (e) => {
  startX = e.clientX;
});

document.addEventListener('dragover', (e) => {
  if (Math.abs(e.clientX - startX) > 10) { // 水平移动阈值
    e.preventDefault();
  }
});

自定义拖动图像 修改拖动时的预览图像:

draggable.addEventListener('dragstart', (e) => {
  const dragIcon = document.createElement('img');
  dragIcon.src = 'custom-icon.png';
  e.dataTransfer.setDragImage(dragIcon, 10, 10);
});

移动端触摸支持

触摸事件处理 为移动设备添加触摸支持:

let touchStartX, touchStartY;

draggable.addEventListener('touchstart', (e) => {
  touchStartX = e.touches[0].clientX;
  touchStartY = e.touches[0].clientY;
  e.target.classList.add('dragging');
});

document.addEventListener('touchmove', (e) => {
  const touch = e.touches[0];
  const xDiff = touch.clientX - touchStartX;
  const yDiff = touch.clientY - touchStartY;

  if (Math.abs(xDiff) > 5 || Math.abs(yDiff) > 5) {
    draggable.style.transform = `translate(${xDiff}px, ${yDiff}px)`;
  }
});

draggable.addEventListener('touchend', (e) => {
  e.target.classList.remove('dragging');
  e.target.style.transform = '';
});

js实现 拖动

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

相关文章

vue怎么实现拖动数据

vue怎么实现拖动数据

实现拖动数据的基本方法 在Vue中实现拖动数据通常使用HTML5的拖放API或第三方库如vuedraggable。以下是两种常见方法的详细说明: 使用HTML5原生拖放API HTML5提供了dra…

js实现继承

js实现继承

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

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现全选

js实现全选

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

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClip…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在H…