当前位置:首页 > JavaScript

js实现拖动svg

2026-04-07 15:06:54JavaScript

实现 SVG 拖动的 JavaScript 方法

使用原生 JavaScript 实现 SVG 拖动

为 SVG 元素添加拖动功能需要监听鼠标事件(mousedownmousemovemouseup)。以下是一个基本实现:

js实现拖动svg

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

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

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

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

使用 transform 优化性能

直接修改 lefttop 可能触发重排,使用 transform 性能更好:

js实现拖动svg

svgElement.addEventListener('mousedown', (e) => {
    isDragging = true;
    const rect = svgElement.getBoundingClientRect();
    offsetX = e.clientX - rect.left;
    offsetY = e.clientY - rect.top;
});

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

处理 SVG 内部元素拖动

若需拖动 SVG 内的特定元素(如 <rect><circle>),需使用 SVG 的坐标系统:

const svg = document.querySelector('svg');
const rect = document.querySelector('rect');
let selectedElement = null;
let offset = { x: 0, y: 0 };

svg.addEventListener('mousedown', (e) => {
    if (e.target !== rect) return;
    selectedElement = e.target;
    const CTM = svg.getScreenCTM();
    offset.x = e.clientX - CTM.e - parseFloat(selectedElement.getAttribute('x'));
    offset.y = e.clientY - CTM.f - parseFloat(selectedElement.getAttribute('y'));
});

svg.addEventListener('mousemove', (e) => {
    if (!selectedElement) return;
    const CTM = svg.getScreenCTM();
    const x = e.clientX - CTM.e - offset.x;
    const y = e.clientY - CTM.f - offset.y;
    selectedElement.setAttribute('x', x);
    selectedElement.setAttribute('y', y);
});

svg.addEventListener('mouseup', () => {
    selectedElement = null;
});

使用第三方库简化操作

若项目允许,使用库如 Draggableinteract.js 可简化实现:

interact('.draggable-svg')
    .draggable({
        onmove: (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);
        }
    });

注意事项

  • SVG 的坐标系统与 DOM 不同,需通过 getScreenCTM() 转换。
  • 对于嵌套 SVG 元素,确保事件冒泡被正确处理。
  • 移动端需额外处理 touchstarttouchmovetouchend 事件。

以上方法可根据具体需求调整,如限制拖动范围或添加动画效果。

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

相关文章

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…