有一种方法可以检索带有和不带有变换的元素的边界框。
经过改造:
var bbox = image.getBBox(),
width = bbox.width,
height = bbox.height;
没有转换:
var bbox = image.getBBoxWOTransform(),
width = bbox.width,
height = bbox.height;
您可以使用帮助方法(如果您小心的话)扩展 Raphael.el,如果这对您有帮助,这些方法可以直接提供宽度和高度。您可以只使用边界框方法并返回您感兴趣的部分,但为了更高效,我只使用元素上的矩阵属性和属性的位置/宽度/高度计算了请求的属性。
(function (r) {
function getX() {
var posX = this.attr("x") || 0,
posY = this.attr("y") || 0;
return this.matrix.x(posX, posY);
}
function getY() {
var posX = this.attr("x") || 0,
posY = this.attr("y") || 0;
return this.matrix.y(posX, posY);
}
function getWidth() {
var posX = this.attr("x") || 0,
posY = this.attr("y") || 0,
maxX = posX + (this.attr("width") || 0),
maxY = posY + (this.attr("height") || 0),
m = this.matrix,
x = [
m.x(posX, posY),
m.x(maxX, posY),
m.x(maxX, maxY),
m.x(posX, maxY)
];
return Math.max.apply(Math, x) - Math.min.apply(Math, x);
}
function getHeight() {
var posX = this.attr("x") || 0,
posY = this.attr("y") || 0,
maxX = posX + (this.attr("width") || 0),
maxY = posY + (this.attr("height") || 0),
m = this.matrix,
y = [
m.y(posX, posY),
m.y(maxX, posY),
m.y(maxX, maxY),
m.y(posX, maxY)
];
return Math.max.apply(Math, y) - Math.min.apply(Math, y);
}
r.getX = getX;
r.getY = getY;
r.getWidth = getWidth;
r.getHeight = getHeight;
}(Raphael.el))
有用法:
var x = image.getX();
var y = image.getY();
var width = image.getWidth();
var height = image.getHeight();
只需在包含 Raphael 后包含脚本即可。请注意,它仅适用于具有宽度、高度、x 和 y 属性的元素,适用于图像。 Raphael 实际上是根据路径数据计算边界框,对路径中的所有点进行变换,并在变换后得到最小/最大 x/y 值。