Blog / SVG/CSS

Animations SVG : guide complet du line draw au morphing

Maitrisez l'art d'animer vos SVG avec CSS et SMIL. Du classique effet de dessin de ligne au morphing avance de formes, decouvrez toutes les techniques pour donner vie a vos icones et illustrations.

Introduction aux animations SVG

Le format SVG (Scalable Vector Graphics) offre des possibilites d'animation incomparables par rapport aux images bitmap. Grace a sa nature vectorielle et son integration dans le DOM, chaque element d'un SVG peut etre anime individuellement avec une precision chirurgicale.

Dans ce guide complet, nous allons explorer 6 techniques d'animation SVG essentielles, du celebre effet "line draw" au morphing avance de formes. Chaque technique est accompagnee d'exemples interactifs et de code pret a l'emploi.

💡
Pourquoi animer en SVG ?

Les animations SVG sont legeres (quelques Ko), infiniment scalables, et ne perdent jamais en qualite. Elles sont ideales pour les icones, logos, illustrations et visualisations de donnees.

Les animations SVG peuvent etre realisees de trois manieres :

  • CSS Animations/Transitions : La methode la plus simple et la plus performante
  • SMIL (Synchronized Multimedia Integration Language) : Animations natives SVG, puissantes mais deprecated dans certains navigateurs
  • JavaScript : Pour les animations complexes et interactives (GSAP, anime.js, etc.)

1. Animation de stroke (line draw effect)

L'effet "line draw" est probablement l'animation SVG la plus populaire. Elle donne l'impression que le dessin se trace sous vos yeux, comme si quelqu'un le dessinait en temps reel.

Cette technique repose sur deux proprietes CSS magiques : stroke-dasharray et stroke-dashoffset.

Checkmark
Cercle
Rectangle
line-draw.css
/* La magie du line draw */
.svg-line-draw path,
.svg-line-draw circle,
.svg-line-draw rect {
  /* Definit la longueur du trait et de l'espace */
  stroke-dasharray: 1000;

  /* Decale le trait (le "cache") */
  stroke-dashoffset: 1000;

  /* Animation qui "revele" le trait */
  animation: lineDraw 2s ease forwards;
}

@keyframes lineDraw {
  to {
    stroke-dashoffset: 0;
  }
}

Calculer la longueur exacte du path

Pour une animation parfaite, vous devez connaitre la longueur exacte de votre tracé. Utilisez JavaScript pour l'obtenir :

get-path-length.js
// Selectionnez votre element SVG
const path = document.querySelector('svg path');

// Obtenez la longueur totale
const length = path.getTotalLength();
console.log('Longueur du path:', length);

// Appliquez cette valeur
path.style.strokeDasharray = length;
path.style.strokeDashoffset = length;
💡
Astuce pro

Utilisez une valeur volontairement elevee (comme 1000) pour stroke-dasharray si vous ne voulez pas calculer la longueur exacte. Ca fonctionne tant que la valeur est superieure a la longueur reelle du path.

2. Morphing de paths SVG

Le morphing permet de transformer fluidement une forme en une autre. C'est une technique impressionnante pour les transitions d'icones (hamburger vers croix, play vers pause, etc.).

Pour que le morphing fonctionne, les deux paths doivent avoir le meme nombre de points. C'est la contrainte principale de cette technique.

Cliquez pour morpher Play/Pause (cliquez)
Cliquez pour morpher Menu/Close (cliquez)
morph-icon.css
/* Transition CSS sur l'attribut d */
.svg-morph path {
  transition: d 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}

/* Etat initial : triangle (play) */
.svg-morph.play path {
  d: path("M30 20 L30 80 L80 50 Z");
}

