Próbuję znaleźć najlepszy sposób uzyskania obwiedni dowolnego elementu SVG w pikselach ekranu, aby poprawnie nałożyć element HTML. Moje dotychczasowe podejście polegało na użyciu .getBBox()
i .getCTM()
w celu pobrania ramki ograniczającej obiektu i macierzy transformacji, a następnie zastosowania transformacji do punktów ramki granicznej zgodnie z opisem w zaakceptowanej odpowiedzi na this question.Uzyskiwanie granic obracanego elementu SVG w pikselach ekranu?
// 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');
Można zobaczyć mój test TUTAJ: http://jsfiddle.net/nrabinowitz/zr2jX/
Jednak, jak wynika z badań, takie podejście wydaje się niepowodzeniem, gdy istnieje obrót zawarte w transformacji - wygląda jak obwiednia jest obliczana pre- obracanie, więc nie działa narożnik obróconego obwiedni.
Jak poprawnie obliczyć nieobrotowy obwiednia transformowanych elementów?
To dobry punkt, ale a) najlepiej byłoby, gdybym mógł uzyskać podstawowe granice obwiedni obróconym, oraz b) Mam nadzieję, że istnieje coś, co nie wiem w interfejsie API SVG, który może dać mi nową ramkę ograniczającą na podstawie przekształconego kształtu. – nrabinowitz
Teoretycznie można użyć [checkEnclosure] (http://www.w3.org/TR/SVG11/struct.html#__svg__SVGSVGElement__checkEnclosure), aby wykonać binarne wyszukiwanie najmniejszego prostokąta, który całkowicie otoczy twój element.Niestety [nie jest jeszcze zaimplementowany w Firefoksie] (https://bugzilla.mozilla.org/show_bug.cgi?id=501421). –