Estou trabalhando em ECMAScript / JavaScript para um arquivo SVG e preciso obter o width
e height
de um text
elemento para poder redimensionar um retângulo que o rodeia. Em HTML, seria capaz de usar os atributos offsetWidth
e offsetHeight
no elemento, mas parece que essas propriedades não estão disponíveis.
Aqui está um fragmento com o qual preciso trabalhar. Preciso mudar a largura do retângulo sempre que mudo o texto, mas não sei como obter o real width
(em pixels) do text
elemento.
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
Alguma ideia?
javascript
dom
text
svg
Stephen Sorensen
fonte
fonte
Em relação ao comprimento do texto, o link parece indicar BBox e getComputedTextLength () pode retornar valores ligeiramente diferentes, mas bastante próximos uns dos outros.
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
fonte
trabalhou para mim em
fonte
Que tal algo assim para compatibilidade:
Isso retorna a média de quaisquer resultados válidos dos três métodos. Você poderia melhorá-lo para lançar outliers ou favorecer
getComputedTextLength
se o elemento for um elemento de texto.Aviso: como diz o comentário,
getBoundingClientRect
é complicado. Remova-o dos métodos ou use-o apenas em elementos ondegetBoundingClientRect
retornará bons resultados, portanto, sem rotação e provavelmente sem escala (?)fonte
Não sei por que, mas nenhum dos métodos acima funciona para mim. Tive algum sucesso com o método da tela, mas tive que aplicar todos os tipos de fatores de escala. Mesmo com os fatores de escala, ainda tinha resultados inconsistentes entre Safari, Chrome e Firefox.
Então, tentei o seguinte:
Funcionou de forma incrível e super precisa, mas apenas no Firefox. Fatores de escala para salvar o Chrome e o Safari, mas sem alegria. Acontece que os erros do Safari e Chrome não são lineares com o comprimento da string ou tamanho da fonte.
Então, abordagem número dois. Não me importo muito com a abordagem de força bruta, mas depois de lutar com isso por anos, decidi tentar. Decidi gerar valores constantes para cada caractere imprimível individual. Normalmente, isso seria meio tedioso, mas felizmente o Firefox é super preciso. Aqui está minha solução de força bruta de duas partes:
Nota: O snippet acima deve ser executado no Firefox para gerar uma matriz precisa de valores. Além disso, você deve substituir o item 32 da matriz pelo valor da largura do espaço no log do console.
Simplesmente copio o texto do Firefox na tela e colo no meu código javascript. Agora que tenho a matriz de comprimentos de caracteres imprimíveis, posso implementar uma função get width. Aqui está o código:
Bem, é isso. Força bruta, mas é super preciso em todos os três navegadores, e meu nível de frustração foi para zero. Não tenho certeza de quanto tempo vai durar conforme os navegadores evoluem, mas deve ser o suficiente para que eu desenvolva uma técnica de métrica de fonte robusta para meu texto SVG.
fonte
A especificação SVG tem um método específico para retornar esta informação:
getComputedTextLength()
fonte