我正在构建一个应用程序,希望将SVG和interact.js一起用于SVG元素的拖放。我的SVG使用ViewBox来在不同的分辨率上正确地缩放图形,但问题是当我拖动时,鼠标的移动速度比其移动的元素“快”。
我知道这是屏幕坐标系和SVG之间的一个问题,我在这里找到了一个答案:交互JS,将svg元素拖动到视图框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>发布于 2017-12-01 22:51:59
下面是拖动旋转使用适当的SVG到DOM坐标转换的工作片段:
尤其是你所缺少的:
mouse.x = event.clientX;
mouse.y = event.clientY;
mouse = mouse.matrixTransform(mainSVG.getScreenCTM().inverse());因此,在您的示例中,您应该从getCTM元素中提取svgArea元素。
https://stackoverflow.com/questions/47600724
复制相似问题