J'ai le rectangle suivant ...
<rect x="0px" y="0px" width="60px" height="20px"/>
Je voudrais centrer le mot "Fiction" à l'intérieur. Pour les autres rectangles, le mot svg s'enroule-t-il pour y rester? Je n'arrive pas à trouver quoi que ce soit de spécifiquement sur l'insertion de texte dans des formes centrées à la fois horizontalement et verticalement et sur le retour à la ligne. De plus, le texte ne peut pas quitter le rectangle.
Regarder l' exemple http://www.w3.org/TR/SVG/text.html#TextElement n'aide pas puisque les x et y de l'élément de texte sont différents des x et y du rectangle. Il ne semble pas y avoir de largeur et de hauteur pour les éléments de texte. Je ne suis pas sûr du calcul ici.
(Ma table html ne fonctionnera tout simplement pas.)
Réponses:
Une solution simple pour centrer le texte horizontalement et verticalement en SVG:
Définissez la position du texte sur le centre absolu de l'élément dans lequel vous souhaitez le centrer:
x="50%" y ="50%"
.x
serait lex
de cet élément + la moitié de sa largeur (et similaire poury
mais avec la hauteur).Utilisez la
text-anchor
propriété pour centrer le texte horizontalement avec la valeurmiddle
:Utilisez la
dominant-baseline
propriété pour centrer le texte verticalement avec la valeurmiddle
(ou selon à quoi vous voulez qu'il ressemble, vous voudrez peut-être fairecentral
)Voici une démo simple:
la source
dominant-baseline
propriété qui fait le travail, pas lealignment-baseline
.<style type="text/css"><![CDATA[ text { alignment-baseline: middle; text-anchor:middle; } ]]></style>
. Merci pour la solution.dominant-baseline
doit en effet être utilisé. Je suis désolé, mais cette réponse est en quelque sorte trompeuse. Comme cela ne semble pas fonctionner dans Firefox ni dans Chromium et en plus vous devez étudier les commentaires afin de trouver la bonne solution par vous-même, je me suis permis d'ajouter une autre réponse avec un code qui fonctionne comme prévu. (Pour les enregistrements: Testé avec FF et Chromium sur Ubuntu Linux.)alignment-baseline
, mais il semble que ce peut être une chose bizarre parce que l' examen des spécifications, il devrait êtredominant-baseline
pourtext
, etalignment-baseline
pourtspan
,tref
,altGlyph
ettextPath
. J'ai mis à jour la réponse en conséquence.SVG 1.2 Tiny a ajouté un habillage de texte, mais la plupart des implémentations de SVG que vous trouverez dans le navigateur (à l'exception d'Opera) n'ont pas implémenté cette fonctionnalité. C'est généralement à vous, le développeur, de positionner le texte manuellement.
La spécification SVG 1.1 donne un bon aperçu de cette limitation et des solutions possibles pour la surmonter:
http://www.w3.org/TR/SVG11/text.html#Introduction
En tant que primitive, l'habillage de texte peut être simulé en utilisant l'
dy
attribut et lestspan
éléments, et comme mentionné dans la spécification, certains outils peuvent automatiser cela. Par exemple, dans Inkscape, sélectionnez la forme souhaitée et le texte souhaité, puis utilisez Texte -> Flux dans le cadre. Cela vous permettra d'écrire votre texte, avec un habillage, qui s'enroulera en fonction des limites de la forme. Assurez-vous également de suivre ces instructions pour indiquer à Inkscape de maintenir la compatibilité avec SVG 1.1: http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3FEn outre, il existe des bibliothèques JavaScript qui peuvent être utilisées pour automatiser de manière dynamique l'habillage de texte: http://www.carto.net/papers/svg/textFlow/
Il est intéressant de noter la solution de CSVG pour envelopper une forme dans un élément de texte (par exemple, voir leur exemple "bouton"), bien qu'il soit important de mentionner que leur implémentation n'est pas utilisable dans un navigateur: http://www.csse.monash.edu .au / ~ clm / csvg / about.html
Je mentionne cela parce que j'ai développé une bibliothèque inspirée de CSVG qui vous permet de faire des choses similaires et fonctionne dans les navigateurs Web, même si je ne l'ai pas encore publiée.
la source
editable="true"
à l'élément text ou textArea.Les réponses précédentes ont donné de mauvais résultats en utilisant des coins arrondis ou
stroke-width
c'est> 1. Par exemple, vous vous attendez à ce que le code suivant produise un rectangle arrondi, mais les coins sont coupés par lesvg
composant parent :Au lieu de cela, je recommande d'encapsuler le
text
dans unsvg
, puis d'imbriquer ce nouveausvg
et lerect
ensemble dans ung
élément, comme dans l'exemple suivant:Cela résout le problème d'écrêtage qui se produit dans les réponses ci-dessus. J'ai également traduit le groupe rect / texte en utilisant l'
transform="translate(x,y)"
attribut pour démontrer que cela fournit une approche plus intuitive pour positionner le rect / texte à l'écran.la source
Si vous créez le SVG par programmation, vous pouvez le simplifier et faire quelque chose comme ceci:
la source
dominant-baseline
ettext-anchor
, pasdominantBaseline
ettextAnchor
?Vous pouvez directement utiliser la
text-anchor = "middle"
propriété. Je conseille de créer un élément svg wrapper sur votre rectangle et votre texte. De cette façon, vous pouvez utiliser l'ensemble de l'élément en utilisant un sélecteur css. Assurez-vous de placer la propriété «x» et «y» du texte à 50%.la source
Blog détaillé: http://blog.techhysahil.com/svg/how-to-center-text-in-svg-shapes/
la source
alignment-baseline
n'est pas le bon attribut à utiliser ici. La bonne réponse est d'utiliser une combinaison dedominant-baseline="central"
ettext-anchor="middle"
:la source
Une façon d'insérer du texte à l'intérieur d'un rectangle est d'insérer un objet étranger, qui est un DIV, à l'intérieur d'un objet rect.
De cette façon, le texte respectera les limites du DIV.
la source
J'ai eu beaucoup de mal à obtenir quelque chose de centré en utilisant SVG, alors j'ai lancé ma propre petite fonction. j'espère que cela devrait vous aider. Notez que cela ne fonctionne que pour les éléments SVG.
la source
Pour l'alignement horizontal et vertical du texte dans les graphiques, vous pouvez utiliser les styles CSS suivants. En particulier, notez que
dominant-baseline:middle
c'est probablement faux, car c'est (généralement) à mi-chemin entre le haut et la ligne de base, plutôt qu'à mi-chemin entre le haut et le bas. De plus, certaines sources (par exemple Mozilla ) utilisent à ladominant-baseline:hanging
place dedominant-baseline:text-before-edge
. C'est également probablement faux, car ilhanging
est conçu pour les scripts indiens. Bien sûr, si vous utilisez un mélange de latin, d'indien, d'idéographes ou autre, vous aurez probablement besoin de lire la documentation .Edit: Je viens de remarquer que Mozilla utilise également
dominant-baseline:baseline
ce qui est définitivement faux: ce n'est même pas une valeur reconnue! Je suppose que c'est par défaut la police par défaut, c'est-à-alphabetic
dire qu'ils ont eu de la chance.Plus d'édition: Safari (11.1.2) comprend
text-before-edge
mais pastext-after-edge
. Il échoue égalementideographic
. Super truc, Apple. Vous pourriez donc être obligé d'utiliseralphabetic
et d'autoriser les descendeurs après tout. Désolé.la source