SVG: Les éléments de base

Prologue

Le prologue est la première instruction de tout fichier SVG. Il indique la version XML utilisée.

<?xml version="1.0" encoding="utf-8"?>
<svg width="100" height="100">
  ...
</svg>

SVG

Une image SVG est entièrement contenue dans une balise svg.
À l’intérieur de la balise svg, on peut placer différentes formes, comme des rectangles, lignes, cercles, etc.

Attributs: width, height

Les attributs width et height spécifient la taille d’affichage du SVG.
Si l’unité n’est pas précisé, il s’agit par défaut de pixels.

Par exemple, pour créer une image SVG (vide) de 100px par 100px:

<svg width="100px" height="100px"></svg>

Attribut: viewBox

L’attribut viewBox définit les dimensions du dessin.
Les dimensions du viewbox n’ont pas d’unité, pas plus que les attributs de largeur et de hauteur des éléments à l’intérieur du SVG. La raison est simple: un SVG peut être agrandit ou rétrécit à volonté — notamment avec width et height.

Le viewBox définit les valeurs suivantes (séparées par des espaces ou des virgules):

viewBox="min-x min-y width height"

Par exemple, pour spécifier que le SVG doit être affiché sur 200px par 200px, on utilise les attributs width et height; et pour spécifier que les dimensions du SVG est 100 par 100, on utilise l’attribut viewBox — chaque unité du SVG vaut donc deux pixels, on double la taille du contenu.

<svg width="200" height="200" viewBox="0 0 100 100">

Si on ne définit pas de viewbox, les dimensions du SVG sont considérés être la taille d’affichage.
JSFiddle viewbox

Attribut: preserveAspectRatio

Lorsqu’on redimensionne l’image, par défaut, le ratio des formes est toujours respecté et le contenu du SVG est centré au milieu. Ce comportement peut être modifié avec l’attribut preserveAspectRatio. JSFiddle preserveAspectRatio.

<svg width="100" height="50" viewBox="0 0 100 100" preserveAspectRatio="none">
default none

Inception

Contrairement à HTML, un élément SVG peut inclure d’autres éléments SVG. Il est donc possible d’utiliser différents systèmes de coordonnées, en définissent les attributs viewBox, width et height de ce sous-document.

<svg width="100" height="100">
  <svg width="100" height="100" viewBox="0 0 50 50">
    <circle cx="25" cy="25" r="25" fill="blue" />
  </svg>
  <circle cx="25" cy="25" r="25" fill="red" />
</svg>

rect

La balise rect permet d’afficher un rectangle de taille widthxheight.
Le coin supérieur gauche du rectangle est positionné au point (x,y).

<rect x="5" y="5" width="50" height="90" fill="white" />

Par arrondir les coins, définir les attributs rx et ry.

<rect x="5"  y="5"  rx="5" ry="5"  width="45" height="45" fill="white" />
<rect x="50" y="50" rx="5" ry="15" width="45" height="45" fill="white" />

circle

La balise circle permet de dessiner un cercle de rayon r.
Le centre du cercle est positionné au point (cx, cy).

<circle cx="20" cy="20" r="15" fill="white" />

ellipse

La balise ellipse permet de dessiner une ellipse de rayon horizontal rx et de rayon vertical ry.
Le centre de l’ellipse est positionné au point (cx, cy).

<ellipse cx="20" cy="20" rx="15" ry="5" fill="white" />

line

La balise line permet de tracer une ligne droite entre le point (x1, y1) et le point (x2, y2).

<line x1="10" y1="10" x2="50" y2="50" stroke="white" stroke-width="5" />

polyline

La balise polyline permet de tracer des lignes droites entre plusieurs points.
Les différents points peuvent être séparés par des virgules ou des espaces.

<polyline points="10 10, 15 20, 20 15, 25 30, 30 25, 35 40, 40 35, 45 50, 50 45, 80 10"
          stroke="white" stroke-width="5" fill="red" />

polygon

La balise polygon permet de tracer des lignes droites entre plusieurs points, même principe que polyline à la différence près qu’on crée une forme fermée.

<polygon points="10 10, 15 20, 20 15, 25 30, 30 25, 35 40, 40 35, 45 50, 50 45, 80 10"
         stroke="white" stroke-width="5" fill="red" />

path

La balise path permet de créer des formes complexes à partir d’une série de lignes droites et courbes.
L’attribut d définit la liste des commandes a exécuter. Chaque commande est représentée par une lettre spécifique et est suivit de paramètres. Par exemple, M20,30 déplace le curseur à la position (20,30)

Les deux nombres de chaque point peuvent être séparés par une virgule ou un espace.

<path d="M20,30 Q40,5 50,30 T90,30" stroke="white" stroke-width="5" />

Toutes les commandes peuvent être appelées soit avec

Les différentes commandes sont:

