【发布时间】:2014-10-01 09:17:27
【问题描述】:
我试图让我的一个组件停靠在另一个组件上,但在拖动行为结束后似乎有些东西丢失了。 转到下面的 JSFiddle,将 svg 光标放在更靠近顶部的位置,然后单击左侧的组件。现在将 svg 光标稍微向下放置并创建另一个组件。现在将底部的拖到顶部的(从下面,代码不适合从上面)并放下它。似乎在“向上”拖动处理程序中,我的代码目前的代码相对于组件的创建位置而不是相对于组件的放置位置应用了翻译。我不明白为什么:(请帮忙。
打开控制台看看我的意思,我在那里打印一些有用的信息和对象坐标。
这是 JSFiddle: http://jsfiddle.net/n4rzul/trqrknqj/
这是传递给 raphael svg 对象的整个拖动函数:
this.drag = function() {
return {
start:function () {
this.position = 0;
this.toFront();
this.lastdx ? this.odx += this.lastdx : this.odx = 0;
this.lastdy ? this.ody += this.lastdy : this.ody = 0;
this.animate({"fill-opacity": 0.5}, 500);
this.previousStroke = this.attr('stroke');
},
move:function (dx, dy) {
var draggedShape = this;
this.transform("t"+(dx+this.odx)+","+(dy+this.ody));
this.lastdx = dx;
this.lastdy = dy;
},
up: function(){
this.animate({"fill-opacity": 1}, 500);
var target;
for(i = 0; i < shapes.length; i++) {
if(shapes[i] != this) {
target = shapes[i];
console.log("found");
break;
}
}
console.log("targetXY: " + target.getBBox().x + ", " + target.getBBox().y);
console.log("draggedXY: " + this.getBBox().x + ", " + this.getBBox().y);
var tX = target.getBBox().x - this.getBBox().x;
var tY = target.getBBox().y - this.getBBox().y;
console.log("translate XY to get from dragged to target: " + tX + ", " + tY);
this.transform("t"+(tX)+","+(tY));
console.log("but it moves relative to its original XY. Why??: " + this.getBBox().x + ", " +this.getBBox().y);
}
};
}
【问题讨论】:
-
只是想知道,您为什么不只拥有一个克隆/翻译的形状/路径,而不是每次使用不同的 x,y 创建不同的路径?然后在定位拖动的那个时,您可以将其设置为与对象的目标+高度完全相同的平移?
-
您的意思是在“工具箱”窗格中克隆路径?我会尝试这样做,但有一种感觉,无论如何它都会引发与我现在所拥有的相同的行为。您能否举例说明您的确切意思?
-
是的,您实际上不必使用克隆,它只是指出为什么每次创建具有不同 x,y 的不同路径对象的一种方式,因为您已经创建了一个在左舷。这是一个仅使用转换字符串的示例,例如 jsfiddle.net/end6hfwh/4
-
太棒了!为什么我的方法不起作用?我正在尝试更好地理解 Raphael 和 svg 转换,以便更好地利用它们。有没有我可以看的不平凡的教程?
标签: javascript svg raphael