HTML要素を正しくオーバーレイするために、画面ピクセルで任意のSVG要素の境界ボックスを取得する最良の方法を見つけようとしています。これまでの私のアプローチは、オブジェクトの境界ボックスと変換行列を使用.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/
ただし、テストが示すように、変換に回転が含まれている場合、このアプローチは失敗するようです。バウンディング ボックスは回転前に計算されるように見えるため、回転したバウンディング ボックスの角を取得することはできません。
変換された要素の非回転境界ボックスを正しく計算するにはどうすればよいですか?