HTML要素を正しくオーバーレイするために、スクリーンピクセル内の任意のSVG要素のバウンディングボックスを取得する最善の方法を見つけることを試みています。私のアプローチはこれまで.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)。 –