Je travaille sur un ECMAScript / JavaScript pour un fichier SVG et j'ai besoin d'obtenir le width
et height
d'un text
élément afin de pouvoir redimensionner un rectangle qui l'entoure. En HTML, je pourrais utiliser les attributs offsetWidth
et offsetHeight
sur l'élément, mais il semble que ces propriétés ne soient pas disponibles.
Voici un fragment avec lequel je dois travailler. J'ai besoin de changer la largeur du rectangle chaque fois que je change le texte mais je ne sais pas comment obtenir le réel width
(en pixels) de l' text
élément.
<rect x="100" y="100" width="100" height="100" />
<text>Some Text</text>
Des idées?
javascript
dom
text
svg
Stephen Sorensen
la source
la source
En ce qui concerne la longueur du texte, le lien semble indiquer que BBox et getComputedTextLength () peuvent renvoyer des valeurs légèrement différentes, mais qui sont assez proches les unes des autres.
http://bl.ocks.org/MSCAU/58bba77cdcae42fc2f44
la source
travaillé pour moi dans
la source
Que diriez-vous de quelque chose comme ça pour la compatibilité:
Cela renvoie la moyenne de tous les résultats valides des trois méthodes. Vous pouvez l'améliorer pour éliminer les valeurs aberrantes ou pour favoriser
getComputedTextLength
si l'élément est un élément de texte.Attention: comme le dit le commentaire,
getBoundingClientRect
c'est délicat. Supprimez-le des méthodes ou utilisez-le uniquement sur les éléments oùgetBoundingClientRect
retournera de bons résultats, donc pas de rotation et probablement pas de mise à l'échelle (?)la source
Je ne sais pas pourquoi, mais aucune des méthodes ci-dessus ne fonctionne pour moi. J'ai eu un certain succès avec la méthode du canevas, mais j'ai dû appliquer toutes sortes de facteurs d'échelle. Même avec les facteurs d'échelle, j'avais toujours des résultats incohérents entre Safari, Chrome et Firefox.
Alors, j'ai essayé ce qui suit:
A fonctionné génial et super précis, mais seulement dans Firefox. Échelle des facteurs à la rescousse pour Chrome et Safari, mais pas de joie. Il s'avère que les erreurs Safari et Chrome ne sont pas linéaires avec la longueur de la chaîne ou la taille de la police.
Alors, approchez-vous du numéro deux. Je n'aime pas beaucoup l'approche de la force brute, mais après avoir lutté avec cela de temps en temps pendant des années, j'ai décidé de l'essayer. J'ai décidé de générer des valeurs constantes pour chaque caractère imprimable individuel. Normalement, ce serait un peu fastidieux, mais heureusement, Firefox est extrêmement précis. Voici ma solution de force brute en deux parties:
Remarque: L'extrait ci-dessus doit être exécuté dans Firefox pour générer un tableau précis de valeurs. Vous devez également remplacer l'élément de tableau 32 par la valeur de largeur d'espace dans le journal de la console.
Je copie simplement le texte de Firefox à l'écran et je le colle dans mon code javascript. Maintenant que j'ai le tableau des longueurs de caractères imprimables, je peux implémenter une fonction get width. Voici le code:
Eh bien, c'est ça. Force brute, mais elle est super précise dans les trois navigateurs, et mon niveau de frustration est tombé à zéro. Je ne sais pas combien de temps cela va durer au fur et à mesure que les navigateurs évoluent, mais cela devrait être assez long pour que je développe une technique de métrique de police robuste pour mon texte SVG.
la source
La spécification SVG a une méthode spécifique pour renvoyer ces informations:
getComputedTextLength()
la source