Commande Nom Description
Mx,y Move Se déplacer vers le point (x,y), sans rien tracer
Lx,y LineTo Tracer une ligne droite vers le point (x,y)
Hx Horizontal lineTo Tracer une ligne droite vers le point (x,.)
Vy Vertical lineTo Tracer une ligne droite vers le point (.,y)
Z ClosePath Fermer le chemin. Trace une ligne droite de la position actuelle au premier point du chemin
Cx1 y1, x2 y2, x y Cubic Bezier Tracer une courbe de Bézier cubique entre la position actuelle et (x,y).
(x1,y1) et (x2,y2) sont les points de contrôle de la courbe
Sx2 y2, x y Shorthand Tracer une courbe de Bézier cubique entre la position actuelle et (x,y).
Le premier point de contrôle est automatiquement calculé pour être symétrique au dernier point de contrôle de la commande qui le précéde (S ou C).
(x2,y2) est le deuxième point de contrôle de la courbe.
Qx1 y1, x y Quadratic Bezier Tracer une courbe de Bézier quadratique entre la position actuelle et (x,y).
(x1,y1) est le point de contrôle de la courbe
Tx y Shorthand Tracer une courbe de Bézier quadratique entre la position actuelle et (x,y).
Le point de contrôle est automatiquement calculé pour être symétrique point de contrôle de la commande qui le précéde (Q ou T).
Arx ry 0 0 1 x y Elliptical Arc Tracer un arc entre la position actuelle et (x,y), de rayon horizontal rx et de rayon vertical ry. Voir MDN pour la liste complète des paramètres de Arc

text

La balise text permet d’ajouter du texte dans le SVG.
Par défaut, le point (x,y) désigne la position du coin inférieur gauche du texte.
Il est possible de modifier ce comportement, et modifier l’alignement horizontal de l’élément, avec l’attribut text-anchor

<text x="5" y="15" fill="white">Hello World</text>
Hello World

text-anchor

tspan

La balise tspan doit être un enfant de text ou tspan. Elle permet de baliser des sous-parties de texte.

<text x="5" y="15" fill="white">
  This is <tspan font-weight="bold" fill="red">bold</tspan>
</text>
This is bold

Les attributs dx et dy permettent de décaler l’élément par rapport à sa position d’origine.
Ça permet par exemple d’ajouter des retours à la ligne.

<text x="5" y="15" fill="white">
  <tspan>A</tspan>
  <tspan x="5" dy="1em">B</tspan>
  <tspan x="5" dy="1em">C</tspan>
</text>
A B C

textPath

La balise textPath permet de placer du texte sur une ligne définit par un élément path.
Attention, si le texte dépasse la ligne, il est tronqué.

<path id="MyPath" fill="none" stroke="red"
        d="M10,90 Q90,90 90,45 Q90,10 50,10 Q10,10 10,40 Q10,70 45,70 Q70,70 75,50" />
<text fill="white">
  <textPath href="#MyPath">The quick brown fox jumps over the lazy dog.</textPath>
</text>
The quick brown fox jumps over the lazy dog.

g

La balise g (pour groupe) permet de grouper un ensemble de formes, un peu à la manière d’un div en HTML. Cette balise peut être utile 1. pour que le code soit plus compréhensible 2. pour appliquer des interractions utilisateur (comme :hover) 3. pour appliquer des transformations sur plusieurs formes (transform) 4. pour appliquer un même style (fill, stroke, etc) sur plusieurs éléments.

<style>
  g:hover * { fill: green; }
</style>
<g>
  <rect x="5" y="5" width="50" height="50" fill="white" />
  <rect x="20" y="20" width="50" height="50" fill="red" />
</g>

image

La balise image permet d’insérer une image (vectorielle ou bitmap) dans le document SVG.

<image width="128" height="146" xlink:href="https://mdn.mozillademos.org/files/6457/mdn_logo_only_color.png" />

foreignObject

La balise foreignObject permet d’inclure à l’intérieur du SVG des éléments d’un espace de noms XML différent. Dans le contexte d’un navigateur web, il s’agit généralement d’inclure du XHTML/HTML. Dans le cas d’un SVG intégré dans du HTML, le namespace XHTML peut être omis, mais il est obligatoire dans le contexte d’un document SVG standalone.

<foreignObject x="20" y="20" width="160" height="160">
  <div xmlns="http://www.w3.org/1999/xhtml" style="font-size: 28px; overflow: auto; height: 100%;">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  </div>
</foreignObject>
Lorem ipsum dolor sit amet, consectetur adipiscing elit.

switch

La balise switch affiche le premier élément enfant dont les attributs requiredFeatures, requiredExtensions et systemLanguage sont évalués à vrai. Les attributs non spécifiés valent vrai: un élément sans aucun attribut sera forcemment affiché si aucun élément n’a été affiché avant lui — ce qui revient à définir une valeur par défaut.

L’exemple suivant affiche un texte différent suivant les paramètres de langue du navigateur, ou affiche un emoji si la langue de l’utilisateur n’est pas dans la liste:

 <switch>
    <text systemLanguage="ar">مرحبا</text>
    <text systemLanguage="de,nl">Hallo!</text>
    <text systemLanguage="en">Hello!</text>
    <text systemLanguage="en-us">Howdy!</text>
    <text systemLanguage="en-gb">Wotcha!</text>
    <text systemLanguage="en-au">G'day!</text>
    <text systemLanguage="es">Hola!</text>
    <text systemLanguage="fr">Bonjour!</text>
    <text systemLanguage="ja">こんにちは</text>
    <text systemLanguage="ru">Привет!</text>
    <text></text>
 </switch>
مرحبا Hallo! Hello! Howdy! Wotcha! G'day! Hola! Bonjour! こんにちは Привет!