Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Dans ce chapitre je vais vous montrer comment encoder directement en SVG dans une page web pour dessiner :
Vous allez constater que le langage SVG ressemble beaucoup au langage HTML. Vous retrouvez des instructions construites à partir d'une balise suivie d'attributs dont style et class. Ce qui signifie que vous pouvez styler les formes SVG via le CSS.
Pour info la feuille de style interne de cette page :
...
svg{display : block ; margin : 10px auto; border : 1px solid black}
rect.joli {fill : red; fill-opacity : 0.5 ; stroke-width : 10;
stroke : green; stroke-opacity : 0.5 ;}
...
Je définis deux règles de style relatives à l'élément SVG et une autre pour les éléments RECT affectés de la classe "joli".
SVG est un élément du langage HTML5.
Par contre RECT est un élément du langage SVG.
L'élément SVG définit un repère cartésien dont les caractéristiques sont établies par l'attribut viewBox
(OU à défaut par les attributs width & height).
Attention l'origine du repère cartésien est situé en haut à gauche !
Dans une page web, le code SVG doit être contenu à l'intérieur du conteneur SVG.
Pour dessiner un rectangle il faut utiliser l'élément rect avec les attributs x,y, width & height.
Les attributs x & y indiquent les coordonnées du coin supérieur gauche du rectangle.
Comme je ne précise la couleur de remplissage, les rectangles sont remplis de noir (couleur par défaut).
Concernant le deuxième rectangle, les angles sont arrondis car il y a deux attributs supplémentaires :
rx & ry : rayon horizontal et rayon vertical de chaque arrondi.
Si un seul de ces attributs est précisé, ils sont supposés être égaux (rx = ry).
Remarquez que la balise SVG contient l'attribut viewBox et que la valeur
de l'attribut width est un pourcentage (50%).
Ce qui signifie que l'on définit un repère cartésien de 400 par 200 qui sera affiché dans la page
web avec une largeur égale à 50% de celle de son conteneur (élément BODY).
Quand à la hauteur de la zone de dessin elle sera toujours égale à la moitié de la largeur d'affichage ; Le ratio
largeur/hauteur étant défini par le viewBox.
Retenez : les positions et dimensions des formes sont déterminées via l'attribut viewBox OU à défaut par les attributs width & height si l'attribut viewBox est absent.
Le code SVG est identique sauf ajout de ... class ="joli" ... donc je style les rectangles avec
les paramètres de présentation de la classe "joli".
Sous SVG les paramètres de présentation peuvent être passés en propriétés CSS ou en attributs.
J'aurais pu écrire :
Rappel : dans un canevas SVG le point d'origine du repère cartésien est le coin haut gauche.
Si vous voulez être productif (coder vite et bien) je vous conseille de passer par le stade croquis sur une feuille de papier millimétrée (ou une feuille à petit carreaux) avant de vouloir coder en SVG.
La balise SVG est obligatoirement double (une balise début et une balise fin) et délimite le code SVG.
Dans le cadre de SVG interne (code SVG inclus dans une page web) la balise SVG est un élément HTML (et non pas un élément SVG). On ne peut donc pas lui appliquer les paramètres de présentation spécifiques aux éléments SVG tels fill, stroke, etc. Mais on peut lui applquer les propriétés CSS de toute boite HTML : background, border, box-shadow, etc.
Ces éléments sont tantôt des balises simples et tantôt des balises doubles.
Un élément de forme est obligatoirement une balise double s'il contient un autre élément.
Cette situation est fréquente en cas d'animation d'un objet ; vous avez alors la syntaxe suivante :
Ici l'élément circle contient l'élément animate donc la balise circle est double.
Si l'élément de forme ne contient aucune autre élément, il s'agit alors d'une balise simple mais bien fermée comme dans l'exemple ci-dessous :
L'élement rect est ici une balise simple mais bien fermée : une barre oblique avant la parenthèse angulaire fermante.
L'attribut viewBox est absent donc les caractéristiques du repère cartésien sont définies par les
attributs width & height (exprimés alors de façon implicite en pixels).
La zone de dessin s'affichera toujours avec 400 pixels de large et 200 de haut quelque soit l'écran,
donc ce canevas n'est pas "responsive" !
Pour dessiner un cercle il faut utiliser l'élément circle :
Nous avons à cette fin utiliser les paramètres de présentation sous forme d'attributs sauf pour le quatrième cercle où nous avons passés ces paramètres sous forme de propriétés.
En SVG les paramètres de présentation peuvent être passés en attributs OU en propriétés CSS.
Par contre les paramètres géométriques (r,width,height,cx,cy,x,y,rx,ry) doivent impérativement être manipulés en tant qu'attributs
de balise.
Dans le cadre de la version 2 de SVG il est prévu que tous les paramètres pourront être passés indifféremment en attributs ou en
propriétés CSS.
Seul le navigateur Chrome prend en compte à ce jour cette simplification notable de la syntaxe SVG.
Pour les paramètres fill-opacity, stroke-opacity la valeur va de 1 (opacité totale) à 0 (transparence totale).
Attention si vous dessinez un cercle de rayon 40 pixels dont l'épaisseur du contour est 10 pixels le rayon total du rond sera 45px ! En effet le contour est à la moitié à l'intérieur de la forme et à moitié à l'extérieur de la forme.
Si vous souhaitez que tous les cercles aient le même style vous pouvez bien sûr créer une règle CSS relative au sélecteur "circle" dans la feuille de style interne de la page :
...
// styler les éléments HTML
body {...
h1,h2 {...
img {...
svg {...
// styler les éléments SVG
circle {fill : green ; stroke-width : 5px ; stroke : red ; }
rect {fill : ...
line {...}
...
Vous pouvez aussi définir des classes génériques ou spécifiques à un type d'élément.
...
circle.style1 {fill : ... ; stroke : ...}
circle.style2 {fill : ... ; stroke : ...}
.ukraine {fill : yellow ; stroke : blue ; ...}
...
Vous devrez alors écrire dans le conteneur SVG :