Notes extraites du tutoriel MDN
SVG, pour Scalable Vector Graphics (ou encore Graphismes vectoriels redimensionnables), est un langage basé sur le XML du W3C qui permet de définir des éléments graphiques avec des balises.
L’intérêt d’un format vectoriel est que l’image peut être manipulée sans perte de qualité (agrandissement, déformation, couleurs, …). Une image SVG est souvent aussi plus légère que son rendu matriciel (export au format PNG ou JPG).
Celà est d’autant plus intéressant dans le contexte du Web car le contenu d’un fichier SVG est directement accessible via le DOM et peut être modifié avec du CSS ou du Javascript.
Le format est pris en charge par les principaux navigateurs.
Le code du fichier SVG ci-dessous est collé directement dans le document à l’endroit souhaité. Il s’agit du logo de la fondation avec 3 carrés de couleur et 3 zones de texte :
<svg id="logo-imts" width="183" height="80" version="1.1" viewBox="0 0 183 80" xmlns="http://www.w3.org/2000/svg">
<rect id="carre-vert" x=".35296" y="15.171" width="14.086" height="15.277" fill="#8ebe1c"/>
<rect id="carre-rose" x="22.362" y="26.305" width="14.086" height="14.966" fill="#e7007c"/>
<rect id="carre-bleu" x="14.439" y=".25694" width="14.137" height="14.914" fill="#046db4"/>
<text id="txt-ins" transform="scale(.9807 1.0197)" x="46.699856" y="40.854664" font-family="sans-serif" font-size="15.022px" stroke-width=".72522" style="line-height:1.25" xml:space="preserve">INSTITUT</text>
<text id="txt-mt" transform="scale(.99205 1.008)" x="46.423439" y="60.651131" font-family="Candara" font-size="19.821px" font-weight="bold" stroke-width=".95688" style="line-height:1.25" xml:space="preserve">MARIE-THÉRÈSE</text>
<text id="txt-sol" transform="scale(.9802 1.0202)" x="46.431408" y="78.290649" font-family="sans-serif" font-size="19.674px" stroke-width=".94881" style="line-height:1.25" xml:space="preserve">SOLACROUP</text>
</svg>
Les éléments du fichier sont directement accessibles avec les sélecteurs CSS. Par exemple :
Si le rendu SVG n’est pas disponible, la balise object
permet d’inclure un fallback (solution de repli), comme par exemple un texte :
<object id="logo-object" data="logo_opt.svg" type="image/svg+xml" width="250px" >
SVG n'est pas pris en compte par votre navigateur, désolé.
</object>
Ci-dessous, un exemple avec fallback dans une balise img
avec un format supporté d’image.
<object id="logo-object" data="logo_opt.svg" type="image/svg+xml" width="250px" >
<img src="logo_opt.png" alt="Logo Institut Marie-Thérèse Solacroup">
</object>
Le contenu du fichier est accessible comme arbre DOM via la propriété contentDocument
de l’élément object
. Il est ensuite possible de modifier chaque élément avec CSS ou en javascript.
var contenu_svg = document.getElementById('logo-object').contentDocument
<img src="logo_opt.svg" alt="Logo Institut Marie-Thérèse Solacroup" />
L’élément se comporte alors comme une image, ses propriétés ne sont pas accessibles dans le DOM.
Cette méthode ne présente pas grand intérêt si ce n’est de modifier à minima le code de vos pages si vous modifiez le format de certaines images.
Soit l’image SVG suivante, incluse dans votre page via la méthode 1 :
<svg id="logo-imts-anim" width="183" height="80" version="1.1" viewBox="0 0 183 80" xmlns="http://www.w3.org/2000/svg">
<rect id="carre-vert" class="vert" x=".35" y="15.17" width="14.09" height="15.28" />
<rect id="carre-rose" class="rose" x="22.36" y="26.31" width="14.09" height="14.97" />
<rect id="carre-bleu" class="bleu" x="14.44" y=".26" width="14.14" height="14.91" />
<text id="txt-mt" transform="scale(.99 1.01)" x="46.42" y="60.65" font-family="Candara" font-size="19.8px" font-weight="bold" stroke-width=".96" style="line-height:1.25" xml:space="preserve">MARIE-THÉRÈSE</text>
<text id="txt-ins" transform="scale(.98 1.02)" x="46.7" y="40.85" font-family="sans-serif" font-size="15px" stroke-width=".73" style="line-height:1.25" xml:space="preserve">INSTITUT</text>
<text id="txt-sol" transform="scale(.98 1.02)" x="46.43" y="78.29" font-family="sans-serif" font-size="19.6px" stroke-width=".95" style="line-height:1.25" xml:space="preserve">SOLACROUP</text>
</svg>
Le code Javascript ci-dessous permet de changer la couleur des carrés via des styles CSS prédéfinis :
/* Utilisation de classes de couleur pour animation Javascript */
.vert {fill:#8ebe1c; transition: 1s;}
.rose {fill:#e7007c; transition: 1s;}
.bleu {fill:#046db4; transition: 1s;}
// Récupération de l'élément correspondant au logo
var el = document.getElementById('logo-imts');
el.onmouseover = logoOver; // Fonction lancée au survol de la souris
el.onmouseout = logoOut; // Fonction lancée à la sortie de la souris
function logoOver() {
// Survol de souris : Modifie des classes de styles des éléments
el.getElementById('carre-vert').classList.remove('vert');
el.getElementById('carre-rose').classList.remove('rose');
el.getElementById('carre-bleu').classList.remove('bleu');
el.getElementById('carre-vert').classList.add('bleu');
el.getElementById('carre-rose').classList.add('vert');
el.getElementById('carre-bleu').classList.add('rose');
}
function logoOut() {
// Sortie de souris : Restaure les classes de styles des éléments
el.getElementById('carre-vert').classList.remove('bleu');
el.getElementById('carre-rose').classList.remove('vert');
el.getElementById('carre-bleu').classList.remove('rose');
el.getElementById('carre-vert').classList.add('vert');
el.getElementById('carre-rose').classList.add('rose');
el.getElementById('carre-bleu').classList.add('bleu');
}
Inkscape est un outil puissant et gratuit pour la création d’images vectorielles (équivalent gratuit d’Illustrator).
Il permet notamment de créer des logos assez facilement, mais les fichiers SVG créés ne sont pas optimisés pour le web car ils contiennent beaucoup de méta-information utilisées par l’éditeur.
Pour préparer vos images SVG pour le web, voici quelques conseils :
<svg>
dans votre page htmlUne version zip des exercices est téléchargeable ci-dessous. Cette version est un instantanné, une version plus à jour est disponible sur un dépôt GIT.
git clone https://gitlab.com/imts/images-svg .