SVG permet la création de dessins vectoriels à l'intérieur d'un document web.
Le principe du dessin vectoriel est de pouvoir l'agrandir (ou réduire) à l'infini sans perte de qualité. Il est d'ailleurs possible d'utiliser Illustrator ou un autre programme comme Inkscape (open source) pour éviter de coder directement à la main, puisque l'on peut exporter un projet SVG en document web.
Ceci dit, à coeur vaillant rien d'impossible. En effet, l'apprentissage du SVG peut se révéler moins laborieux qu'on pourrait le penser. Basé sur le langage XML, il peut être combiné avec JavaScript et/ou CSS.
Commencer avec SVG
Avant de se lancer dans le SVG, il est donc préférable (mais pas indispensable) d'avoir des notions en XML, ainsi que des connaissances en CSS. En effet, les langages SVG et CSS sont étroitement liés.
La syntaxe du SVG peut aisément être traité grâce à XSLT ou d’autres langages de programmation via DOM ou SAX et inclu dans d’autres documents XML, XHTML ou XUL. SVG peut lui même inclure en son sein différents langages XML.
Pour bien commencer en SVG, il est important de comprendre les bases. Ainsi allons-nous débuter en découvrant comment est composée la structure d'un document SVG.
Structure d'un document SVG
Pour écrire du SVG, nous allons commencer par déclarer le prologue XML puisque, comme nous l'avons déjà dit, SVG est basé sur ce langage.
Dans le code ci-dessus, on indique la version de XML utilisée (version 1.0, la plus utilisée) et l’encodage qui, par défaut, est UTF-8 (il est donc possible de ne pas le spécifier). L'attribut standalone permet de déterminer si la page XML est autonome ou si elle fait appel à un fichier externe. Par défaut, si cet attribut n'est pas renseigné, la valeur est yes.
💡 Attention : les attributs version, encoding et standalone doivent se suivre dans cet ordre.
Au final, seule la version du langage est obligatoire. Passons la syntaxe XML, et intéressons-nous au SVG.
Nous allons commencer par inclure la balise <svg> et de conclure par la même balise fermée :
<svg>
//code ici
</svg>
Ensuite, il va falloir renseigner des attributs (ici l'ordre n'a pas d'importance) :
<svg width="" height="" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="x y L H">
</svg>
xmlns : il s'agit de l'espace de nom du SVG.
version : correspond à la version du langage.
width : la largeur du document.
height : la hauteur du document.
viewBox : avec un B majuscule. Permet de définir le système de coordonnées (x,y), gère l'aspect ratio et donc le redimensionnement (surtout sur le navigateur Internet Explorer).
Et voici le même code réduit à sa plus simple expression, puisque HTML5 le permet :
<svg viewBox="x y L H">
</svg>
Vous pouvez omettre la hauteur (H) et la largeur (L) mais si vous souhaitez que le document soit responsive, il est préférable de renseigner ces deux attributs.
Par ailleurs, sachez qu'il est tout à fait possible de mettre la hauteur et la largeur du SVG dans une feuille de style CSS.
svg {
height: 2rem;
width: 2rem
}
Inclure du SVG dans du HTML (pour navigateurs modernes) :
Il existe différentes manières d'inclure un fichier SVG dans un document HTML, chacune ayant ses avantages et ses inconvénients.
1- Comme une image avec l'élément remplacé HTML img :
<img src="image.svg" alt="description de votre image">
2- Comme un arrière-plan (propriété CSS background-image) :
.class {
background-image: url(image.svg);
}
3- Directement dans le document HTML (inline). Ci-dessous une icône en SVG :
On ne s'attarde pas sur les balises <embed>, <object> et <iframe> qui ne sont ni d'actualité ni recommandées.
Les formes SVG
Dans ce chapitre, vous pourrez découvrir les formes de base en SVG : rectangles, cercles, lignes... ainsi que des formes plus complexes avec les chemins.
Le texte en SVG est élément graphique au même titre que les formes. On peut le styliser avec SVG bien entendu mais également avec CSS, sachant que les propriétés sont plus ou moins les mêmes dans l'ensemble et produisent les mêmes effets.
Il n'existe pas de balise <link> en SVG (voir SVG2), ce qui signifie qu'on ne peut faire un lien vers un fichier externe. Cependant, il est possible de passer par une PI, propre au langage XML. Elle se présente sous cette forme :
💡 Nous venons de voir trois méthodes pour insérer du CSS dans un document SVG. Vous vous demanderez, à juste titre, laquelle choisir. Je vous répondrai que cela dépend de plusieurs facteurs. Dans tous les cas, vous pouvez utiliser chaque méthode, et même les trois à la fois.
Priorité des styles :
En SVG, certaines propriétés CSS peuvent être définies à l’aide d’attributs SVG et inversement. Vous pouvez voir la liste des propriétés dans cet article (EN).
Les attributs de présentation en SVG sont considérés comme de bas niveau, c'est-à-dire qu'ils vont être écrasés par le style CSS (que ce soit en ligne ou externe).
Dans le code ci-dessous, nous avons défini une couleur en CSS, une autre avec l'attribut fill. C'est le style CSS qui sera appliqué, peu importe la position dans le code.
Il est tout à fait possible de manipuler des éléments SVG grâce au langage JavaScript (ou plutôt EcmaScript) lorsque le SVG est intégré sur une page HTML. Vous pouvez utiliser, soit du pur JavaScript, soit une bibliothèque JavaScript.
Dessinons un carré en SVG et appliquons une couleur via l'attribut fill en pur JavaScript :
Dans l'exemple ci-dessus, nous avons utilisé la fonction JavaScript document.getElementById(). Celle-ci permet de rattacher un élément par un identifiant unique afin de pouvoir le manipuler.
Pour inclure du JavaScript au sein d'un fichier SVG, vous pouvez soit le mettre entre deux balises <script></script>, soit faire appel au fichier via l'attribut src dans la balise <script>.
Maintenant nous allons changer la couleur en cliquant sur un bouton (grâce à l'évènement JavaScript onclick) :
Le morphing SVG consiste à animer des formes afin d'obtenir une transformation en manipulant les coordonnées des points constituant des éléments graphique SVG.
A l'origine, SVG Tiny, était destinée aux terminaux mobiles afin de pouvoir afficher des graphiques vectoriels en 2D interactifs et animés. Puis avec la version 1.1, cela s'est étendu aux ordinateurs de bureau.
En recommandation W3C, la version Tiny 1.2 est une mise à jour de la précédente version proposant principalement une meilleure gestion du texte et du multimédia (audio et vidéo pour une alternative à Flash, mort depuis). Elle intègre également des méta-données afin de prendre en compte les objectifs du Web sémantique et met l'accent sur les scripts intégrés orientés objet ainsi que les feuilles de style XSL.
SVG Tiny se veut moins gourmand en ressources car basé sur un DOM simplifié (micro DOM), amputé de certaines fonctionnalités comme l'écrêtage, les masques, les symboles ou les effets de filtre. Par ailleurs, dans la version 1.1, l'opacité ainsi que les dégradés ont été retirés puis introduits de nouveau dans la version 1.2.
Présentation SVG 2
Petit tour d'horizon pour vous présenter quelques nouvelles fonctionnalités qui font leur apparition dans la nouvelle version SVG.