/* Etat morphe : deux barres (pause) */
.svg-morph.pause path {
  d: path("M25 20 L25 80 L40 80 L40 20 M60 20 L60 80 L75 80 L75 20");
}
morph-icon.js
// Toggle entre play et pause
function togglePlayPause(svg) {
  const path = svg.querySelector('path');
  const isPlay = svg.dataset.state !== 'pause';

  if (isPlay) {
    // Morph vers pause (2 barres)
    path.setAttribute('d', 'M25 20 L25 80 L40 80 L40 20 Z M60 20 L60 80 L75 80 L75 20 Z');
    svg.dataset.state = 'pause';
  } else {
    // Morph vers play (triangle)
    path.setAttribute('d', 'M30 20 L30 80 L80 50 Z');
    svg.dataset.state = 'play';
  }
}
⚠️
Compatibilite du morphing CSS

L'animation de la propriete d en CSS pur ne fonctionne que dans les navigateurs modernes (Chrome, Firefox, Safari 15.4+). Pour une compatibilite maximale, utilisez une bibliotheque comme GSAP MorphSVG ou flubber.

3. Animations CSS sur SVG

Les elements SVG acceptent la plupart des proprietes CSS animables : transform, opacity, fill, stroke, et bien d'autres. Voici les animations les plus utiles.

Rotation continue

Loader
Soleil
Steps
svg-rotate.css
.svg-rotate {
  animation: rotate 2s linear infinite;
  transform-origin: center;
}

@keyframes rotate {
  to {
    transform: rotate(360deg);
  }
}

/* Variante avec steps pour effet saccade */
.svg-rotate-steps {
  animation: rotate 1s steps(8) infinite;
}

Pulse et Bounce

Pulse
Bounce
Shake
svg-effects.css
/* Effet pulse - ideal pour les notifications */
.svg-pulse {
  animation: pulse 1.5s ease-in-out infinite;
}

@keyframes pulse {
  0%, 100% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(1.15);
    opacity: 0.8;
  }
}

/* Effet bounce - attire l'attention */
.svg-bounce {
  animation: bounce 1s ease infinite;
}

@keyframes bounce {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
}

/* Effet shake - alertes urgentes */
.svg-shake {
  animation: shake 0.5s ease-in-out infinite;
}

@keyframes shake {
  0%, 100% { transform: translateX(0) rotate(0); }
  25% { transform: translateX(-3px) rotate(-5deg); }
  75% { transform: translateX(3px) rotate(5deg); }
}

Animation de couleurs

Stroke color
Fill fade
color-animation.css
/* Animation de la couleur du stroke */
.svg-stroke-color path {
  animation: strokeColor 3s ease infinite;
}

