OUJOOD.COM
L'une des avancées majeures d'HTML5 est la possibilité d'intégrer des graphiques vectoriels SVG (Scalable Vector Graphics) directement dans le code HTML, sans balise object ni embed. Cette approche inline SVG place les graphiques dans le DOM, les rendant stylables par CSS, manipulables par JavaScript et pleinement accessibles aux technologies d'assistance — trois piliers du web moderne performant et inclusif.
Ce tutoriel expert mis à jour en 2026 couvre l'intégration SVG de A à Z : éléments de base, filtres SVG avancés, courbes de Bézier avec <path>, animations CSS keyframes, accessibilité WCAG 2.2 et optimisation pour les Core Web Vitals de Google.
Avantages du SVG Inline pour le Web Responsive et le SEO
HTML5 cours tutorialLe format SVG décrit les formes par des formules mathématiques XML, contrairement aux images matricielles (JPEG, PNG) composées de pixels fixes. Cette différence fondamentale lui confère des propriétés uniques pour le design responsive et le référencement naturel :
- Résolution indépendante : net sur tous les écrans (Retina, 4K, 8K), sans variantes
srcset, ce qui simplifie le workflow responsive design. - SEO et indexabilité : le texte SVG est indexé par Google. Les balises
<title>et<desc>améliorent la visibilité dans les résultats de recherche d'images. - Performance Core Web Vitals : compression Brotli/gzip jusqu'à 80 %, réduisant le LCP (Largest Contentful Paint) pour les illustrations critiques.
- Accessibilité WCAG 2.2 : support natif des attributs ARIA (
role,aria-labelledby,aria-describedby) pour les lecteurs d'écran. - Interactivité DOM : chaque nœud SVG est ciblable via
querySelector, D3.js ou JavaScript natif pour des visualisations de données dynamiques. - Animations sans JavaScript : transitions et
@keyframesCSS appliqués directement aux éléments SVG.
Tableau des Attributs SVG Essentiels
Maîtriser les attributs fondamentaux de la balise SVG est indispensable pour créer des graphiques corrects, responsives et accessibles. Ce tableau de référence rapide couvre les attributs les plus utilisés en développement web professionnel.
| Attribut | Rôle | Exemple / Valeur |
|---|---|---|
viewBox | Définit le système de coordonnées interne SVG (min-x, min-y, largeur, hauteur). Clé pour le SVG responsive. | viewBox="0 0 200 100" |
width / height | Dimensions d'affichage dans la page. En %, l'élément s'adapte à son conteneur. | width="100%" height="auto" |
xmlns | Espace de noms XML requis pour la compatibilité XHTML et les parseurs stricts. | xmlns="http://www.w3.org/2000/svg" |
preserveAspectRatio | Contrôle le comportement du SVG lors du redimensionnement. xMidYMid meet conserve les proportions. | preserveAspectRatio="xMidYMid meet" |
role | Rôle ARIA de l'élément SVG pour les technologies d'assistance. | role="img" |
aria-labelledby | Référence l'id du <title> SVG comme nom accessible. | aria-labelledby="mon-titre" |
fill | Couleur de remplissage d'une forme. Surchargeable par CSS. | fill="#ff6600" ou fill="none" |
stroke | Couleur du contour d'une forme. | stroke="#333" |
stroke-width | Épaisseur du contour en unités SVG. | stroke-width="2" |
transform | Applique une transformation géométrique : translation, rotation, mise à l'échelle. | transform="rotate(45 100 100)" |
Exemples Pratiques SVG Inline en HTML5
Les quatre exemples suivants progressent du basique à l'avancé : dégradé linéaire, filtre SVG feDropShadow, courbe de Bézier avec path et animation CSS keyframes. Chaque exemple est intégralement commenté pour une approche pédagogique optimale.
Exemple 1 : Ellipse avec Dégradé Linéaire et Texte
La section <defs> définit les ressources SVG réutilisables (dégradés, filtres, masques). Un dégradé linéaire horizontal est appliqué à une ellipse, avec un texte superposé en blanc.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 130"
width="100%" role="img" aria-labelledby="titre-ellipse">
<!-- title : nom accessible lu par les lecteurs d'écran (WCAG 2.2) -->
<title id="titre-ellipse">Ellipse SVG avec dégradé jaune vers rouge</title>
<defs>
<!-- linearGradient : dégradé horizontal gauche→droite -->
<!-- x1/y1 = point de départ (0% = gauche), x2/y2 = point d'arrivée (100% = droite) -->
<linearGradient id="grad-ellipse" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#ffff00;stop-opacity:1"/>
<stop offset="100%" style="stop-color:#ff0000;stop-opacity:1"/>
</linearGradient>
</defs>
<!-- ellipse : cx/cy = centre, rx = demi-axe horizontal, ry = demi-axe vertical -->
<ellipse cx="300" cy="65" rx="120" ry="55" fill="url(#grad-ellipse)"/>
<!-- text : x/y = ancrage baseline gauche. fill = couleur du texte -->
<text fill="#fff" font-size="45" font-family="Verdana"
x="240" y="82" font-weight="bold">SVG</text>
</svg>Exemple 2 : Filtre SVG feDropShadow sur un Rectangle
Les filtres SVG permettent d'appliquer des effets visuels avancés (ombre portée, flou gaussien, luminosité) directement dans le balisage. Le filtre feDropShadow, introduit dans la spécification SVG 1.2 et supporté par tous les navigateurs modernes, est l'équivalent SVG du box-shadow CSS, mais applicable à n'importe quelle forme vectorielle.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 150"
width="300" height="150" role="img" aria-labelledby="titre-ombre">
<title id="titre-ombre">Rectangle bleu avec ombre portée SVG feDropShadow</title>
<defs>
<!-- filter : conteneur du filtre SVG, id référencé via filter="url(#...)" -->
<!-- x/y/width/height en % : zone étendue pour que l'ombre ne soit pas coupée -->
<filter id="ombre-portee" x="-20%" y="-20%" width="140%" height="140%">
<!-- feDropShadow : ombre portée simplifiée (alternative à feGaussianBlur + feOffset) -->
<!-- dx/dy = décalage horizontal/vertical de l'ombre en px -->
<!-- stdDeviation = rayon de flou de l'ombre (plus grand = plus diffuse) -->
<!-- flood-color = couleur de l'ombre, flood-opacity = opacité 0→1 -->
<feDropShadow dx="6" dy="6" stdDeviation="4"
flood-color="#333" flood-opacity="0.6"/>
</filter>
</defs>
<!-- rect : x/y = coin supérieur gauche, rx/ry = rayon des coins arrondis -->
<!-- filter="url(#ombre-portee)" applique le filtre défini dans defs -->
<rect x="30" y="20" width="200" height="80"
rx="12" ry="12"
fill="#4285f4"
filter="url(#ombre-portee)"/>
<text x="80" y="68" fill="#fff" font-size="22"
font-family="Arial">Filtre SVG</text>
</svg>Exemple 3 : Courbe de Bézier avec l'Élément path SVG
L'élément <path> est le plus puissant du langage SVG : il permet de dessiner n'importe quelle forme complexe via une mini-syntaxe de commandes. La commande C (Cubic Bézier) crée des courbes lisses définies par deux points de contrôle — c'est la base des logos, icônes et illustrations vectorielles professionnelles.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 200"
width="100%" role="img" aria-labelledby="titre-bezier">
<title id="titre-bezier">Courbe de Bézier cubique dessinée avec path SVG</title>
<!-- path : l'élément universel SVG pour toute forme complexe -->
<!-- Syntaxe des commandes : -->
<!-- M x y = MoveTo (déplace le curseur sans tracer) -->
<!-- C cx1 cy1, cx2 cy2, x y = CubicBezierTo -->
<!-- cx1/cy1 = 1er point de contrôle (tire le départ de la courbe) -->
<!-- cx2/cy2 = 2e point de contrôle (tire l'arrivée de la courbe) -->
<!-- x/y = point d'arrivée de la courbe -->
<path d="M 50,150 C 100,20 300,20 350,150"
fill="none" stroke="#e74c3c" stroke-width="4"/>
<!-- Points de repère visuels : cercles aux points de départ/arrivée -->
<circle cx="50" cy="150" r="6" fill="#2ecc71"/>
<circle cx="350" cy="150" r="6" fill="#2ecc71"/>
<!-- Points de contrôle de la courbe (en pointillés) -->
<line x1="50" y1="150" x2="100" y2="20"
stroke="#95a5a6" stroke-width="1" stroke-dasharray="5,4"/>
<line x1="350" y1="150" x2="300" y2="20"
stroke="#95a5a6" stroke-width="1" stroke-dasharray="5,4"/>
<circle cx="100" cy="20" r="5" fill="#3498db"/>
<circle cx="300" cy="20" r="5" fill="#3498db"/>
<!-- Légende intégrée dans le SVG -->
<text x="50" y="190" font-size="13" fill="#555">Départ</text>
<text x="315" y="190" font-size="13" fill="#555">Arrivée</text>
<text x="85" y="14" font-size="11" fill="#3498db">Ctrl 1</text>
<text x="285" y="14" font-size="11" fill="#3498db">Ctrl 2</text>
</svg>Exemple 4 : Animation SVG avec @keyframes CSS
Les éléments SVG inline acceptent les animations CSS @keyframes exactement comme des éléments HTML. Cette technique — sans une seule ligne de JavaScript — permet de créer des animations fluides et performantes (accélérées GPU via le compositor du navigateur) pour les icônes, loaders et indicateurs d'état.
<style> /* .pulse : cible la classe CSS appliquée au cercle SVG */ /* animation : nom durée timing-function délai itération direction fill-mode */ .pulse { animation: battre 1.4s ease-in-out infinite alternate; /* transform-origin : centre de la transformation (scale depuis le centre) */ transform-origin: center; } /* @keyframes définit les étapes de l'animation SVG */ @keyframes battre { from { /* État initial : cercle à sa taille normale, couleur vive */ transform: scale(1); fill: #e74c3c; } to { /* État final : cercle agrandi à 1.35x, couleur plus sombre */ /* alternate : l'animation fait l'aller-retour automatiquement */ transform: scale(1.35); fill: #c0392b; } } /* prefers-reduced-motion : désactive l'animation pour les utilisateurs sensibles */ /* (bonne pratique accessibilité WCAG 2.2 - critère 2.3.3 AAA) */ @media (prefers-reduced-motion: reduce) { .pulse { animation: none; } } </style> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200" role="img" aria-labelledby="titre-anim"> <title id="titre-anim">Cercle pulsant — animation CSS keyframes SVG</title> <!-- class="pulse" : connecte le cercle SVG à l'animation CSS définie ci-dessus --> <circle class="pulse" cx="100" cy="100" r="50" fill="#e74c3c"/> <text x="100" y="105" text-anchor="middle" font-size="14" fill="#fff" font-family="Arial">Pulse</text> </svg>
Pour aller plus loin sur les animations SMIL, les masques clip-path et les SVG sprites, consultez notre tutoriel SVG avancé complet.
Bonnes Pratiques SVG : Accessibilité WCAG 2.2 et Optimisation SEO
Un SVG de qualité professionnelle doit satisfaire simultanément les exigences d'accessibilité WCAG 2.2, d'indexabilité SEO et de performance. Voici les règles incontournables à appliquer systématiquement :
- Toujours définir viewBox : sans
viewBox, un SVG n'est pas responsive. CombinezviewBox="0 0 W H"avecwidth="100%"pour une adaptation automatique au conteneur parent. - Balises title et desc obligatoires pour les SVG informatifs :
<title>fournit le nom court (affiché en infobulle sur desktop),<desc>la description longue — tous deux lus par les lecteurs d'écran et indexés par Google. - SVG décoratifs : masquer aux AT : pour les icônes purement décoratives, ajoutez
aria-hidden="true"etfocusable="false"pour éviter un bruit inutile pour les utilisateurs de lecteurs d'écran. - Respecter prefers-reduced-motion : encapsulez vos animations CSS dans une media query
@media (prefers-reduced-motion: reduce)pour les désactiver chez les utilisateurs sensibles aux mouvements — critère WCAG 2.3.3. - Optimiser avec SVGO : l'outil CLI SVGO supprime les métadonnées inutiles (Inkscape, Illustrator), réduit les décimales et minifie le code — réductions de taille typiques de 30 à 70 %.
- Éviter les id dupliqués : en cas de SVG inline multiples sur une même page, les
iddes dégradés et filtres doivent être uniques, sous peine de conflits visuels imprévisibles.
Différences Fondamentales : SVG vs Canvas en HTML5
SVG est déclaratif et orienté DOM : chaque forme est un nœud persistant, modifiable via CSS et JavaScript, avec re-rendu partiel automatique. Canvas est impératif et bitmap : les formes sont converties en pixels dès le tracé, sans représentation DOM, ce qui impose de redessiner toute la scène pour animer un élément. Ce choix architectural détermine les performances, l'interactivité et l'accessibilité de votre application.
| Canvas — Bitmap Impératif | SVG — Vectoriel Déclaratif |
|---|---|
|
|
Recommandation 2026 : SVG pour logos, icônes, infographies, cartes interactives et data viz où accessibilité et SEO comptent. Canvas pour jeux, simulations de particules et traitements d'image. Pour le 3D : Three.js ou Babylon.js (WebGL).
Par carabde | Mis à jour le 27 février 2026