Estoy tratando de encontrar la mejor manera de obtener el cuadro delimitador de un elemento SVG arbitrario en los píxeles de la pantalla, con el fin de superponer un elemento HTML correctamente. Mi enfoque hasta ahora ha sido usar .getBBox()
y .getCTM()
para recuperar el cuadro delimitador del objeto y la matriz de transformación, luego aplicar la transformación a los puntos del cuadro delimitador como se describe en la respuesta aceptada al this question.Obtener los límites de un elemento SVG girado en píxeles de pantalla?
// 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');
Se puede ver mi prueba aquí: http://jsfiddle.net/nrabinowitz/zr2jX/
Sin embargo, como muestra de prueba, este enfoque parece fallar cuando hay una rotación incluido en la transformación - se ve como el cuadro de límite se calcula pre- rotación, por lo que no funciona las esquinas del cuadro delimitador girado.
¿Cómo puedo calcular correctamente el cuadro delimitador no girado de los elementos transformados?
Ese es un buen punto, pero a) que sería mejor si pudiera conseguir los límites básicos de la caja de contorno girado, y b) espero que hay algo que No sé en la API SVG que puede darme un nuevo cuadro delimitador basado en la forma transformada. – nrabinowitz
En teoría, podría usar [checkEnclosure] (http://www.w3.org/TR/SVG11/struct.html#__svg__SVGSVGElement__checkEnclosure) para realizar una especie de búsqueda binaria para el rectángulo más pequeño que encierra completamente su elemento.Desafortunadamente [aún no está implementado en Firefox] (https://bugzilla.mozilla.org/show_bug.cgi?id=501421). –