@keyframes strokeColor {
  0%, 100% { stroke: #6366f1; }
  33% { stroke: #8b5cf6; }
  66% { stroke: #d946ef; }
}

/* Animation du fill */
.svg-fill-fade {
  animation: fillFade 2s ease infinite;
}

@keyframes fillFade {
  0%, 100% { fill: #6366f1; }
  50% { fill: #8b5cf6; }
}

4. SMIL animations (animate, animateTransform)

SMIL (Synchronized Multimedia Integration Language) permet de definir des animations directement dans le SVG, sans CSS ni JavaScript. Bien que deprecie par Chrome pendant un temps, il est maintenant supporte par tous les navigateurs modernes.

Cercle pulsant
Rotation SMIL
Mouvement easing
smil-animations.svg
<!-- Animation d'attribut simple -->
<circle cx="50" cy="50" r="40" fill="#6366f1">
  <animate
    attributeName="r"
    values="30;40;30"
    dur="2s"
    repeatCount="indefinite"
  />
</circle>

<!-- Animation de transformation -->
<rect x="30" y="30" width="40" height="40" fill="#8b5cf6">
  <animateTransform
    attributeName="transform"
    type="rotate"
    from="0 50 50"
    to="360 50 50"
    dur="3s"
    repeatCount="indefinite"
  />
</rect>

<!-- Animation avec easing personnalise -->
<circle cx="20" cy="50" r="10" fill="#d946ef">
  <animate
    attributeName="cx"
    values="20;80;20"
    dur="2s"
    repeatCount="indefinite"
    calcMode="spline"
    keySplines="0.4 0 0.2 1; 0.4 0 0.2 1"
  />
</circle>
💡
Avantage SMIL

Les animations SMIL fonctionnent meme quand le SVG est utilise comme <img> ou en background-image, contrairement au CSS qui ne s'applique que sur les SVG inline.

5. Icones animees pratiques

Voici une collection d'icones animees pretes a l'emploi pour vos projets. Ces animations sont optimisees pour les micro-interactions et le feedback utilisateur.

Icone de chargement

Spinner
Dots loader
Bars loader

Icones de statut

Success
Error
Warning
success-icon.svg
<svg width="60" height="60" viewBox="0 0 50 50" fill="none">
  <!-- Cercle qui se dessine -->
  <circle cx="25" cy="25" r="20" stroke="#10b981" stroke-width="3">
    <animate
      attributeName="stroke-dasharray"
      values="0 126;126 126"
      dur="0.5s"
      fill="freeze"
    />
  </circle>

  <!-- Checkmark qui se dessine apres -->
  <path d="M15 25 L22 32 L35 18"
        stroke="#10b981"
        stroke-width="3"
        stroke-linecap="round"
        stroke-linejoin="round">
    <animate
      attributeName="stroke-dasharray"
      values="0 30;30 30"
      dur="0.3s"
      begin="0.5s"
      fill="freeze"
    />
  </path>
</svg>

6. Performance et accessibilite

Les animations SVG sont generalement performantes, mais quelques precautions s'imposent pour garantir une experience optimale a tous vos utilisateurs.

Optimisation des performances

  • Privilegiez transform et opacity : Ces proprietes beneficient de l'acceleration GPU
  • Evitez d'animer les filtres : Les filter SVG sont couteux en ressources
  • Limitez le nombre d'animations simultanees : Au-dela de 10, les performances peuvent chuter
  • Utilisez will-change avec parcimonie : Reservez-le aux elements vraiment animes
performance.css
/* Preparation pour l'animation */
.svg-animated {
  will-change: transform;
  contain: layout style;
}

/* Forcer le rendu GPU */
.svg-gpu {
  transform: translateZ(0);
}

Accessibilite

Les animations peuvent poser probleme aux utilisateurs sensibles aux mouvements. Respectez toujours leur preference systeme :

accessibility.css
/* Respecter la preference utilisateur */
@media (prefers-reduced-motion: reduce) {
  svg * {
    animation: none !important;
    transition: none !important;
  }

  /* Afficher l'etat final pour les line draw */
  .svg-line-draw path,
  .svg-line-draw circle {
    stroke-dashoffset: 0;
  }
}
⚠️
Animations SMIL et accessibilite

Les animations SMIL (integrees dans le SVG) ne sont pas affectees par prefers-reduced-motion. Pour les desactiver, vous devrez utiliser JavaScript pour supprimer ou modifier les elements <animate>.

Texte alternatif pour SVG

accessible-svg.html
<!-- SVG accessible avec role et titre -->
<svg role="img" aria-labelledby="icon-title icon-desc">
  <title id="icon-title">Chargement en cours</title>
  <desc id="icon-desc">Animation de chargement circulaire</desc>
  <!-- Contenu SVG -->
</svg>

<!-- SVG decoratif (ignorer par les lecteurs d'ecran) -->
<svg aria-hidden="true" focusable="false">
  <!-- Contenu SVG decoratif -->
</svg>

Conclusion

Les animations SVG offrent des possibilites infinies pour enrichir vos interfaces. Du simple effet line draw aux morphings complexes, vous disposez maintenant d'un arsenal complet de techniques.

Les points cles a retenir :

  • Line draw : Utilisez stroke-dasharray et stroke-dashoffset pour l'effet de dessin
  • Morphing : Assurez-vous que vos paths ont le meme nombre de points
  • CSS vs SMIL : CSS est plus simple, SMIL fonctionne partout (meme en img)
  • Performance : Privilegiez transform et opacity
  • Accessibilite : Respectez toujours prefers-reduced-motion
🎨
Explorez notre bibliotheque

Retrouvez plus de 50 icones et illustrations SVG animees pretes a l'emploi dans notre bibliotheque d'effets, avec code copiable en un clic.