Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Graphisme > Divers > Le SVG > Les graphiques vectoriels > Le texte > Lecture du tutoriel

Le texte

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : dark_popol
Note : 18 / 20 (2 votes)
Visualisations : 2 472

Plus d'informations Plus d'informations
La première chose que j'ai à vous dire à propos du texte en SVG est malheureusement une mauvaise nouvelle : le SVG ne gère pas les blocs de texte. :(

En xHTML, nous avons la balise <p> : on peut y écrire autant de texte que l'on désire, puis on lui indique une largeur et une hauteur à l'aide du CSS, et le texte est automatiquement placé pour entrer dans ce bloc.

Ce concept est absent du SVG 1.1 : il ne gère le texte que sur une seule ligne.
Heureusement, nous apprendrons une technique pour contourner cette lacune :) ,
et encore plus heureusement, la prochaine version du SVG, 1.2, devrait corriger cela ! :D
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire

Un texte simple

Comme je vous l'ai dit, le SVG ne gère actuellement que le texte sur une ligne.

Voyons donc comment ajouter des lignes de texte dans nos documents !

Un texte simple



La balise à utiliser pour ajouter du texte est... <text> !

Code : XML
1
2
3
...
<text>Du texte en SVG !</text>
...


Bien sûr, rien ne s'affiche car nous n'avons pas indiqué de position pour notre texte. C'est donc ce que nous allons faire, à l'aide des attributs x et y de la balise <text> :
Code : XML
1
2
3
...
<text x="300" y="250">Du texte en SVG !</text>
...

Le point (x,y) indique le point en bas à gauche de la première lettre du texte :

Image utilisateur


C'est tout ce que je vous montre au niveau SVG pour l'instant. Voyons maintenant tout plein de propriétés CSS pour colorier et styliser ce texte ma foi un peu fade !

La plupart de ces propriétés sont les mêmes qu'en xHTML, donc pas beaucoup de nouveautés pour les connaisseurs. Mais ne négligez pas cette partie, car il y a quand même quelques particularités !

Styliser votre texte

Stylisons un peu ce texte !



Couleurs de trait et de remplissage


Ici, pas de changement : ce sont exactement les mêmes propriétés que pour toutes les autres formes en SVG.

fill : couleur de remplissage
stroke : couleur du trait

Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;">Du texte en SVG !</text>
...


Ici, on ne peut quasiment pas voir la couleur de remplissage, car le texte est trop petit.

Voyons donc comment augmenter sa taille !

Taille du texte



Cela se fera grâce à la propriété font-size.
On lui met une valeur en pixels, mais cette fois il faudra écrire "px" (pour pixel) à la suite de la valeur numérique :Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;">Du texte en SVG !</text>
...
Ce code fonctionne aussi sous IE sans le "px", mais Firefox, lui, ne reconnaît la propriété que si on indique bien que c'est une valeur en pixels.


Italique


On met un texte en italique avec la propriété font-style.

Comme valeur, on spécifie soit italic pour mettre le texte en italique, ou normal, qui est la valeur par défaut (pas de mise en italique), pour contrer l'héritage.Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-style:italic;">Du texte en SVG !</text>
...


Graisse du texte

