当前位置:首页 > JavaScript

js拖拽模板实现方式

2026-01-31 09:15:15JavaScript

原生JavaScript实现拖拽

使用原生JavaScript可以通过监听鼠标事件实现拖拽功能。以下是一个基础实现模板:

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

let isDragging = false;
let offsetX, offsetY;

draggableElement.addEventListener('mousedown', (e) => {
  isDragging = true;
  offsetX = e.clientX - draggableElement.getBoundingClientRect().left;
  offsetY = e.clientY - draggableElement.getBoundingClientRect().top;
  draggableElement.style.cursor = 'grabbing';
});

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

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

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

document.addEventListener('mouseup', () => {
  isDragging = false;
  draggableElement.style.cursor = 'grab';
});

需要确保拖拽元素具有CSS定位属性:

#draggable {
  position: absolute;
  cursor: grab;
  user-select: none;
}

HTML5拖放API实现

HTML5提供了原生拖放API,适合更复杂的拖拽场景:

js拖拽模板实现方式

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

draggable.setAttribute('draggable', 'true');

draggable.addEventListener('dragstart', (e) => {
  e.dataTransfer.setData('text/plain', draggable.id);
  e.dataTransfer.effectAllowed = 'move';
});

const dropZone = document.getElementById('dropzone');
dropZone.addEventListener('dragover', (e) => {
  e.preventDefault();
  e.dataTransfer.dropEffect = 'move';
});

dropZone.addEventListener('drop', (e) => {
  e.preventDefault();
  const id = e.dataTransfer.getData('text/plain');
  const draggedElement = document.getElementById(id);
  dropZone.appendChild(draggedElement);
});

React实现拖拽组件

在React中可以使用react-dnd库或自定义hooks实现:

import { useRef, useState } from 'react';

function Draggable({ children }) {
  const [position, setPosition] = useState({ x: 0, y: 0 });
  const [isDragging, setIsDragging] = useState(false);
  const ref = useRef(null);

  const handleMouseDown = (e) => {
    setIsDragging(true);
    const rect = ref.current.getBoundingClientRect();
    const offsetX = e.clientX - rect.left;
    const offsetY = e.clientY - rect.top;

    const handleMouseMove = (e) => {
      setPosition({
        x: e.clientX - offsetX,
        y: e.clientY - offsetY
      });
    };

    const handleMouseUp = () => {
      setIsDragging(false);
      document.removeEventListener('mousemove', handleMouseMove);
      document.removeEventListener('mouseup', handleMouseUp);
    };

    document.addEventListener('mousemove', handleMouseMove);
    document.addEventListener('mouseup', handleMouseUp);
  };

  return (
    <div
      ref={ref}
      style={{
        position: 'absolute',
        left: position.x,
        top: position.y,
        cursor: isDragging ? 'grabbing' : 'grab'
      }}
      onMouseDown={handleMouseDown}
    >
      {children}
    </div>
  );
}

Vue实现拖拽指令

Vue中可以创建自定义指令实现拖拽功能:

js拖拽模板实现方式

Vue.directive('drag', {
  bind(el, binding) {
    let isDragging = false;
    let offsetX, offsetY;

    el.style.position = 'absolute';
    el.style.cursor = 'grab';

    el.addEventListener('mousedown', (e) => {
      isDragging = true;
      offsetX = e.clientX - el.getBoundingClientRect().left;
      offsetY = e.clientY - el.getBoundingClientRect().top;
      el.style.cursor = 'grabbing';
    });

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

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

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

    document.addEventListener('mouseup', () => {
      isDragging = false;
      el.style.cursor = 'grab';
    });
  }
});

使用方式:

<div v-drag>可拖拽元素</div>

拖拽限制边界

为拖拽添加边界限制,防止元素被拖出可视区域:

function constrainPosition(element, x, y) {
  const rect = element.getBoundingClientRect();
  const maxX = window.innerWidth - rect.width;
  const maxY = window.innerHeight - rect.height;

  return {
    x: Math.max(0, Math.min(x, maxX)),
    y: Math.max(0, Math.min(y, maxY))
  };
}

// 在mousemove事件中使用
const constrained = constrainPosition(draggableElement, x, y);
draggableElement.style.left = `${constrained.x}px`;
draggableElement.style.top = `${constrained.y}px`;

标签: 拖拽模板
分享给朋友:

相关文章

vue实现图标拖拽

vue实现图标拖拽

Vue 实现图标拖拽 使用 HTML5 拖放 API 在 Vue 中实现图标拖拽可以利用 HTML5 的拖放 API。通过 draggable 属性标记可拖拽元素,并监听 dragstart、drag…

js实现图片拖拽

js实现图片拖拽

实现图片拖拽的基本步骤 HTML 结构需要包含可拖拽的图片元素,并设置 draggable 属性为 true: <img id="dragImage" src="image.jpg" drag…

vue实现盒子拖拽

vue实现盒子拖拽

实现盒子拖拽的基本思路 在Vue中实现盒子拖拽功能,可以通过监听鼠标事件(mousedown、mousemove、mouseup)来实现。核心逻辑是记录拖拽起始位置,计算位移差值,并更新盒子的位置。…

vue实现拖拽表格

vue实现拖拽表格

Vue 实现拖拽表格的方法 使用第三方库(推荐) 推荐使用 vuedraggable 或 sortablejs 这类成熟的拖拽库,它们对 Vue 有良好支持且功能丰富。 安装 vuedraggabl…

jquery实现vue 模板

jquery实现vue 模板

使用jQuery模拟Vue模板功能 jQuery可以通过动态操作DOM和事件绑定来模拟Vue的模板功能。虽然jQuery没有Vue的数据绑定和虚拟DOM特性,但可以通过手动更新DOM实现类似效果。…

vue如何实现拖拽

vue如何实现拖拽

实现拖拽的基本方法 在Vue中实现拖拽功能通常使用HTML5的Drag and Drop API或第三方库如vuedraggable。以下是两种方法的详细说明。 使用HTML5 Drag and D…