« Tutoriel SVG avec HTML5 » : différence entre les versions

De EduTech Wiki
Aller à la navigation Aller à la recherche
 
(50 versions intermédiaires par 11 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
== Introduction ==
== Introduction ==


According to [http://fr.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia] (récupéré le 25 mars 2014), {{quotation|Le Scalable Vector Graphics (en français « graphique vectoriel adaptable1 »), ou SVG, est un format de données conçu pour décrire des ensembles de graphiques vectoriels et basé sur XML. Ce format inspiré directement du VML et du PGML est spécifié par le World Wide Web Consortium.}} {{quotation|Les coordonnées, dimensions et structures des objets vectoriels sont indiquées sous forme numérique dans le document XML. Un système spécifique de style (CSS ou XSL) permet d’indiquer les couleurs et les polices de caractères à utiliser. Ce format gère quelques formes géométriques de base (rectangles, ellipses, etc.), mais aussi des chemins (paths), qui utilisent les courbes de Bézier et permettent ainsi d’obtenir presque n’importe quelle forme. Le remplissage peut se faire à l’aide de dégradés (gradients) de couleurs de motifs (pattern) qui sont des objets SVG quelconques, ou de filtres (appelés shaders en imagerie 3D). On peut également appliquer des motifs le long des chemins (markers) et utiliser les fonctions de remplissage. Le canal alpha, pour la transparence, est géré à tous les niveaux. Comme dans tout document XML, les objets sont organisés sous forme d’arbre. Le format permet l’intégration d’animations, ou la manipulation des objets graphiques par programmation, notamment grâce à des scripts qui peuvent être intégrés dans le SVG.}}.
Selon [http://fr.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia] (récupéré le 25 mars 2014), {{quotation|Le Scalable Vector Graphics (en français « graphique vectoriel adaptable1 »), ou SVG, est un format de données conçu pour décrire des ensembles de graphiques vectoriels et basé sur XML. Ce format inspiré directement du VML et du PGML est spécifié par le World Wide Web Consortium depuis 1999.}} {{quotation|Les coordonnées, dimensions et structures des objets vectoriels sont indiquées sous forme numérique dans le document XML. Un système spécifique de style (CSS ou XSL) permet d’indiquer les couleurs et les polices de caractères à utiliser. Ce format gère quelques formes géométriques de base (rectangles, ellipses, etc.), mais aussi des chemins (paths), qui utilisent les courbes de Bézier et permettent ainsi d’obtenir presque n’importe quelle forme. Le remplissage peut se faire à l’aide de dégradés (gradients) de couleurs de motifs (pattern) qui sont des objets SVG quelconques, ou de filtres (appelés shaders en imagerie 3D). On peut également appliquer des motifs le long des chemins (markers) et utiliser les fonctions de remplissage. Le canal alpha, pour la transparence, est géré à tous les niveaux. Comme dans tout document XML, les objets sont organisés sous forme d’arbre. Le format permet l’intégration d’animations, ou la manipulation des objets graphiques par programmation, notamment grâce à des scripts qui peuvent être intégrés dans le SVG.}}.


[[SVG]] fait partie de la spécification du HTML 5, c'est-à-dire que les tags SVG font partie intégrante du langage et peuvent être intégrés directement dans le document (inline). Cela fonctionne depuis Chrome et 10, Firefox 4, Opera 11 et Internet Explorer 9 (février 2011). Bien SVG ne soit pas encore totalement supporté, les grandes marques de navigateur (sauf IE9) offrent maintenant un très bon support.
[[SVG]] fait partie de la spécification du HTML 5, c'est-à-dire que les tags SVG font partie intégrante du langage et peuvent être intégrés directement dans le document (inline). Cela fonctionne depuis Chrome 9 et 10, Firefox 4, Opera 11 et Internet Explorer 9 (février 2011). Bien que SVG ne soit pas encore totalement supporté, les grandes marques de navigateur (sauf IE9) offrent maintenant un très bon support.
(cité de [[User:Daniel K. Schneider|Daniel K. Schneider]] 19:47, 1 April 2012 (CEST))
(cité de [[User:Daniel K. Schneider|Daniel K. Schneider]] 19:47, 1 April 2012 (CEST))


Pour voir si votre navigateur est compatible avec SVG et HTML 5 (ce qui devrait être le cas si votre navigateur à moins d'un an), regardez sur le tableau de compatibilité disponible sur [http://caniuse.com/svg-html5 When can I use Inline SVG in HTML5?] à caniuse.com.
Pour voir si votre navigateur est compatible avec SVG et HTML 5 (ce qui devrait être le cas si votre navigateur a moins d'un an), regardez sur le tableau de compatibilité disponible sur [http://caniuse.com/svg-html5 When can I use Inline SVG in HTML5?] (caniuse.com).


Poiur aller plus loin :
Pour aller plus loin :
* [[Tutoriel SVG statique]]
* [[Tutoriel SVG statique]]
* [[SVG/SMIL animation tutorial]]
* [[Tutoriel XSLT pour générer du SVG]]
* [[Tutoriel XSLT pour générer du SVG]]
* [[Tutoriel SVG dynamique avec SMIL]]
* [[Tutoriel SVG/SMIL animations interactives]]
* [[Tutoriel SVG dynamique avec DOM]]
* [[SVG]] (survol et liens)


== Apprendre et réutiliser SVG ==
== Apprendre et réutiliser SVG ==


=== Apprendre SVG ===
=== Apprendre SVG ===
La page [http://edutechwiki.unige.ch/en/SVG_links | SVG Links] (en anglais) présente un certain nombre de bons liens. Sinon, il est conseillé de commencer avec le [[Tutoriel SVG statique]].
La page[[:en:SVG_links| SVG Links]] (en anglais) présente un certain nombre de liens intéressants. Toutefois, il est fortement conseillé de commencer avec le [[Tutoriel SVG statique]].


Si vous voulez aller en profondeur, utilisez
Respectez la syntaxe de SVG :
* [http://svg-edit.googlecode.com/svn/trunk/editor/svg-editor.html SVG-edit] (online editor at googlecode)


Respectez la syntaxe de SVG :
Exemple minimal (non recommandé):
Exemple minimal (non recommandé):
<source lang="XML">
<source lang="XML">
Ligne 29 : Ligne 30 :
</source>
</source>


Exemple incomplet qui défini la taille du canevas SVG. Par défaut la hauteur et la largeur sont en pixel. Il est possible d'utiliser des cm, mm, etc.
Code (à compléter pour les dessins) qui définit la taille du canevas SVG. Par défaut la hauteur et la largeur sont en pixel. Il est possible d'utiliser des cm, mm, etc.
<source lang="XML">
<source lang="XML">
<svg height="200" with="600" xmlns="http://www.w3.org/2000/svg">
<svg height="200" width="600" xmlns="http://www.w3.org/2000/svg">
       <!-- Des tags SVG ici .... -->
       <!-- Des tags SVG ici ... -->
</svg>
</svg>
</source>
</source>


Exemple incomplet pour permettre les liens (nécessaire pour les animations et les pages interactives !)
Code (à compléter pour les dessins) pour permettre les liens (nécessaire pour les animations et les pages interactives !)
<source lang="XML">
<source lang="XML">
<svg height="6cm" width="10cm">  
<svg height="6cm" width="10cm">  
Ligne 55 : Ligne 56 :
=== Nettoyer le SVG ===
=== Nettoyer le SVG ===


C'est difficile. Vous pouez tenter d'importer un fichier dans un éditeur SVG et sauver de nouveau. Jusqu'à présent aucun éditeur ne peut gérer le HTML5 avec SVG inclu.
C'est difficile. Vous pouvez tenter d'importer un fichier dans un éditeur SVG, faire vos modifications, puis l'enregistrer et l'intégrer à nouveau à votre document HTML. Jusqu'à présent aucun éditeur ne peut gérer le HTML5 avec SVG inclus.


Si votre fichier SVG ne s'affiche pas à cause d'erreurs de syntaxe, essayez le validateur du W3C, il vous dira ce qui est faux et à quelle ligne.
Si votre fichier SVG ne s'affiche pas à cause d'erreurs de syntaxe, essayez le [http://validator.w3.org/ validateur de W3C], il vous donnera la liste des erreurs en indiquant à quelles lignes du code elles se trouvent. Il est aussi possible d'y envoyer un fichier HTML5 avec du SVG inclus. Faites attention d'avoir le bon doctype en haut : &lt;!doctype html&gt;
* http://validator.w3.org/
* Il est aussi possible d'y envoyer un fichier HTML5 avec du SVG inclu. Faites attention d'avoir le bon doctype en haut : &lt;!doctype html&gt;


'''Copier des dessins Inkscape'''
'''Copier des dessins Inkscape'''


Utiliser des desssins fait avec Inkscaoe demande souvent du travail supplémentaire car les coordonnées utilisées sont souvent étranges. La page [http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Web.html Chapter 23. SVG and the Web] (en anglais) fournit quelques conseils. En particulier, lisez [http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Web-Inkscape.html Inkscape for the Web] (toutjours en anglais).
Utiliser des dessins faits avec Inkscape demande souvent du travail supplémentaire car les coordonnées utilisées sont souvent étranges. La page [http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Web.html Chapter 23. SVG and the Web] (en anglais) fournit quelques conseils. En particulier, lisez [http://tavmjong.free.fr/INKSCAPE/MANUAL/html/Web-Inkscape.html Inkscape for the Web] (toujours en anglais).
Le conseil le plus important est de quavegarder en '''SVG optimisé''' (Save as Optimzed SVG) qui ajoutera une viewbox si celle-ci est absente et ajustera la taille à 100%. L'image sera ainsi affichée en plein écran même si vous l'avez dessinée trop petite.
Le conseil le plus important est de sauvegarder en '''SVG optimisé''' (Save as Optimzed SVG) qui ajoutera une viewbox si celle-ci est absente et ajustera la taille à 100%. L'image sera ainsi affichée en plein écran même si vous l'avez dessinée trop petite.


Suggestion de marche à suivre poiur rendre un document Inkscape prêt pour le web :
Suggestion de marche à suivre pour rendre un document Inkscape prêt pour le web :
# '''ajuster la taille du document à la taille de l'image''' Menu File->Document Properties. Dans l'onglet "Custom size" ouvrir '''Resize page to content''' et cliquer sur '''Resize page to drawing or selection'''.
# '''ajuster la taille du document à la taille de l'image''' Menu File->Document Properties. Dans l'onglet "Custom size" ouvrir '''Resize page to content''' et cliquer sur '''Resize page to drawing or selection'''.
# Enlever les DEFs inutilisées : File->Vacuum Defs.
# Enlever les DEFs inutilisées : File->Vacuum Defs.
# '''Optimiser le SVG''': File -> Save as... -> Optimized SVG'''. Sélectionner l'option "Enable viewboxing'' dans la boîte de dialogue. Ceci fait plusieurs choses, en particulier insérer un viewbox correct et des attributs width et height.
# '''Optimiser le SVG''': File -> Save as... -> Optimized SVG'''. Sélectionner l'option "Enable viewboxing'' dans la boîte de dialogue. Ceci fait plusieurs choses, en particulier insérer une viewbox correcte et des attributs width et height.
# '''Enlever le Inkscape/XML et SVG non-standard''': File -> Save as... -> plain SVG  
# '''Enlever le Inkscape/XML et SVG non-standard''': File -> Save as... -> plain SVG  


(cette opération va enlever les layers et autres informations spécifiques à Inkscape, conservez une copie originale du fichier si besoin). Depuis janvier 2014, cela peut déclencher une erreur comme montré dans [http://edutechwiki.unige.ch/en/Using_Inkscape_for_web_animation|Using Inkscape for web animation] (en anglais). Si cela se produit, rouvrez le fichier sauvegardé et tout rentrera dans l'ordre...
(cette opération va enlever les calques et autres informations spécifiques à Inkscape, conservez cependant une copie du fichier original, en cas de modifications nécessaires). Depuis janvier 2014, cela peut déclencher une erreur comme montré dans [http://edutechwiki.unige.ch/en/Using_Inkscape_for_web_animation Using Inkscape for web animation] (en anglais). Si cela se produit, rouvrez le fichier sauvegardé et tout rentrera dans l'ordre.


Encore une fois, considérez la possibilité de faire des copies de l'original. Cette procédure peut rater, surtout si vous utilisez des SVG non-standard ! Vous pouvez également tenter de changer l'ordre des opérations, i.e. sauvegarder comme "plain SVG" avant d'optimiser.
Encore une fois, considérez la possibilité de faire des copies de l'original avant de commencer. En effet, cette procédure peut rater, surtout si vous utilisez des SVG non-standard ! Vous pouvez également tenter de changer l'ordre des opérations, i.e. sauvegarder comme "plain SVG" avant d'optimiser.




'''images Openclipart.org'''
'''images Openclipart.org'''


La plupart de ces dessins sont probablement fait avec Inkscapre et mis à disposition "tels quels". Ils peuvent donc ne pas avoir étés nettoyés. Cependant, de nombreux dessins vont marcher très bien.  
La plupart de ces dessins sont probablement fait avec Inkscape et mis à disposition "tels quels". Ils peuvent donc ne pas avoir étés nettoyés. Cependant, de nombreux dessins vont marcher très bien.  
De plus, quelques dessins SVG sur http://openclipart.org fonctionnent très bien pour l'import, par exemple [http://openclipart.org/detail/150253/palm-tree-by-newt coconut tree] ne contient aucune extension propriétaire. Notez qu'elles ne sont pas interdites et que les navigateurs vont simplement les ignorer.
De plus, quelques dessins SVG sur http://openclipart.org fonctionnent très bien pour l'import, par exemple [http://openclipart.org/detail/150253/palm-tree-by-newt coconut tree] ne contient aucune extension propriétaire. Notez qu'elles ne sont pas interdites et que les navigateurs vont simplement les ignorer.


Ligne 92 : Ligne 91 :
</svg>
</svg>
</source>
</source>
Ce fichier ne contient pas d'extension Inkscape propriétaires. Il contient seulement quelques instructions supplémentaires utilisées pour inclure des méta-informations (description, copyright...)
Ce fichier ne contient pas d'extension Inkscape propriétaires. Il contient seulement quelques instructions supplémentaires utilisées pour inclure des méta-informations (description, copyright...).
Ci-dessous un fichier qui montre deux versions : originales et nettoyée. Il n'y a pas beaucoup de différence. Puisque nous n'avons pas retirer l'espace supplémentaire autour du dessin, il apparaît un peu plus petit.
Ci-dessous, un fichier qui montre deux versions : originales et nettoyée. Il n'y a pas beaucoup de différence. Puisque nous n'avons pas retiré l'espace superflu autour du dessin, il apparait un peu plus petit.


Le voici :
Le voici :
Ligne 103 : Ligne 102 :
== Comment inclure du SVG dans du HTML5 ==
== Comment inclure du SVG dans du HTML5 ==


Il y a plusieurs façon d'inclure du SVG dans du HTML. La plus simple et la plus souvent utilisée est de l'inclure directement dans le document (inlining). Cependant dès que le SVG devient complexe cela devient difficile car le fichier peut devenir très grand.
Il y a plusieurs façon d'inclure du SVG dans du HTML. La plus simple et la plus souvent utilisée est de l'inclure directement dans le document (inlining). Cependant, dès que le SVG devient complexe cela devient difficile car le fichier peut devenir très grand.


Ici nous allons simplement montrer comment inclure des images SVG qui sont de la bonne taille.
Ici nous allons simplement montrer comment inclure des images SVG qui sont de la bonne taille.
Ligne 114 : Ligne 113 :
* Inclure du SVG à l'intérieur d'un autre SVG avec le tag ''image''.
* Inclure du SVG à l'intérieur d'un autre SVG avec le tag ''image''.


Nous expliquerons plus bas comment adapter la taille de l'image SVG incluse.
Nous expliquerons plus bas comment adapter la taille de l'image SVG inclue.


=== Inlining ===
=== Inlining ===
Ligne 145 : Ligne 144 :


Un exemple de SVG animé :
Un exemple de SVG animé :
* [http://tecfa.unige.ch/guides/svg/ex/html5/circle-crawling.html circle-crawling.html] (look at the source)
* [http://tecfa.unige.ch/guides/svg/ex/html5/circle-crawling.html circle-crawling.html] (consultez le code source)


Remarque :
Remarque :
Ligne 154 : Ligne 153 :
Ceci ne marche qu'avec du '''SVG statique'''. Utilisez le tag <code>object</code> ou l'élément image de '''SVG''' pour inclure des animations et/ou des éléments interactifs.
Ceci ne marche qu'avec du '''SVG statique'''. Utilisez le tag <code>object</code> ou l'élément image de '''SVG''' pour inclure des animations et/ou des éléments interactifs.


Ecxemple :
Exemple :
* [http://tecfa.unige.ch/guides/svg/ex/html5/html5-with-img-src.html html5-with-img-src.html]
* [http://tecfa.unige.ch/guides/svg/ex/html5/html5-with-img-src.html html5-with-img-src.html]


Ligne 174 : Ligne 173 :
</source>
</source>


=== Inclure du SVG avec le tag object ===
=== Inclure du SVG avec le tag object===
 
Permet d'inclure du SVG qui comprend des balises SMILE interactives.


Exemple :
Exemple statique :
* [http://tecfa.unige.ch/guides/svg/ex/html5/html5-with-object.html html5-with-object.html]
* [http://tecfa.unige.ch/guides/svg/ex/html5/html5-with-object.html html5-with-object.html]


Ligne 199 : Ligne 200 :


</source>
</source>
Exemple qui contient une animation (observez la couleur des yeux des dragons)
* http://tecfa.unige.ch/guides/svg/ex/html5/animation/dragon-head-silhouette-anim.html


=== Inclure du SVG avec le tag iframe ===
=== Inclure du SVG avec le tag iframe ===
Ligne 267 : Ligne 271 :
=== Inclure du SVG via un élément SVG image ===
=== Inclure du SVG via un élément SVG image ===


Assurez-vous que le SVG que vous incluez définisse bien sa taille en pourcentage ou que vous utiliez une viewbox.
Assurez-vous que le SVG que vous incluez définisse bien sa taille en pourcentage ou que vous utilisez une viewbox.


<source lang="XML">
<source lang="XML">
Ligne 291 : Ligne 295 :
== Adapter la taille et la position d'un graphique SVG ==
== Adapter la taille et la position d'un graphique SVG ==


There exist various way of doing this. Our preferred method for static SVG images is to fix the original SVG graphic with a viewbox and size attributes and then import with the HTML '''img''' tag. The original SVG should look like this, i.e. include a viewBox that uses the original width and size of the drawing (to be adjusted to your drawing of course), and width and height set to 100%.
Il existe de nombreuses façons de faire cela :
* Utilisation de la balise '''img''' dans HTML
* Réaliser une transformation d'échelle dans le SVG
* Utilisation de la balise SVG '''image'''.
 
=== Utilisation de la balise img dans HTML ===


Fixing the original SVG code (see below how to do this with Inkscape)
Notre méthode préférée pour le SVG statique consiste à munir le SVG original d'une viewbox et d'attributs de taille et de l'importer dans du HTML avec un tag '''img'''.
Ainsi le SVG ressemblera à ça (voir plus bas pour comment faire avec Inkscape) :
<source lang="xml">
<source lang="xml">
<svg
<svg
Ligne 303 : Ligne 313 :
</source>
</source>


You then can simply set a height in your HTML code, e.g.
Vous pouvez maintenant simplement définir une taille dans le code HTML, par exemple :
<source lang="xml">
<source lang="xml">
<img src="coconut.svg" height="100" alt="Nice coconut tree"/>
<img src="coconut.svg" height="100" alt="Nice coconut tree"/>
</source>
</source>


Life example:
Exemple : [http://tecfa.unige.ch/guides/svg/ex/html5/inkscape-import/html5-import-with-img.html html5-import-with-img.html]
* [http://tecfa.unige.ch/guides/svg/ex/html5/inkscape-import/html5-import-with-img.html html5-import-with-img.html]
 
* Our second preferred method is to import the SVG graphic with its original size and then wrap it inside a scale transform as explained in more detail further down. Another method that also works very well is to fix the original SVG drawing as explained in the section about Inkscape and then just use the simple HTML ''image'' element.
<source lang="XML">
<svg id="sir" height="116" width="106"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g transform="scale(0.1)">
  <image x="0" y="0" height="1140" width="1040"  xlink:href="like_a_sir_original.svg"/>
</g>
</svg>
</source>


=== Using the SVG transform attribute to change the size of a graphic ===
=== Réaliser une transformation d'échelle dans le SVG ===


For starters, we suggest editing the SVG file and adding the following "transformation" code:
Pour commencer, il convient d'éditer le fichier SVG et d'ajouter le code "transform" suivant :


Right after the opening svg tag add this:
Juste après le tag '''svg''' ouvrant, ajouter :
<source lang="XML">
<source lang="XML">
   <g transform="scale(0.1)">
   <g transform="scale(0.1)">
</source>
</source>


Right before the closing svg tag add this:
juste avant le tag '''svg''' fermant ajouter :
<source lang="XML">
<source lang="XML">
   </g>
   </g>
</source>
</source>


You can use this method within your SVG graphic in order to adapt the size of various parts. Just wrap them inside a ''g transform="scale(...)"''.  
Vous pouvez utiliser cette méthode à l'intérieur de vos graphiques SVG pour adapter la taille des différentes parties. Il suffit des les entourer avec '''g transform="scale(...)'''.
 
'''Taux de réussite''' : cette méthode est garantie puisqu'elle repose sur du SVG de base. Cependant, il ne s'agit pas de la méthode la plus élégante puisqu'il faut éditer le fichier SVG d'origine.


'''Success rate''': This method is guaranteed to work since it relies on basic SVG technology that is now over 10 years old. However, this is not the most elegant solution since it requires editing the SVG file. See the next solution.
Exemple : [http://tecfa.unige.ch/guides/svg/ex/html5/circle-scale.html circle-scale.html], à comparer avec [http://tecfa.unige.ch/guides/svg/ex/html5/circle.html circle.html]


Simple live example:
=== Utilisation de la balise SVG image ===
* [http://tecfa.unige.ch/guides/svg/ex/html5/circle-scale.html circle-scale.html] that you should compare with [http://tecfa.unige.ch/guides/svg/ex/html5/circle.html circle.html]


The simple SVG file we are going to import in the following examples is [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/huge-red-circle.svg huge-red-circle.svg]. It looks like this:
Les méthodes suivantes sont simples à comprendre et devraient fonctionner dans tous les navigateurs.
<source lang="XML">
<?xml version="1.0"?>
<svg height="600" width="600" xmlns="http://www.w3.org/2000/svg">
  <circle cx="50%" cy="50%" r="50%" fill="red" />
</svg>
</source>


=== Using the SVG image tag to import and adapt an SVG graphic ===
==== La solution simple ====


The next methods are fairly elegant, easy to understand and should work in all browsers. There are three variants. For now, I suggest to use variant B - DKS.


==== The simple solution ====
Tout d'abord, un rappel sur l'utilisation de la balise <code>image</code>


Let's recall how to use the SVG image tag:
<source lang="XML">
<source lang="XML">
<!DOCTYPE html>
<!DOCTYPE html>
Ligne 375 : Ligne 367 :
</source>
</source>


* Life example: [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/import-with-svg-image.html import-with-svg-image.html]
* Exemple [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/import-with-svg-image.html import-with-svg-image.html]
 
Ce que vous avez à faire:
* Prendre connaissance des proportions de l'image SVG originale (regardez l'élément svg racine du fichier SVG)
* Définir l'échelle : la hauteur et la largeur de l'image par rapport à vos besoins.
 
Dans notre exemple, les dimensions du graphique importé étaient 600 x 600 px. Afin d'obtenir un cercle de 10 fois plus petit, nous avons juste divisé  x/10 et y/10.
 
* Si vous ne pouvez pas voir l'image, importez la photo dans sa taille originale et définissez la taille de canevas aux mêmes dimensions.
 
 
Par exemple si le canevas d'origine est 1000x400:


All you typically have to do is:
* Figure out the proportions of the original SVG (look at the svg root element of the SVG file)
* Define the height and width of the image with respect to your scaling needs.
In our example, the imported graphic's dimensions were 600 x 600 px. In order to get a circle 10 times smaller, we just dived x/10 and y/10.
* If you can't see the picture, import the picture in its original size and set the canvevas size to the same dimensions. E.g. if the original canevas is 1000x400:
<source lang="xml">
<source lang="xml">
<svg id="circle" height="1000.7" width="400"  
<svg id="circle" height="1000.7" width="400"  
Ligne 389 : Ligne 387 :
</source>
</source>


Now that you know that the picture and your code is ok, you may try to understand why you may not see a picture. Indeed, <span style="color:red">this simple method is '''not''' guaranteed to work with every SVG file</span>. In particular it will not when the imported image is "badly" positioned. See the next solution, using a scale transform of the imported SVG, if don't want to learn how to fix that kind of problem in the imported SVG code. Let's illustrate this with an example. The [http://openclipart.org/detail/168634/like-a-sir-by-tavin like a Sir] picture is positioned in negative y space as you can see in the following screenshot and code excerpt:
 
[[image:inkscape-svg-position.png|frame|none|SVG picture in negative space]]
Maintenant que vous savez que l'image et votre code sont corrects, vous pouvez essayer de comprendre pourquoi vous ne pouvez pas voir une image.
En effet, <span style="color:red"> il n'est pas garanti que cette méthode fonctionne avec tous les fichiers SVG </span>, en particulier si l'image importée est "mal" placée.
Voir la solution suivante. Utilisez une échelle si vous ne souhaitez pas apprendre à réparer cette sorte de problème du code de SVG importé.
Illustrons avec un exemple.  
L'image [http://openclipart.org/detail/168634/like-a-sir-by-tavin like a Sir] est placé dans un espace inapproprié comme vous pouvez voir dans la copie d'écran et le code suivants:
 
IMAGE MANQUANTE - à insérer par DKS
 
<source lang="XML">
<source lang="XML">
<g inkscape:label="Ebene 1" inkscape:groupmode="layer" id="layer1" transform="translate(445.66942,-924.04028)">
<g inkscape:label="Ebene 1" inkscape:groupmode="layer" id="layer1" transform="translate(445.66942,-924.04028)">
</source>
</source>
Solutions:
Solutions:
* Open the SVG file with Inkscape and fix it. This way you also could get rid of all the extension tags (save as "plain SVG"). However, this may not be easy. The graphic is likely to be in a wrong position, because the author created paths with SVG path data that do not fit the "usual" x=0/y=0 coordinate system. Something one never should do ....
* Ouvrir le fichier SVG avec Inkscape et le corriger. De cette façon vous pourriez aussi vous débarrasser des espaces superflus (enregistrer sous "plain SVG"). Cependant, cette opération peut être difficile. Le graphique peut être dans une mauvaise position, parce que l'auteur a créé des "path" avec les données de "path" de SVG qui ne s'adaptent pas au système de coordonnée de x=0/y=0 "habituel".
* Use one of the methods below. That is: '''import the picutre''' with its original size, then scale it either with a scale transform (easier) or by adjusting the ViewBox.
* Utiliser une des méthodes ci-dessous qui consiste à importer l'image dans sa taille originale, puis la redimensionner à l'aide de l'échelle plus facile) ou en ajustant le ViewBox.
 
Bien sûr, vous pouvez bouger les images.
Ci dessous, voici le code de l'image repositionnée :


Of course, you can move pictures The following shows how to reposition a "normal" image.
<source lang="XML">
<source lang="XML">
<svg id="circle" height="62" width="62"  
<svg id="circle" height="62" width="62"  
Ligne 406 : Ligne 414 :
</source>
</source>


==== Import the graphic with its original size and scale the image ====
==== Importer l'image avec sa taille d'origine et faire une transformation d'échelle ====
 
 
Ci-dessous, on peut trouver une autre variante que la précédente, plus robuste pour les dessins pourvus de coordonnées inadéquates. Il faut ici importer le grand cercle avec sa taille d'origine, puis opérer une transformation d'échelle dessus.


Below is another variant that seems is more robust with respect to drawings that use strange coordinates. We import the original huge circle with its original size, but we then scale transform it.
<source lang="XML">
<source lang="XML">
<!DOCTYPE html>
<!DOCTYPE html>
Ligne 430 : Ligne 440 :
</source>
</source>


Pay attention to the following tips:
Attention aux éléments suivants :
* Height and width of the image tag '''must''' correspond (roughly) to the size of the imported SVG. Look at its SVG root tag. If weight and height are missing in the SVG file add it yourself, if possible
* Les valeurs de height et width du tag image '''doivent impérativement''' correspondre (plus ou moins) à la taille du SVG importé. Si ces attributs sont absents du fichier d'origine, ajoutez-les vous-même, si possible.
* Height and width of the svg root tag should somehow fit the scaled image. E.g. if you import a 100x200 and make it twice as big, then svg root dimensions should be at least 200x400.
* Les valeurs de height et width du ''root tag'' SVG doivent à peu près correspondre à l'image redimensionnée. Par exemple, si vous importez un fichier de résolution 100x200 et le rendez deux fois plus grand, les dimensions contenues dans le ''root tag'' devraient être au moins de 200x400.
 
* Exemple : [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/import-with-svg-image2.html import-with-svg-image2]
* Life example: [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/import-with-svg-image2.html import-with-svg-image2.html]
* Autre exemple : [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/like_a_sir.html like_a_sir.html]
 
* Life example2: [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/like_a_sir.html like_a_sir.html]
 
==== Importing with original size and create a viewBox ====


This solution also offers a way to rescale. viewBox attributes can do more, but we won't cover that.
==== Tirer parti de l'attribut viewBox ====


<source lang="XML">
<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>


  <body>
User de cette méthode ouvre un nombre infini de possibilités, mais l'usage de viewBox est difficile à saisir...
    <h1>HTML5 SVG Demo - embed svg file with SVG image and viewBox</h1>
Le code suivant montre comment changer les dimensions d'un SVG et le repositionner (en faisant remonter le viewport).


<p> A huge red circle that was embeded using the svg "image" tag plus a change of user coordinates with a a viewBox</p>
<svg id="circle" height="60" width="60"
    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <svg viewBox="0 0 600 600">
    <image x="0" y="0" height="600" width="600" xlink:href="huge-red-circle.svg" />
  </svg>
</svg>
</body>
</html>
</source>
* Life example: [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/import-with-svg-image3.html import-with-svg-image3.html]
'''Playing with viewBox'''
Possibilities are endless, but viewBox is hard to understand ...
The following code shows how to stretch and reposition (move the viewport up)
<source lang="XML">
<source lang="XML">
<!DOCTYPE html>
<!DOCTYPE html>
Ligne 490 : Ligne 472 :
</body>
</body>
</html>
</html>
</source>
Exemple : [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/import-with-svg-image4.html import-with-svg-image4]


</source>
== Créer du texte qui entoure une image SVG ==
* Life example: [http://tecfa.unige.ch/guides/svg/ex/html5/svg-import/import-with-svg-image4.html import-with-svg-image4.html]


=== Créer du texte qui entoure une image SVG ===


You can use ordinary HTML CSS properties to style the svg element. The following SVG graphic will float to the right:
Vous pouvez utiliser les propriétés habituelles de HTML et CSS pour définir le style des éléments SVG.
Ainsi le code suivant alignera le SVG à droite :
<source lang="XML">
<source lang="XML">
<svg style="float:right" width="81" height="127" xmlns="http://www.w3.org/2000/svg">
<svg style="float:right" width="81" height="127" xmlns="http://www.w3.org/2000/svg">
Ligne 508 : Ligne 492 :
</source>
</source>


The following code would make an image float to the left and add a small margin:
Celui-ci alignera le SVG à gauche et ajoutera une petite marge :
<source lang="XML">
<source lang="XML">
<svg width="43" height="65" style="float:left;margin:5px;"  
<svg width="43" height="65" style="float:left;margin:5px;"  
Ligne 516 : Ligne 500 :
</source>
</source>


Live example that includes some long SVG code (look at the source):
Exemples (incluant quelques codes SVG longs) (regardez le code source) :
* [http://tecfa.unige.ch/guides/svg/ex/html5/text-with-pics/text-with-pics.html text-with-pics.html]
* [http://tecfa.unige.ch/guides/svg/ex/html5/text-with-pics/text-with-pics.html text-with-pics.html]
* To do: Create a version that uses the SVG image tag for importing.
* (à faire : Créer une version qui utilise le tag '''image''' pour l'import)


== Liens ==
== Liens ==


; Specifications (very technical reading !)
; Spécifications (lectures très techniques !)


* [http://www.w3.org/TR/SVG/struct.html#ImageElement The image element] (part of the [http://www.w3.org/TR/SVG/Overview.html Scalable Vector Graphics (SVG) 1.1] (Second Edition), W3C Recommendation 16 August 2011
* [http://www.w3.org/TR/SVG/struct.html#ImageElement The image element] (part of the [http://www.w3.org/TR/SVG/Overview.html Scalable Vector Graphics (SVG) 1.1] (Second Edition), W3C Recommendation 16 August 2011
Ligne 532 : Ligne 516 :
* [http://www.w3.org/TR/SVG11/coords.html#ViewBoxAttribute 7.7 The ‘viewBox’ attribute] (SVG 1.1 Specification)
* [http://www.w3.org/TR/SVG11/coords.html#ViewBoxAttribute 7.7 The ‘viewBox’ attribute] (SVG 1.1 Specification)
* [http://tutorials.jenkov.com/svg/svg-viewport-view-box.html SVG Viewport and View Box]
* [http://tutorials.jenkov.com/svg/svg-viewport-view-box.html SVG Viewport and View Box]
'''Remarque : il manque l'insertion d'une image dans la section 4.3.1, qui figure dans la [http://edutechwiki.unige.ch/en/Using_SVG_with_HTML5_tutorial version anglaise de cette page]. '''
[[en:Using SVG with HTML5 tutorial]]
[[Category: HTML5]]
[[Category: XML]]
[[Category: SVG]]
[[Catégorie:Ressources STIC]]

Dernière version du 25 octobre 2022 à 10:35

Introduction

Selon Wikipedia (récupéré le 25 mars 2014), “Le Scalable Vector Graphics (en français « graphique vectoriel adaptable1 »), ou SVG, est un format de données conçu pour décrire des ensembles de graphiques vectoriels et basé sur XML. Ce format inspiré directement du VML et du PGML est spécifié par le World Wide Web Consortium depuis 1999.” “Les coordonnées, dimensions et structures des objets vectoriels sont indiquées sous forme numérique dans le document XML. Un système spécifique de style (CSS ou XSL) permet d’indiquer les couleurs et les polices de caractères à utiliser. Ce format gère quelques formes géométriques de base (rectangles, ellipses, etc.), mais aussi des chemins (paths), qui utilisent les courbes de Bézier et permettent ainsi d’obtenir presque n’importe quelle forme. Le remplissage peut se faire à l’aide de dégradés (gradients) de couleurs de motifs (pattern) qui sont des objets SVG quelconques, ou de filtres (appelés shaders en imagerie 3D). On peut également appliquer des motifs le long des chemins (markers) et utiliser les fonctions de remplissage. Le canal alpha, pour la transparence, est géré à tous les niveaux. Comme dans tout document XML, les objets sont organisés sous forme d’arbre. Le format permet l’intégration d’animations, ou la manipulation des objets graphiques par programmation, notamment grâce à des scripts qui peuvent être intégrés dans le SVG.”.

SVG fait partie de la spécification du HTML 5, c'est-à-dire que les tags SVG font partie intégrante du langage et peuvent être intégrés directement dans le document (inline). Cela fonctionne depuis Chrome 9 et 10, Firefox 4, Opera 11 et Internet Explorer 9 (février 2011). Bien que SVG ne soit pas encore totalement supporté, les grandes marques de navigateur (sauf IE9) offrent maintenant un très bon support. (cité de Daniel K. Schneider 19:47, 1 April 2012 (CEST))

Pour voir si votre navigateur est compatible avec SVG et HTML 5 (ce qui devrait être le cas si votre navigateur a moins d'un an), regardez sur le tableau de compatibilité disponible sur When can I use Inline SVG in HTML5? (caniuse.com).

Pour aller plus loin :

Apprendre et réutiliser SVG

Apprendre SVG

La page SVG Links (en anglais) présente un certain nombre de liens intéressants. Toutefois, il est fortement conseillé de commencer avec le Tutoriel SVG statique.

Respectez la syntaxe de SVG :

Exemple minimal (non recommandé):

<svg xmlns="http://www.w3.org/2000/svg">
    <circle id="greencircle" cx="30" cy="30" r="30" fill="green" />
</svg>

Code (à compléter pour les dessins) qui définit la taille du canevas SVG. Par défaut la hauteur et la largeur sont en pixel. Il est possible d'utiliser des cm, mm, etc.

<svg height="200" width="600" xmlns="http://www.w3.org/2000/svg">
      <!-- Des tags SVG ici ... -->
</svg>

Code (à compléter pour les dessins) pour permettre les liens (nécessaire pour les animations et les pages interactives !)

<svg height="6cm" width="10cm"> 
   xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
      <!-- Des tags SVG ici .... -->
</svg>

Si vous voulez tracer un bord, utilisez une propriété HTML CSS standard, par exemple :

<svg style="border-style:solid;border-width:1px;" id="circle" height="60" width="120" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
      <!-- Des tags SVG ici .... -->
  </svg>
</svg>

Nettoyer le SVG

C'est difficile. Vous pouvez tenter d'importer un fichier dans un éditeur SVG, faire vos modifications, puis l'enregistrer et l'intégrer à nouveau à votre document HTML. Jusqu'à présent aucun éditeur ne peut gérer le HTML5 avec SVG inclus.

Si votre fichier SVG ne s'affiche pas à cause d'erreurs de syntaxe, essayez le validateur de W3C, il vous donnera la liste des erreurs en indiquant à quelles lignes du code elles se trouvent. Il est aussi possible d'y envoyer un fichier HTML5 avec du SVG inclus. Faites attention d'avoir le bon doctype en haut : <!doctype html>

Copier des dessins Inkscape

Utiliser des dessins faits avec Inkscape demande souvent du travail supplémentaire car les coordonnées utilisées sont souvent étranges. La page Chapter 23. SVG and the Web (en anglais) fournit quelques conseils. En particulier, lisez Inkscape for the Web (toujours en anglais). Le conseil le plus important est de sauvegarder en SVG optimisé (Save as Optimzed SVG) qui ajoutera une viewbox si celle-ci est absente et ajustera la taille à 100%. L'image sera ainsi affichée en plein écran même si vous l'avez dessinée trop petite.

Suggestion de marche à suivre pour rendre un document Inkscape prêt pour le web :

  1. ajuster la taille du document à la taille de l'image Menu File->Document Properties. Dans l'onglet "Custom size" ouvrir Resize page to content et cliquer sur Resize page to drawing or selection.
  2. Enlever les DEFs inutilisées : File->Vacuum Defs.
  3. Optimiser le SVG': File -> Save as... -> Optimized SVG. Sélectionner l'option "Enable viewboxing dans la boîte de dialogue. Ceci fait plusieurs choses, en particulier insérer une viewbox correcte et des attributs width et height.
  4. Enlever le Inkscape/XML et SVG non-standard: File -> Save as... -> plain SVG

(cette opération va enlever les calques et autres informations spécifiques à Inkscape, conservez cependant une copie du fichier original, en cas de modifications nécessaires). Depuis janvier 2014, cela peut déclencher une erreur comme montré dans Using Inkscape for web animation (en anglais). Si cela se produit, rouvrez le fichier sauvegardé et tout rentrera dans l'ordre.

Encore une fois, considérez la possibilité de faire des copies de l'original avant de commencer. En effet, cette procédure peut rater, surtout si vous utilisez des SVG non-standard ! Vous pouvez également tenter de changer l'ordre des opérations, i.e. sauvegarder comme "plain SVG" avant d'optimiser.


images Openclipart.org

La plupart de ces dessins sont probablement fait avec Inkscape et mis à disposition "tels quels". Ils peuvent donc ne pas avoir étés nettoyés. Cependant, de nombreux dessins vont marcher très bien. De plus, quelques dessins SVG sur http://openclipart.org fonctionnent très bien pour l'import, par exemple coconut tree ne contient aucune extension propriétaire. Notez qu'elles ne sont pas interdites et que les navigateurs vont simplement les ignorer.

<?xml version="1.0"?>
  <svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
       xmlns="http://www.w3.org/2000/svg"
       xmlns:cc="http://creativecommons.org/ns#"
       xmlns:dc="http://purl.org/dc/elements/1.1/" 
       xmlns:svg="http://www.w3.org/2000/svg" id="svg2" 
       viewBox="0 0 744.09 1052.4" version="1.1">
</svg>

Ce fichier ne contient pas d'extension Inkscape propriétaires. Il contient seulement quelques instructions supplémentaires utilisées pour inclure des méta-informations (description, copyright...). Ci-dessous, un fichier qui montre deux versions : originales et nettoyée. Il n'y a pas beaucoup de différence. Puisque nous n'avons pas retiré l'espace superflu autour du dessin, il apparait un peu plus petit.

Le voici :

Ainsi qu'un autre exemple :

Comment inclure du SVG dans du HTML5

Il y a plusieurs façon d'inclure du SVG dans du HTML. La plus simple et la plus souvent utilisée est de l'inclure directement dans le document (inlining). Cependant, dès que le SVG devient complexe cela devient difficile car le fichier peut devenir très grand.

Ici nous allons simplement montrer comment inclure des images SVG qui sont de la bonne taille. Plus ou moins n'importe quel mécanisme d'inclusion va marcher :

  • Copier/coller le code SVG à l'intérieur du code HTML (inlining)
  • Utiliser le tag HTML img
  • Utiliser le tag HTML object
  • Utiliser le tag HTML iframe
  • Utiliser du CSS (image en background)
  • Inclure du SVG à l'intérieur d'un autre SVG avec le tag image.

Nous expliquerons plus bas comment adapter la taille de l'image SVG inclue.

Inlining

N'oubliez pas la déclaration (ou les déclarations) de namespace dans l'élément SVG de plus haut niveau. Au minimum xmlns="http://www.w3.org/2000/svg"

Exemple :

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
  </head>

  <body>
    <h1>HTML5 SVG Demo</h1>

A nice green circle :
    <svg id="circle" height="200" xmlns="http://www.w3.org/2000/svg">
      <circle id="greencircle" cx="30" cy="30" r="30" fill="green" />
    </svg>

    <hr>
    <address>Created by DKS. This is free code</address>
  </body>
</html>

Un exemple de SVG animé :

Remarque :

  • On peut également importer du SVG en utilisant le tag "image". Cependant, cela est seulement possible normalement avec le SVG statique. Cette méthode est développée dans un chapitre suivant

Inclure du SVG avec le tag img

Ceci ne marche qu'avec du SVG statique. Utilisez le tag object ou l'élément image de SVG pour inclure des animations et/ou des éléments interactifs.

Exemple :

Voici les éléments les plus importants de cet exemple :

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>

  <body>
    <h1>HTML5 SVG Demo (embed with img src)</h1>

   <p> A nice green circle that was embeded using the img element:
   <img src="green-circle.svg" height="64" alt="Nice green circle"/>
</p>

Inclure du SVG avec le tag object

Permet d'inclure du SVG qui comprend des balises SMILE interactives.

Exemple statique :

Voici les éléments les plus importants de cet exemple :

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>

  <body>
    <h1>HTML5 SVG Demo (embed with object)</h1>

<p> A nice green circle that was embeded using the HTML "object" tag:
<object type="image/svg+xml" data="green-circle.svg" 
	width="64" height="64" border="1"></object>
</p>
</body>
</html>

Exemple qui contient une animation (observez la couleur des yeux des dragons)

Inclure du SVG avec le tag iframe

Exemple :

Voici les éléments les plus importants de cet exemple :

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>

  <body>
    <h1>HTML5 SVG Demo (embed with iframe)</h1>

<p> A nice green circle that was embeded using the HTML "iframe" tag:
<iframe src="green-circle.svg" 
	width="64" height="64" style="border:1;"></iframe>
</p>
<p>
Tips:
<iframe src="green-circle.svg" style="float:left;margin-right:1cm;" 
	width="64" height="40" style="border:1;"></iframe>
</p>
</body>
</html>

Utiliser du SVG comme image de fond en HTML 5

Exemple :

Voici les éléments les plus importants de cet exemple

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <style type="text/CSS">
      body {
      background-image: none, url('green-circle.svg');
      background-position: 50% 50%;
      background-repeat: no-repeat;
      }
    </style>
  </head>

  <body>
    <h1>HTML5 SVG Demo (embed with CSS background)</h1>

<p> A nice green circle that was embeded using CSS Background.
</p>
<p>Tips:</p>
<ul>
<li>SVG included as CSS can't be scripted and positioning is hard. Therefore only use this method for background illustrations.</li>
</ul>
</body>
</html>

Inclure du SVG via un élément SVG image

Assurez-vous que le SVG que vous incluez définisse bien sa taille en pourcentage ou que vous utilisez une viewbox.

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>
  <body>
    <h1>HTML5 SVG Demo - embed svg file with SVG image</h1>

<p> A huge red circle that was embeded using the svg "image" tag:</p>
<svg id="circle" height="60" width="60" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <image x="0" y="0" height="60" width="60"  xlink:href="huge-red-circle.svg" />
</svg>
</body>

Adapter la taille et la position d'un graphique SVG

Il existe de nombreuses façons de faire cela :

  • Utilisation de la balise img dans HTML
  • Réaliser une transformation d'échelle dans le SVG
  • Utilisation de la balise SVG image.

Utilisation de la balise img dans HTML

Notre méthode préférée pour le SVG statique consiste à munir le SVG original d'une viewbox et d'attributs de taille et de l'importer dans du HTML avec un tag img. Ainsi le SVG ressemblera à ça (voir plus bas pour comment faire avec Inkscape) :

<svg
   xmlns="http://www.w3.org/2000/svg"
   version="1.1"
   width="100%"
   height="100%"
   viewBox="0 0 684 648">

Vous pouvez maintenant simplement définir une taille dans le code HTML, par exemple :

<img src="coconut.svg" height="100" alt="Nice coconut tree"/>

Exemple : html5-import-with-img.html

Réaliser une transformation d'échelle dans le SVG

Pour commencer, il convient d'éditer le fichier SVG et d'ajouter le code "transform" suivant :

Juste après le tag svg ouvrant, ajouter :

  <g transform="scale(0.1)">

juste avant le tag svg fermant ajouter :

  </g>

Vous pouvez utiliser cette méthode à l'intérieur de vos graphiques SVG pour adapter la taille des différentes parties. Il suffit des les entourer avec g transform="scale(...).

Taux de réussite : cette méthode est garantie puisqu'elle repose sur du SVG de base. Cependant, il ne s'agit pas de la méthode la plus élégante puisqu'il faut éditer le fichier SVG d'origine.

Exemple : circle-scale.html, à comparer avec circle.html

Utilisation de la balise SVG image

Les méthodes suivantes sont simples à comprendre et devraient fonctionner dans tous les navigateurs.

La solution simple

Tout d'abord, un rappel sur l'utilisation de la balise image

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>
  <body>
    <h1>HTML5 SVG Demo - embed svg file with SVG image</h1>

<p> A huge red circle that was embeded using the svg "image" tag:</p>
<svg id="circle" height="60" width="60" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <image x="0" y="0" height="60" width="60"  xlink:href="huge-red-circle.svg" />
</svg>
</body>

Ce que vous avez à faire:

  • Prendre connaissance des proportions de l'image SVG originale (regardez l'élément svg racine du fichier SVG)
  • Définir l'échelle : la hauteur et la largeur de l'image par rapport à vos besoins.

Dans notre exemple, les dimensions du graphique importé étaient 600 x 600 px. Afin d'obtenir un cercle de 10 fois plus petit, nous avons juste divisé x/10 et y/10.

  • Si vous ne pouvez pas voir l'image, importez la photo dans sa taille originale et définissez la taille de canevas aux mêmes dimensions.


Par exemple si le canevas d'origine est 1000x400:

<svg id="circle" height="1000.7" width="400" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <image x="0" y="0" height="1000.7" width="400"  xlink:href="huge-red-circle.svg" />
</svg>


Maintenant que vous savez que l'image et votre code sont corrects, vous pouvez essayer de comprendre pourquoi vous ne pouvez pas voir une image. En effet, il n'est pas garanti que cette méthode fonctionne avec tous les fichiers SVG , en particulier si l'image importée est "mal" placée. Voir la solution suivante. Utilisez une échelle si vous ne souhaitez pas apprendre à réparer cette sorte de problème du code de SVG importé. Illustrons avec un exemple. L'image like a Sir est placé dans un espace inapproprié comme vous pouvez voir dans la copie d'écran et le code suivants:

IMAGE MANQUANTE - à insérer par DKS

<g inkscape:label="Ebene 1" inkscape:groupmode="layer" id="layer1" transform="translate(445.66942,-924.04028)">

Solutions:

  • Ouvrir le fichier SVG avec Inkscape et le corriger. De cette façon vous pourriez aussi vous débarrasser des espaces superflus (enregistrer sous "plain SVG"). Cependant, cette opération peut être difficile. Le graphique peut être dans une mauvaise position, parce que l'auteur a créé des "path" avec les données de "path" de SVG qui ne s'adaptent pas au système de coordonnée de x=0/y=0 "habituel".
  • Utiliser une des méthodes ci-dessous qui consiste à importer l'image dans sa taille originale, puis la redimensionner à l'aide de l'échelle plus facile) ou en ajustant le ViewBox.

Bien sûr, vous pouvez bouger les images. Ci dessous, voici le code de l'image repositionnée :

<svg id="circle" height="62" width="62" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <image x="1" y="1" height="60" width="60"  xlink:href="huge-red-circle.svg" />
</svg>

Importer l'image avec sa taille d'origine et faire une transformation d'échelle

Ci-dessous, on peut trouver une autre variante que la précédente, plus robuste pour les dessins pourvus de coordonnées inadéquates. Il faut ici importer le grand cercle avec sa taille d'origine, puis opérer une transformation d'échelle dessus.

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>
  <body>
    <h1>HTML5 SVG Demo - embed svg file with SVG image</h1>

<p> A huge red circle that was embeded using the svg "image" tag plus a scale transform:</p>
<svg id="circle" height="60" width="60" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <g transform="scale(0.1)">
    <image x="0" y="0" height="600" width="600" xlink:href="huge-red-circle.svg" />
  </g>
</svg>
</body>
</html>

Attention aux éléments suivants :

  • Les valeurs de height et width du tag image doivent impérativement correspondre (plus ou moins) à la taille du SVG importé. Si ces attributs sont absents du fichier d'origine, ajoutez-les vous-même, si possible.
  • Les valeurs de height et width du root tag SVG doivent à peu près correspondre à l'image redimensionnée. Par exemple, si vous importez un fichier de résolution 100x200 et le rendez deux fois plus grand, les dimensions contenues dans le root tag devraient être au moins de 200x400.
  • Exemple : import-with-svg-image2
  • Autre exemple : like_a_sir.html

Tirer parti de l'attribut viewBox

User de cette méthode ouvre un nombre infini de possibilités, mais l'usage de viewBox est difficile à saisir... Le code suivant montre comment changer les dimensions d'un SVG et le repositionner (en faisant remonter le viewport).

<!DOCTYPE html>
<html>
  <head>
    <title>HTML5 SVG demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  </head>

  <body>
    <h1>HTML5 SVG Demo - embed svg file with SVG image and distort with viewBox</h1>

<p> A huge red circle that was embeded using the svg "image" tag plus a change of user coordinates with a a viewBox</p>
<svg style="border-style:solid;border-width:1px;" id="circle" height="60" width="120" 
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" >
  <svg viewBox="0 -300 600 1200" preserveAspectRatio="none" >
    <image x="0" y="0" height="600" width="600" xlink:href="huge-red-circle.svg" />
  </svg>
</svg>
</body>
</html>

Exemple : import-with-svg-image4

Créer du texte qui entoure une image SVG

Vous pouvez utiliser les propriétés habituelles de HTML et CSS pour définir le style des éléments SVG. Ainsi le code suivant alignera le SVG à droite :

<svg style="float:right" width="81" height="127" xmlns="http://www.w3.org/2000/svg">
 <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
 <g>
  <title>Simple tree</title>
  <rect fill="#7f3f00" stroke="#000000" stroke-width="0" x="32.26172" y="50.26172" width="17" height="77" id="svg_3"/>
  <circle fill="#007f3f" stroke="#000000" stroke-width="0" cx="40.26172" cy="40.26172" r="40.26172" id="svg_1"/>
 </g>
</svg>

Celui-ci alignera le SVG à gauche et ajoutera une petite marge :

<svg width="43" height="65" style="float:left;margin:5px;" 
    xmlns="http://www.w3.org/2000/svg">
....
</svg>

Exemples (incluant quelques codes SVG longs) (regardez le code source) :

Liens

Spécifications (lectures très techniques !)
ViewBox


Remarque : il manque l'insertion d'une image dans la section 4.3.1, qui figure dans la version anglaise de cette page.