【发布时间】:2017-05-16 17:56:09
【问题描述】:
我想使用svg.js in 来实现拖放,并操纵图形元素的外观。它主要是有效的,但我不完全明白为什么。
我已经从我的应用程序中提取了基本部分来说明我的应用程序的情况。可以在那里玩,看看效果。
https://jsfiddle.net/bwl21/ex8dcxtm/12/
SVG 由我的应用程序生成为字符串。我通过将 SVG 添加到 jsfiddle 中的 HTML 窗格来模拟这一点。
我有一个函数“set_draggable(id)”,它获取 svg 元素的 id 并附加一个拖动处理程序。
function set_draggable(svg_element) {
var xx = SVG.get(svg_element);
xx.addClass("zn_draggable");
xx.draggable(function(x, y) {
return {
x: Math.floor(x),
y: Math.floor(y)
}
});
var sx = 0,
sy = 0;
xx.on('dragstart', function(e) {
sx = e.detail.p.x;
sy = e.detail.p.y;
this.fill("red");
});
// todo: don't know why 'this' is the only way to change the filling ...
xx.on('dragend', function(e) {
this.fill("green");
var result = {
delta: [ e.detail.p.x - sx, e.detail.p.y - sy],
element: svg_element
};
alert(JSON.stringify(result));
})
}
set_draggable("ZN_18");
set_draggable("ZN_19");
set_draggable("ZN_20");
set_draggable("ZN_21");
我的问题:
在可拖动事件处理程序中,我想更改对象的颜色。 为什么“this”指的是拖动的对象?这是我发现应用 fill() 效果的唯一方法。我尝试使用
xx,这是我附加可拖动的dom节点。还尝试使用e.target.fill("red")。-
当拖动 Fermata - Character(这是一条路径)时,颜色不会改变。它在拖动文本时起作用。 可能是什么原因?
bwl21的回答:同时我发现组的属性并没有覆盖孩子的属性。所以我不得不从路径中删除描边和填充。
尽管如此,我没有设法导航到孩子并更改那里的属性。
当拖动 ZN_19 时,它可以仅垂直移动,因为我将其设为可拖动。如果我将它包装在一个组中(如 ZN_20)并在其上调用 draggable(),我可以随意移动它。
有没有更好的方法来获得作为拖动结果的增量?我将 x 和 y 存储在 'dragstart' 处理程序中,并在 'dragend' 处理程序中计算增量。我希望增量是整数,因为我通过传递给 draggable() 的函数对其进行舍入。
如果我有很多对象(我的应用程序大约有 300 个),我会因为创建很多处理程序而面临性能问题吗?有没有更好的方法来做到这一点。
欢迎任何帮助。
【问题讨论】:
标签: javascript svg svg.js