这里有一些代码,可以概括上述答案的精华,并为Raphael路径提供一个简单的
.attr({pathXY: [newXPos, newYPos]})
属性,类似于
.attr({x: newXPosition})
和
.animate({x: newXPosition})
用于形状。
这使您可以以标准方式将路径移动到固定的
绝对位置或
相对移动量,而不需要硬编码路径字符串或自定义计算。
编辑:下面的代码适用于IE7和IE8。此前版本在IE8 / VML模式下失败,因为
Raphael bug会在SVG模式下向.attr('path')返回数组,但在VML模式下向.attr('path')返回字符串。
代码
在定义
paper
之后添加此代码(
Raphael customAttribute和辅助函数),如下使用。
paper.customAttributes.pathXY = function( x,y ) {
var pathArray = Raphael.parsePathString(this.attr('path'));
var transformArray = ['T', x - this.pathXY('x'), y - this.pathXY('y') ];
return {
path: Raphael.transformPath( pathArray, transformArray)
};
};
Raphael.st.pathXY = function(xy) {
var sum = 0, counter = 0;
this.forEach( function( element ){
var position = ( element.pathXY(xy) );
if(position){
sum += parseFloat(position);
counter++;
}
});
return (sum / counter);
};
Raphael.el.pathXY = function(xy) {
if(xy == 'x' || xy == 'y'){
xy = (xy == 'x') ? 1 : 2;
var pathPos = Raphael.parsePathString(this.attr('path'))[0][xy];
return pathPos;
} else {
this.attr({pathXY: [this.pathXY('x'),this.pathXY('y')]});
}
};
使用方法
绝对定位翻译(移动至固定的X,Y位置)- JSBIN实时演示
可用于任何路径或路径集合,包括集合中的子集合(演示)。请注意,由于Raphael集合是数组而不是组,因此它会将集合中的每个项移动到定义的位置 - 而不是集合的中心。
path.attr({pathXY: [200,300]});
path.attr({pathXY: [200,path.pathXY('y')]});
path.attr({pathXY: [path.pathXY('x'),300]});
Raphael需要在同一个自定义属性中同时处理x和y坐标,以便它们可以一起动画,并保持彼此同步。
相对平移(通过+/- X,Y移动)的翻译 - 实时JSBIN演示
// moves down, right by 10
path.attr({pathXY: [ path.pathXY('x')+10, path.pathXY('y')+10 ]},500);
这也适用于集合,但不要忘记Raphael的集合并不像组 - 每个对象移动到相对于集合的平均位置的一个位置,因此结果可能不是预期的(示例演示)。
用于动画(将路径移动到相对或绝对位置)
首次进行动画之前,您需要设置pathXY值,由于在Raphael 2.1.0之前存在错误/缺失功能,所有customAttributes在动画之前都需要给出数值(否则,它们会将每个数字转换为NaN并且什么也不做,没有错误静默失败,或者不进行动画并直接跳转到最终位置)。
在使用.animate({pathXY: [newX,newY]});
之前,请运行此辅助函数:
somePath.pathXY();