我试图找到以屏幕像素为单位获取任意 SVG 元素边界框的最佳方法,以便正确覆盖 HTML 元素。到目前为止,我的方法是使用.getBBox()
并.getCTM()
检索对象的边界框和变换矩阵,然后将变换应用于边界框点,如该问题的已接受答案中所述。
// get the element
var el = $(selector)[0],
pt = $(selector).closest('svg')[0].createSVGPoint();
// get the bounding box and matrix
var bbox = el.getBBox(),
matrix = el.getScreenCTM();
pt.x = bbox.x;
pt.y = bbox.y;
var nw = pt.matrixTransform(matrix);
pt.x += bbox.width;
pt.y += bbox.height;
var se = pt.matrixTransform(matrix);
// make a div in the screen space around the object
var $div = $('<div class="bbox"/>').css({
left: nw.x,
top: nw.y,
width: se.x - nw.x,
height: se.y - nw.y
})
.appendTo('body');
你可以在这里看到我的测试:http: //jsfiddle.net/nrabinowitz/zr2jX/
但是,正如测试所示,当变换中包含旋转时,这种方法似乎会失败 - 看起来边界框是在旋转前计算的,因此获取旋转边界框的角不起作用。
如何正确计算转换元素的非旋转边界框?