拖动我
当前位置:首页 > 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);
});

移动端触摸支持

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

js实现 拖动

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

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现倒计时

js 实现倒计时

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

js实现全选

js实现全选

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

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…