Estoy trabajando en ECMAScript / JavaScript para un archivo SVG y necesito obtener el width
y height
de un text
elemento para poder cambiar el tamaño de un rectángulo que lo rodea. En HTML, podría usar los atributos offsetWidth
y offsetHeight
en el elemento, pero parece que esas propiedades no están disponibles.
Aquí hay un fragmento con el que necesito trabajar. Necesito cambiar el ancho del rectángulo cada vez que cambio el texto, pero no sé cómo obtener el valor real width
(en píxeles) del text
elemento.
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
¿Algunas ideas?
javascript
dom
text
svg
Stephen Sorensen
fuente
fuente
Con respecto a la longitud del texto, el enlace parece indicar que BBox y getComputedTextLength () pueden devolver valores ligeramente diferentes, pero que son bastante cercanos entre sí.
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
fuente
trabajó para mí en
fuente
¿Qué tal algo como esto por compatibilidad:
Esto devuelve el promedio de los resultados válidos de los tres métodos. Puede mejorarlo para descartar valores atípicos o para favorecer
getComputedTextLength
si el elemento es un elemento de texto.Advertencia: como dice el comentario,
getBoundingClientRect
es complicado. Elimínelo de los métodos o utilícelo solo en los elementos en los que segetBoundingClientRect
obtendrán buenos resultados, por lo que no hay rotación y probablemente no hay escala (?)fuente
No estoy seguro de por qué, pero ninguno de los métodos anteriores funciona para mí. Tuve cierto éxito con el método del lienzo, pero tuve que aplicar todo tipo de factores de escala. Incluso con los factores de escala, seguí obteniendo resultados inconsistentes entre Safari, Chrome y Firefox.
Entonces, probé lo siguiente:
Funcionó de manera increíble y súper precisa, pero solo en Firefox. Factores de escala al rescate para Chrome y Safari, pero sin alegría. Resulta que los errores de Safari y Chrome no son lineales ni con la longitud de la cadena ni con el tamaño de la fuente.
Entonces, acérquese al número dos. No me importa mucho el enfoque de fuerza bruta, pero después de luchar con esto de forma intermitente durante años, decidí intentarlo. Decidí generar valores constantes para cada carácter imprimible individual. Normalmente esto sería algo tedioso, pero afortunadamente Firefox resulta ser súper preciso. Aquí está mi solución de fuerza bruta de dos partes:
Nota: El fragmento de código anterior debe ejecutarse en Firefox para generar una matriz precisa de valores. Además, debe reemplazar el elemento 32 de la matriz con el valor del ancho del espacio en el registro de la consola.
Simplemente copio el texto de Firefox en la pantalla y lo pego en mi código javascript. Ahora que tengo la matriz de longitudes de caracteres imprimibles, puedo implementar una función de obtener ancho. Aquí está el código:
Bueno, eso es todo. Fuerza bruta, pero es súper precisa en los tres navegadores, y mi nivel de frustración ha bajado a cero. No estoy seguro de cuánto durará a medida que evolucionen los navegadores, pero debería ser lo suficientemente largo para que pueda desarrollar una técnica sólida de métricas de fuentes para mi texto SVG.
fuente
La especificación SVG tiene un método específico para devolver esta información:
getComputedTextLength()
fuente