当前位置:首页 > JavaScript

js拖拽模板实现方式

2026-03-02 00:27:28JavaScript

原生 JavaScript 实现拖拽

监听目标元素的 mousedown 事件,记录初始位置。在 mousemove 事件中计算偏移量并更新元素位置。mouseup 事件中移除移动监听。

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

draggable.addEventListener('mousedown', (e) => {
  offsetX = e.clientX - draggable.getBoundingClientRect().left;
  offsetY = e.clientY - draggable.getBoundingClientRect().top;

  document.addEventListener('mousemove', onMouseMove);
  document.addEventListener('mouseup', onMouseUp);
});

function onMouseMove(e) {
  draggable.style.left = `${e.clientX - offsetX}px`;
  draggable.style.top = `${e.clientY - offsetY}px`;
}

function onMouseUp() {
  document.removeEventListener('mousemove', onMouseMove);
  document.removeEventListener('mouseup', onMouseUp);
}

HTML5 Drag and Drop API

使用原生拖放接口,需要设置 draggable="true" 并实现相关事件处理器。适用于跨元素拖放场景。

js拖拽模板实现方式

const dragItem = document.getElementById('dragItem');
const dropZone = document.getElementById('dropZone');

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

dropZone.addEventListener('dragover', (e) => {
  e.preventDefault();
});

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

React 实现拖拽组件

使用 React 的 useState 和事件处理实现组件级拖拽。注意使用 transform 代替直接修改定位属性以获得更好性能。

js拖拽模板实现方式

import { useState } from 'react';

function Draggable({ children }) {
  const [position, setPosition] = useState({ x: 0, y: 0 });
  const [dragging, setDragging] = useState(false);
  const [relPosition, setRelPosition] = useState({ x: 0, y: 0 });

  const onMouseDown = (e) => {
    const rect = e.currentTarget.getBoundingClientRect();
    setRelPosition({
      x: e.clientX - rect.left,
      y: e.clientY - rect.top
    });
    setDragging(true);
  };

  const onMouseMove = (e) => {
    if (!dragging) return;
    setPosition({
      x: e.clientX - relPosition.x,
      y: e.clientY - relPosition.y
    });
  };

  const onMouseUp = () => {
    setDragging(false);
  };

  return (
    <div
      style={{
        transform: `translate(${position.x}px, ${position.y}px)`,
        cursor: dragging ? 'grabbing' : 'grab'
      }}
      onMouseDown={onMouseDown}
      onMouseMove={onMouseMove}
      onMouseUp={onMouseUp}
      onMouseLeave={onMouseUp}
    >
      {children}
    </div>
  );
}

Vue 拖拽指令实现

通过自定义指令封装拖拽逻辑,实现可复用拖拽功能。利用 Vue 的指令生命周期钩子处理拖拽状态。

Vue.directive('drag', {
  bind(el, binding) {
    let startX, startY, initialX, initialY;

    el.style.position = binding.value?.position || 'absolute';

    el.addEventListener('mousedown', (e) => {
      startX = e.clientX;
      startY = e.clientY;
      initialX = el.offsetLeft;
      initialY = el.offsetTop;

      document.addEventListener('mousemove', move);
      document.addEventListener('mouseup', stop);
      e.preventDefault();
    });

    function move(e) {
      el.style.left = `${initialX + e.clientX - startX}px`;
      el.style.top = `${initialY + e.clientY - startY}px`;
    }

    function stop() {
      document.removeEventListener('mousemove', move);
      document.removeEventListener('mouseup', stop);
    }
  }
});

第三方库解决方案

使用流行拖拽库如 interact.js 或 Draggable.js 可快速实现复杂交互。以下为 interact.js 示例:

interact('.draggable').draggable({
  inertia: true,
  modifiers: [
    interact.modifiers.restrictRect({
      restriction: 'parent',
      endOnly: true
    })
  ],
  listeners: {
    move(event) {
      const target = event.target;
      const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
      const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;

      target.style.transform = `translate(${x}px, ${y}px)`;
      target.setAttribute('data-x', x);
      target.setAttribute('data-y', y);
    }
  }
});

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

相关文章

vue实现拖拽连接

vue实现拖拽连接

Vue 实现拖拽连接功能 在 Vue 中实现拖拽连接功能通常涉及使用 HTML5 的拖放 API 或第三方库(如 vuedraggable)。以下是两种常见实现方式: 使用 HTML5 拖放 API…

jquery 拖拽

jquery 拖拽

jQuery 拖拽实现方法 使用 jQuery 实现拖拽功能可以通过多种方式完成,以下是常见的几种方法: 使用 jQuery UI 的拖拽功能 jQuery UI 提供了 draggable 方法,…

div css网页制作模板

div css网页制作模板

基础HTML结构 创建HTML文件时需包含DOCTYPE声明、html、head和body标签。DOCTYPE声明确保浏览器以标准模式渲染页面,html标签是文档的根元素,head标签包含元数据和链接…

实现拖拽生成vue

实现拖拽生成vue

拖拽生成 Vue 组件的实现方法 使用可视化拖拽工具 推荐使用开源工具如 Vue Draggable 或 Vue Form Builder,它们提供可视化界面和预设组件库,支持通过拖拽生成 Vue 模…

jquery实现vue模板

jquery实现vue模板

jQuery 实现类似 Vue 模板功能 在传统 jQuery 项目中模拟 Vue 的模板和数据绑定功能,可以通过以下方式实现: 数据绑定与模板渲染 使用 jQuery 的 .html() 或 .…

vue拖拽功能实现

vue拖拽功能实现

Vue 拖拽功能实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,通过 draggable 属性和相关事件实现基础拖拽功能。 <template>…