Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Pour définir un objet (sans le dessiner) il faut que sa description soit dans la partie DEFS du document SVG.
Dans ce chapitre je vais évoquer les modèles à cloner, les motifs, les découpes, les masques et les marqueurs.
En effet j'ai évoqué les dégradés dans le chapitre précédent et je consacre un chapitre entier aux filtres dans le
chapitre qui suit.
Nous devons dessiner 4 carrés identiques : 100 par 100 avec une bordure de 5 bleu marine ; seule la couleur de fond change.
Extrait du code (canevas de 400 par 400) :
Le code est très redondant et donc très maladroit !
Extrait du code correspondant :
J'ai utilisé la balise defs pour définir une modèle de forme : un carré de 100 par 100 borduré de bleu marine et
identifié "carre".
L'attribut href remplace xlink:href ; ce dernier est désormais obsolète.
Ce premier carré ne sera pas dessiné puisqu'il est contenu dans DEFS.
Puis j'emploie la balise use pour dupliquer N fois ce modèle via l'attribut href
Le clonage n'est pas une simple duplication d'un objet.
Si je redéfinis le modèle ; les copies (clones) sont automatiquement modifiées comme vous le constatez ci-dessous.
Il y a donc un lien permanent entre l'original et les copies (les clones).
Je modifie le modèle : coins arrondis et plus de contour.
Les clones sont actualisés !
Un modèle à cloner peut être un groupe d'objets.
Deux parties dans ce code : définition des modèles puis clonage de ces modèles.
On définit en guise de modèles deux groupes de formes.
Notez l'emploi de l'élément G pour regrouper les formes.
Ces groupes de formes ne sont pas dessinés puisqu'ils sont à l'intérieur de DEFS.
La balise use dessine des copies fidèles du modèle. On dit que l'on procéde à un clonage.
L'attribut est "xlink:href" mais le navigateur comprend désormais "href".
Pour définir un modèle à cloner on peut aussi utiliser une autre syntaxe : emploi du conteneur SYMBOL.
Tout objet dessiné dans SYMBOL ne sera pas affiché même s'il n'est pas contenu dans DEFS.
Ci-dessous une image de 800 par 600 avec un modèle "homme" et un modèle "femme"
Là encore il faut distinguer la définition des modèles à cloner et les clonages.
Pour chaque modèle on crée une zone de dessin de 100 par 100 avec l'attribut viewbox.
Les coordonnées des objets constitutifs du modèle sont donc désormais indépendantes du canevas SVG mais liées au viewBox
associé à la balise symbol.
Nous allons voir maintenant que l'on peut remplir un objet avec un motif préalablement défini. Bref produire un fond tel un papier peint.
Un motif est une forme (ou groupe de formes) qui se répète dans toute l'objet cible pour le remplir entièrement.
Un motif peut être aussi une image importée (ou un groupe d'images).
Avant d'utiliser un motif pour remplir une zone du canevas SVG il faut bien entendu le définir.
Pour créer un motif il faut utiliser l'élément PATTERN dans la partie DEFS.
Je définis deux motifs identifiés respectivement motif1 et motif2.
Notez les attributs de la balise pattern : patternUnits, width & height que j'appelle les attributs de répétition.
Ces deux motifs sont pratiquement identiques : une ellipse contenant un cercle.
La seule différence entre les deux motifs c'est au niveau des attributs de répétition :
Pour le premier motif nous avons pour ces trois attributs respectivement les valeurs :
userSpaceOnUse 50 50.
Ce qui veut dire que le motif sera répété tous les 50 pixels dans la zone cible.
Pour le deuxième motif et pour les mêmes attributs nous avons les valeurs :
objectBoundingBox 20% 25%.
Ce qui signifie que le motif sera dupliqué tous les 20% en largeur et 25% en hauteur.
Donc 5 fois en largeur et 4 fois en hauteur.
Notez la valeur de l'attribut fill
Un motif peut être une image matricielle ou un groupe d'images !
Le premier motif est utilisé pour remplir le rectangle haut du canevas et le deuxième motif l'est pour remplir le rectangle bas du canevas.
On peut souhaiter l'effet d'une image vue à travers un trou de serrure ou une paire de jumelles. Il faut alors effectuer un rognage / découpe / détourtage de l'image via une forme simple ou un groupe de formes.
Découpe selon une forme simple.
Grâce au conteneur clipPath on définit ici une découpe simple (une ellipse) dans la partie DEFS.
Notez l'attribut clip-path de la balise IMAGE.
La découpe peut être un groupe de formes.
Ci-dessous et pour info le code de ce fichier svg :
Deux formes (un cercle et un polygone sont contenus dans la balise clippath.
La balise clipPath a un attribut clipPathUnits qui définit le système de coordonnées.
C'est miraculeux ! Je définis une seule découpe que j'applique aux deux images alors
qu'elles ont des paramètres géométriques (position et taille) différents.
Le miracle c'est l'attribut clipPathUnits="objectBoundingBox" qui précise que les coordonnées de la forme de découpe
sont exprimées en relatif : par rapport aux coordonnées de l'image découpée et non pas par rapport au canevas.
Observez attentivement l'instruction polygon points="0.5 0, 1 0.5, 0.5 1, 0 0.5"
L'attribut points comprend quatre paires de X,Y. Ce qui indique les coordonnées relatives des angles du losange
de découpe par rapport à l'image : le milieu du côté haut (x =0.5 et y =0), milieu du côté droit, milieu du côté bas
et milieu du côté gauche.
L'outil "masque" est très proche de l'outil découpe.
Cet outil permet de rogner l'image et en plus pour la partie visible de lui appliquer une certaine transparence.
L'image apparait de façon transparente dans l'ellipse.
Observez bien la balise IMAGE avec l'attribut mask.
La balise marker est utilisée pour créer des marqueurs (un carré, un rond, une flèche) qui sont ensuite utilisés
pour délimiter les segments d'un chemin.
Les marqueurs définis sont donc ensuite positionnées au niveau des noeuds du chemin.
Rendu d'un document SVG (insertion dans cette page web via la balise Iframe) :
Dans la partie DEFS on définit les trois marqueurs.
Grâce à quelques astuces syntaxiques, le code du dessin vectoriel ci-dessous est très court malgré une relative complexité du dessin.
Pour le chemin en rouge, les marqueurs (anneaux) sont rouges ; pour le chemin en vert ils sont verts et pour le chemin en bleu ils sont bleus ...
Trois chemins mais une seule définition car emploi d'une règle de style : path{...}
Dans cette règle de style notez l'utilisation du raccourci marker qui remplace marker-start, marker-mid, marker-end.
La valeur de l'attribut "stroke" dans la balise circle est : stroke="context-stroke" : ainsi chaque marqueur adopte la couleur du stroke de la ligne correspondante.
L'attribut markerUnits="userSpaceOnUse" dans l'élément marker ; idéal quand on veut un marqueur de taille fixe quel que soit la valeur du stroke-width du chemin qui le porte.
Pour un élément dépendant, l'attribut fill peut prendre la valeur "context-fill".