当前位置:首页 > JavaScript

js实现拖动

2026-03-15 08:27:13JavaScript

实现基本拖动功能

使用HTML5的拖放API可以快速实现元素拖动。为元素添加draggable="true"属性,并监听相关事件:

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

draggableElement.addEventListener('dragstart', (e) => {
  e.dataTransfer.setData('text/plain', e.target.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`;
});

自定义拖动逻辑

通过鼠标事件实现更灵活的拖动控制:

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.position = 'absolute';
});

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;
});

限制拖动范围

添加边界检查防止元素被拖出可视区域:

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

  const x = e.clientX - offsetX;
  const y = e.clientY - offsetY;
  const maxX = window.innerWidth - element.offsetWidth;
  const maxY = window.innerHeight - element.offsetHeight;

  element.style.left = `${Math.min(Math.max(0, x), maxX)}px`;
  element.style.top = `${Math.min(Math.max(0, y), maxY)}px`;
});

拖动手柄实现

只允许通过特定元素触发拖动:

const handle = document.querySelector('.drag-handle');

handle.addEventListener('mousedown', startDrag);
element.addEventListener('mousedown', (e) => {
  if (e.target !== handle) return;
  startDrag(e);
});

触摸设备支持

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

js实现拖动

element.addEventListener('touchstart', (e) => {
  const touch = e.touches[0];
  offsetX = touch.clientX - element.getBoundingClientRect().left;
  offsetY = touch.clientY - element.getBoundingClientRect().top;
  isDragging = true;
  e.preventDefault();
});

document.addEventListener('touchmove', (e) => {
  if (!isDragging) return;
  const touch = e.touches[0];
  element.style.left = `${touch.clientX - offsetX}px`;
  element.style.top = `${touch.clientY - offsetY}px`;
  e.preventDefault();
});

document.addEventListener('touchend', () => {
  isDragging = false;
});

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

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…