Interact.js:使用ViewBox时拖动SVG元素



我正在构建一个应用程序,我希望在其中使用svg和互动。js一起用于拖放SVG元素。我的SVG正在使用视图框来正确扩展图形在不同的分辨率上,但是问题是,当我拖动时,鼠标移动比"更快"的元素移动。

我知道这是屏幕和SVG的坐标系之间的问题,我在这里发现了似乎是一个答案:Interact JS,Drag SVG元素在View Boxed SVG中?

但是,我不知道如何将上面链接的标记答案绑定到我的代码中。我尝试的每一件事都会导致更奇怪的行为。我正在尝试将其集成到Interact.js网站上提供的拖放示例:

interact('.draggable')
    .draggable({
        // enable inertial throwing
        inertia: true,
        // keep the element within the area of it's parent
        restrict: {
            restriction: "parent",
            endOnly: true,
            elementRect: { top: 0, left: 0, bottom: 1, right: 1 }
        },
        // enable autoScroll
        autoScroll: true,
        // call this function on every dragmove event
        onmove: dragMoveListener,
        // call this function on every dragend event
        onend: function (event) {
            //removed this code for my test
        }
    });
function dragMoveListener (event) {
    var target = event.target,
        // keep the dragged position in the data-x/data-y attributes
        x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx,
        y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
    // translate the element
    target.style.webkitTransform =
    target.style.transform =
          'translate(' + x + 'px, ' + y + 'px)';
    // update the posiion attributes
    target.setAttribute('data-x', x);
    target.setAttribute('data-y', y);
}

我设法获得的最接近的是此代码代替上面的dragMoveListener

function dragMoveListener(event) {
    var target = event.target;
    var svg = document.querySelector('svg');
    var svgRect = svg.getBoundingClientRect();
    var ctm = target.getScreenCTM();
    var point = svg.createSVGPoint();
    var point2;
    point.x = event.clientX;
    point.y = event.clientY;
    point2 = point.matrixTransform(ctm);
    var x = point2.x;
    var y = point2.y;
    // translate the element
    target.style.webkitTransform =
        target.style.transform =
        'translate(' + x + 'px, ' + y + 'px)';
    // update the posiion attributes
    target.setAttribute('data-x', x);
    target.setAttribute('data-y', y);
}

,但这会导致该元素离鼠标很远,尽管它在同步中移动了几乎(似乎仍然有点偏离)。我该如何工作,我可能会根据我的"几乎"解决方案在链接的问题上提出的解决方案误解?

这是相关的HTML。所有设置仅用于测试目的,并且可能不是最终的(例如2000和4000可能比我最终需要的大)。

<svg id="svgArea" style="width:100%; border: 1px solid black" viewBox="0 0 2000 4000">
    <rect id="item" width="100" height="200" stroke="#000000" stroke-width="5" fill="#ff0000" class="draggable" ></rect>
</svg>

这是工作片段,在其中拖动旋转使用适当的SVG进行DOM坐标转换:

编码epen拖动旋转片段

特别是您缺少的内容:

  mouse.x = event.clientX;
  mouse.y = event.clientY;
  mouse = mouse.matrixTransform(mainSVG.getScreenCTM().inverse());

因此,在您的情况下,您应该从svgarea元素中获取CTCTM。

最新更新