当前位置:首页 > JavaScript

js实现drag

2026-04-07 00:56:15JavaScript

实现拖拽功能的基本步骤

通过原生JavaScript实现拖拽功能需要处理鼠标事件,并动态更新元素位置。以下是核心实现逻辑:

HTML结构准备

<div id="draggable" style="width: 100px; height: 100px; background: red; position: absolute;"></div>

JavaScript事件处理

const draggable = document.getElementById('draggable');
let isDragging = false;
let offsetX, offsetY;

draggable.addEventListener('mousedown', (e) => {
  isDragging = true;
  offsetX = e.clientX - draggable.offsetLeft;
  offsetY = e.clientY - draggable.offsetTop;
});

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

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

进阶功能优化

边界限制 防止元素被拖出可视区域:

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

  let x = e.clientX - offsetX;
  let y = e.clientY - offsetY;

  x = Math.max(0, Math.min(x, window.innerWidth - draggable.offsetWidth));
  y = Math.max(0, Math.min(y, window.innerHeight - draggable.offsetHeight));

  draggable.style.left = `${x}px`;
  draggable.style.top = `${y}px`;
});

拖拽手柄 只有特定子元素可触发拖拽:

const handle = document.querySelector('.handle');
handle.addEventListener('mousedown', initDrag);

现代API方案

使用HTML5 Drag API简化实现:

<div draggable="true" id="dragItem">Drag me</div>
<script>
  const item = document.getElementById('dragItem');
  item.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 draggable = document.getElementById(id);
    draggable.style.left = `${e.clientX}px`;
    draggable.style.top = `${e.clientY}px`;
  });
</script>

性能优化建议

对于复杂拖拽场景:

js实现drag

  • 使用transform: translate()代替top/left提升渲染性能
  • 对频繁触发的事件进行节流处理
  • 避免在事件回调中进行复杂DOM操作

浏览器兼容性说明

  • 现代浏览器均支持上述方案
  • 移动端需额外处理touchstart/touchmove事件
  • IE9以下需使用attachEvent替代addEventListener

标签: jsdrag
分享给朋友:

相关文章

js实现分页

js实现分页

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

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现防洪

js实现防洪

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

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…