我試圖找到最好的方法來獲取屏幕像素中任意SVG元素的邊界框,以便正確地覆蓋HTML元素。到目前爲止,我的方法是使用.getBBox()
和.getCTM()
來檢索對象的邊界框和變換矩陣,然後將該變換應用到邊界框點,如this question的接受答案中所述。獲取屏幕像素中旋轉的SVG元素的邊界?
// 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/
然而,隨着測試表明,這種做法似乎當有包含在變換旋轉失敗 - 它看起來像邊界框計算預旋轉,因此旋轉邊界框的拐角不起作用。
如何正確計算轉換元素的非旋轉邊界框?
這是一個很好的點,而是一個),這將是最好的,如果我能得到旋轉邊框的基本界限,和b)我希望有什麼東西我不知道在SVG API中可以給我一個基於轉換形狀的新邊界框。 – nrabinowitz
理論上,您可以使用[checkEnclosure](http://www.w3.org/TR/SVG11/struct.html#__svg__SVGSVGElement__checkEnclosure)對完全包含元素的最小矩形進行二分法搜索。不幸的是[它尚未在Firefox中實現](https://bugzilla.mozilla.org/show_bug.cgi?id=501421)。 –