(j'adore cette expression ! :p )
Pour indiquer si un texte doit être mis en gras ou non, on utilisera la propriété font-weight.

Encore une fois, deux valeurs possibles :
Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-weight:bold;">Du texte en SVG !</text>
...


Bonjour, la police !

(ah le folklore québécois ! :D ...)
(Ce titre ne parle qu'aux québécois ! :lol: )
Pour indiquer quelle police utiliser pour écrire un texte, c'est la propriété font-family qui nous sera utile.

À l'intérieur de celle-ci, vous devez indiquer une liste de polices.

Si la personne qui visionne votre document n'a pas la première police, son navigateur essaiera la deuxième, s'il ne l'a pas non plus, il essaiera la troisième, si... (enfin bref, vous voyez le concept ;) ).

On termine généralement la liste par le mot-clé serif, qui signifie : "Si tu n'as aucune des polices précédentes, utilise une police standard."

Un exemple :Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;">Du texte en SVG !</text>
...
Remarquez les apostrophes ('') autour de Trebuchet MS ; les noms de polices comportant des espaces doivent en être encadrés.
Petite info en + : contrairement au xHTML où l'on se sert plutôt des guillements ("") pour encadrer les noms de polices comportant des espaces, en SVG on utilise les apostrophes (''), car nous sommes déja dans l'attribut style, dont le contenu est délimité par des guillemets. Si on en ajoute d'autres autour de Trebuchet MS, il y aura erreur de syntaxe !


Mais le SVG fait mieux que le xHTML au moins sur un point : il permet d'incorporer nos propres polices ! (avec tout plein de jolis tracés ! :D )
Je vous parlerai peut-être des polices incorporées plus en détails dans un prochain chapitre.

Décoration du texte


En SVG, c'est la propriété text-decoration qui permet de décorer le texte.

Elle peut prendre deux valeurs :Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;text-decoration:overline;">Du texte en SVG !</text>
...

Note : cette propriété ne fonctionne pas du tout sous Firefox.

Alignement du texte


Par défaut, le point spécifié dans les attributs x et y de la balise <text> indique le point en bas à gauche de la première lettre du texte. Mais il est possible de changer cela, grâce à la propriété text-anchor. Les valeurs possibles pour cette propriété sont :Voici quelques exemples, ainsi que leurs résultats :

Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;text-anchor:start;">Du texte en SVG !</text>
...

Résultat :

Image utilisateur

Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;text-anchor:middle;">Du texte en SVG !</text>
...

Résultat :
Image utilisateur

Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;text-anchor:end;">Du texte en SVG !</text>
...

Résultat :

Image utilisateur

Espacement des lettres et des mots


Pour changer l'espacement des mots et celui des lettres, on utilise respectivement les propriétés word-spacing et letter-spacing. Elles demandent toutes deux des valeurs en pixels :Code : XML
1
2
3
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;word-spacing:20;letter-spacing:5;">Du texte en SVG !</text>
...

Ici, les lettres seront espacées de 5 pixels et les mots de 20.
Firefox ne gère pas ces deux propriétés


Autres styles de trait


Toutes les propriétés que vous avez apprises dans le chapitre précédent peuvent aussi être utilisées sur du texte !
Exemple :Code : XML
1
2
3
...
<text x="50" y="250" style="fill:yellow;stroke:#abcdef;font-size:90px;stroke-width:5;stroke-linejoin:round;stroke-linecap:round;stroke-dasharray:5,12;">Du texte en SVG !</text>
...

Résultat :

Image utilisateur

Du texte plus complexe !

La balise <tspan>



Plusieurs lignes de texte !


Pour commencer cette partie, je vous montre l'astuce permettant de faire du texte sur plusieurs lignes.

Certains de vous diront sûrement :Citation : Zéros qui ne pensent pas à la sémantique
"Mais nous n'avons qu'à séparer notre texte en plusieurs balises <text>, que l'on positionne différemment à l'aide de leurs attributs x et y !"


Il est vrai que cette façon fonctionne, mais ce serait ne pas respecter la sémantique, car votre texte ne serait pas contenu entièrement dans la même balise.

C'est pourquoi il existe une balise <tspan> (t pour texte). C'est une balise fille de <text>. En fait, elles ont exactement les mêmes attributs. Pratiquement, chaque ligne de votre texte sera incluse entre deux balises <tspan> et </tspan>, auxquelles vous attribuerez des attributs "y" différents.

Exemple :Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;">
Du texte en SVG !
<tspan x="300" y="280" style="fill:black;stroke:none;font-size:30px;font-family:'Trebuchet MS', Verdana, serif;">
Et puis ce texte qui le suit,
</tspan>
<tspan x="300" y="310" style="fill:black;stroke:none;font-size:30px;font-family:'Trebuchet MS', Verdana, serif;">
inclus dans des balises &#60;tspan&#62;,
</tspan>
<tspan x="300" y="340" style="fill:black;stroke:none;font-size:30px;font-family:'Trebuchet MS', Verdana, serif;">
ce qui permet de faire plusieurs
</tspan>
<tspan x="300" y="370" style="fill:black;stroke:none;font-size:30px;font-family:'Trebuchet MS', Verdana, serif;">
lignes de texte en respectant</tspan>
<tspan x="300" y="400" style="fill:black;stroke:none;font-size:30px;font-family:'Trebuchet MS', Verdana, serif;">
la s&#233;mantique !
</tspan>
</text>
...


Analysons ce code depuis le début.
  1. D'abord la balise <text>, qui contient la première ligne de texte, avec son style.
  2. Ensuite, plusieurs balises <tspan> positionnées verticalement à 30 pixels l'une de l'autre, grâce à l'attribut y. Leur attribut style est identique.
  3. Finalement, la balise </text>, qui referme le tout !
Remarquez les code d'entités ASCII des caractères spéciaux (&#60;, &#62; et &#233, respectivement <,> et é). Comme lorsqu'on utilisait accesskey pour indiquer le début d'une animation, vous devez les utiliser si vous voulez écrire des caractères spéciaux dans vos balises de texte.

Remarquez aussi la lisibilité de mon code : je passe une ligne après chaque balise, et je vous recommande de le faire aussi, sinon vos codes deviendront bientôt complètement illisibles.


Mais il y a une petite chose que l'on pourrait améliorer pour rendre ce code encore plus lisible : chaque balise <tspan> a son propre attribut style, mais ils sont tous identiques ; cela ajoute beaucoup de lourdeur au code.

Néanmoins, ces attributs sont nécessaires, car sans eux les différentes lignes de texte prendraient le style de leur balise parente <text>, conformément à l'héritage, ce qui ne produirait pas le résultat voulu.

Nous allons donc ajouter une aute balise <tspan>, englobant toutes les autres. Nous lui donnerons un attribut style, et nous enlèverons tous les autres attributs style des balise <tspan> de lignes.

En l'absence d'attribut style, elles prendront le style de leur parente, qui ne sera pas en l'occurrence <text>, mais plutôt <tspan> :

Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;">
Du texte en SVG !
<tspan style="fill:black;stroke:none;font-size:30px;font-family:'Trebuchet MS', Verdana, serif;">
<tspan x="300" y="280">
Et puis ce texte qui le suit,
</tspan>
<tspan x="300" y="310">
inclus dans des balises &#60;tspan&#62;,
</tspan>
<tspan x="300" y="340">
ce qui permet de faire plusieurs
</tspan>
<tspan x="300" y="370">
lignes de texte en respectant</tspan>
<tspan x="300" y="400">
la s&#233;mantique !
</tspan>
</tspan>
</text>
...


Mais il reste encore une dernière chose à améliorer avec ce code. En effet, on utilise des positions absolues pour indiquer les positions de chaque ligne. Si on change l'attribut y de la première balise <text>, on n'aura plus les mêmes interlignes.

Pour remédier à cela, nous allons plutôt indiquer les positions des lignes en relatif, à l'aide de l'attribut dy (pour déplacement sur l'axe des Y)de la balise <tspan>.

Celui-ci décale le texte de la ligne à laquelle il est attribué d'un certain nombre de pixels par rapport au dernier attribut y ou dy rencontré.

Pour notre exemple, cela donnerait :Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
...
<text x="300" y="250" style="fill:yellow;stroke:#abcdef;font-size:50px;font-family:'Trebuchet MS', Verdana, serif;">
Du texte en SVG !
<tspan style="fill:black;stroke:none;font-size:30px;font-family:'Trebuchet MS', Verdana, serif;">
<tspan x="300" dy="30">
Et puis ce texte qui le suit,
</tspan>
<tspan x="300" dy="30">
inclus dans des balises &#60;tspan&#62;,
</tspan>
<tspan x="300" dy="30">
ce qui permet de faire plusieurs
</tspan>
<tspan x="300" dy="30">
lignes de texte en respectant</tspan>
<tspan x="300" dy="30">
la s&#233;mantique !
</tspan>
</tspan>
</text>
...


L'attribut rotate


rotate est un attribut des balises <text> et <tspan>. Il sert à retourner chaque caractère individuellement (plutôt que toute la ligne de texte grâce à l'attribut transform).

Vous lui fournissez une liste de valeurs séparées par des virgules. Le premier nombre correspond à l'angle de rotation du premier caractère, le deuxième nombre à celui du deuxième caractère, etc.

Grâce à lui, on peut faire des effets sympa, comme ceci :Code : XML
1
2
3
4
5
...
<text x="370" y="300" rotate="-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10,-10,10" style="stroke:red;fill-opacity:0.7;fill:#27D210;font-size:40px;stroke-width:1;letter-spacing:3px;text-anchor:middle;">
Un texte retourn&#233; de tous c&#244;t&#233;s !
</text>
...


Résultat :

Image utilisateur
L'attribut rotate n'est pas reconnu par Firefox.


La balise <tref />


Cette balise, fille de <text>, vous servira lorsque vous aurez à utiliser plusieurs fois le même texte dans un document.

Vous placerez ce texte dans une balise <text>, que vous inclurez dans <defs> et à laquelle vous affecterez un id.

Puis, lorsque vous voudrez afficher ce texte à l'écran, vous créerez une balise <text>, que vous positionnerez où vous le voudrez, et que vous styliserez à votre gré (ah ! le poète en moi :lol: ).

C'est à l'intérieur de cette balise <text> que vous placerez une balise <tref /> (pour text reference, référence textuelle en anglais), qui appellera votre texte placé dans <defs> à l'aide de l'attribut xlink:href.

(Eh oui, il faudra rajouter le namespace d'XLink dans la balise <svg> externe. Je vous recommande d'ailleurs de le faire pour tous vos documents à partir de maintenant.)

Voici un exemple (je ne vous mets pas la balise <svg>, mais n'oubliez pas d'y inclure un attribut xmlns supplémentaire pour XLink): Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
...
<defs>
<text id="texte_repete">Texte r&#233;p&#233;t&#233; plusieurs fois</text>
</defs>

<text x="50" y="50" style="fill:blue;stroke:yellow;stroke-width:0.6;font-size:20px;">
<tref xlink:href="#texte_repete" />
</text>

<text x="220" y="300" style="fill:blue;stroke:yellow;stroke-width:0.6;font-size:20px;">
<tref xlink:href="#texte_repete" />
</text>

<text x="280" y="120" style="fill:blue;stroke:yellow;stroke-width:0.6;font-size:20px;">
<tref xlink:href="#texte_repete" />
</text>

<text x="320" y="410" style="fill:blue;stroke:yellow;stroke-width:0.6;font-size:20px;">
<tref xlink:href="#texte_repete" />
</text>
...

Ne paniquez pas si ce code n'affiche rien sous Firefox, car la balise <tref> n'est pas reconnu par celui-ci.


La balise <textPath>


Jusqu'à maintenant, nos lignes de texte étaient droites. Mais il est aussi possible qu'elles suivent un tracé, et donc de les courber, grâce à <textPath>, une balise fille de <text>.

Pour ce faire, nous inclurons dans <defs> le tracé (balise <path />), avec un id.

Ensuite, nous mettrons une balise <text>, hors de <defs>. Cette balise <text> contiendra une balise <textPath>, qui appellera le tracé à l'aide d'xlink:href. C'est donc à l'intérieur de <textPath> que vous écrirez votre texte.

Attention : la balise <text> contenant <textPath> n'a pas à avoir d'attributs x et y, car la chaîne de texte commencera toujours au point indiqué par le premier moveto du tracé inclus dans <defs>.

Un exemple complet :Code : XML
1
2
3
4
5
6
7
8
9
...
<defs>
<path id="trace_ondule" d="M70,230 c150,-50 100,200 200,200 s0,-300 400,-200" />  
</defs>

<text style="fill:#FF9844;stroke:#2742EB;stroke-width:1;font-size:30px;">
<textPath xlink:href="#trace_ondule">Un texte qui ondule le long d'un trac&#233;, pour ensuite y remonter...</textPath>
</text>
...

Comme vous le voyez, la balise <text> n'a pas d'attribut de positionnement. La ligne de texte commence au point (70,230), qui est indiqué dans le premier moveto de trace_ondule.

La propriété text-align n'a aucun effet sur <textPath>.


Plusieurs balises combinées !


Notez que nous pouvons toujours combiner ce que nous apprenons.

Par exemple, on pourrait insérer une balise <tref /> à l'intérieur de <textPath>. À ce moment-là, ce serait le texte contenu dans <defs> qui se dessinerait le long du tracé.Code : XML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
...
<defs>
<path id="trace_ondule" d="M70,230 c150,-50 100,200 200,200 s0,-300 400,-200" />  
<text id="texte_ondule">Un texte qui ondule le long d'un trac&#233;, pour ensuite y remonter...</text>
</defs>

<text style="fill:#FF9844;stroke:#2742EB;stroke-width:1;font-size:30px;">
<textPath xlink:href="#trace_ondule"><tref xlink:href="#texte_ondule" /></textPath>
</text>
...

Q.C.M.

Quel attribut permet de positionner des lignes de texte en relatif ?
Quel mot permet d'indiquer une police standard à la fin d'une liste de polices ?
À quoi sert l'attribut rotate des balises <text> et <tspan> ?
Quelle est l'astuce permettant d'alléger le code en supprimant les attributs style des lignes de texte contenues dans des balises <tspan> ?
Par défaut, le point (x,y) désigne quel point de la chaîne textuelle ?

Statistiques de réponses au QCM


Et voilà ! Maintenant vous savez ajouter du texte dans des fichiers SVG et le styliser !
Chapitre précédent Sommaire
Retour en haut Retour en haut


Créé : le 06/12/2005 à 22:39:11
Modifié : le 22/08/2008 à 15:56:33
Avancement : 0%
Licence : Copie non autorisée

3 commentaires

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 148 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.022s (0.0109s)