Sto cercando di trovare il modo migliore per ottenere il riquadro di delimitazione di un elemento SVG arbitrario in pixel dello schermo, in modo da sovrapporre correttamente un elemento HTML. Il mio approccio finora è stato quello di utilizzare .getBBox()
e .getCTM()
per recuperare il riquadro di delimitazione dell'oggetto e trasformare la matrice, quindi applicare la trasformazione ai punti del riquadro di delimitazione come descritto nella risposta accettata a this question.Ottieni i limiti di un elemento SVG ruotato in pixel dello schermo?
// 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');
Potete vedere il mio test qui: http://jsfiddle.net/nrabinowitz/zr2jX/
Tuttavia, come gli spettacoli di prova, questo approccio sembra venire a mancare quando c'è una rotazione compresa nel trasformare - sembra che il rettangolo di selezione viene calcolata pre- rotazione, quindi ottenere gli angoli del rettangolo di selezione ruotato non funziona.
Come posso calcolare correttamente il rettangolo di selezione non ruotato degli elementi trasformati?
Questo è un buon punto, ma a) che sarebbe stato meglio se potessi ottenere i limiti di base del riquadro di delimitazione ruotato, e b) spero c'è qualcosa che non so nell'API SVG che può darmi un nuovo riquadro di delimitazione basato sulla forma trasformata. – nrabinowitz
In teoria si potrebbe usare [checkEnclosure] (http://www.w3.org/TR/SVG11/struct.html#__svg__SVGSVGElement__checkEnclosure) per fare una sorta di ricerca binaria per il rettangolo più piccolo che racchiude completamente l'elemento.Sfortunatamente [non è ancora implementato in Firefox] (https://bugzilla.mozilla.org/show_bug.cgi?id=501421). –