SVG

Dessin animé

Pi_roue.svg 0 1 2 3,14... 4 5 6,28...
La circonférence du cercle vaut 2π R
 
(Cliquez sur l'animation pour la réanimer)

Trois éléments permettent l'animation :

<animate>

Cette animation est fondée sur la modification d'attributs dans le temps.

<animateColor> ne doit plus être utilisée

<svg width="120" height="120">
  <title>Carré changeant de position, de couleur et de taille</title>
  <rect x="10" y="10" width="100" height="100">
    <animate attributeName="x" from="-100" to="120"
     dur="10s" repeatCount="indefinite"/>
     <animate attributeName="y" from="-100" to="120"
     dur="10s" repeatCount="indefinite"/>
     <animate attributeName="fill" values="red;blue;red"
     dur="10s" repeatCount="indefinite"/>
  </rect>
</svg>

La balise <animate> est contenue dans celle qu'elle doit être animée.

Autant d'attributs à modifier, autant de balises <animate> à inclure.

Carré changeant de position, de couleur et de taille

Principaux attributs :


Une coordonnée d'une série peut être modifiée ...

<svg width="200" height="100" id="svg2">
  <title>Modification de coordonnées dans le temps</title>
  <polygon points="" fill="yellow">
    <animate attributeName="points" begin="0s; svg2.click" dur="10s" fill="freeze"
      from="75,90   0,10 125,90"
        to="70,90 200,10 125,90"/>
  </polygon>
</svg>

Modification de coordonnées dans le temps

<animateMotion>

Déplacement d'une forme

Cette animation est fondée sur le déplacement le long d'une courbe.

<svg width="240" height="100">
  <title>Déplacement le long d'une courbe</title>
  <rect x="0" y="0" width="30" height="15">
    <animateMotion dur="5s" repeatcount="indefinite"
    path="M10,50 q60,50 100,0 q60,-50 100,0"/>
    </rect>
</svg>

L'animation est l'enfant de la forme.

Déplacement le long d'une courbe

L'attribut rotate="auto" permet de poser la forme en fonction de la tangente de la courbe.

<svg width="240" height="100">
  <title>Déplacement suivant la tangente d'une courbe</title>
  <rect x="0" y="0" width="30" height="15">
    <animateMotion dur="5s" repeatcount="indefinite" rotate="auto"
    path="M10,50 q60,50 100,0 q60,-50 100,0"/>
    </rect>
</svg>

Déplacement suivant la tangente d'une courbe

Dessiner le chemin et le parcourir

La balise <mpath>, enfant de <animateMotion>, permet de lier le chemin à suivre à un chemin dessiné et identifié.

<svg width="240" height="100">
  <title>Suivant un chemin donnée via la balise mpath</title>
  <path d="M10,50 q60,50 100,0 q60,-50 100,0" fill="none" stroke="black" id="myPath" />
  <rect x="0" y="0" width="30" height="15">
    <animateMotion dur="5s" repeatcount="indefinite" rotate="auto">
      <mpath href="#myPath" />
    </animateMotion>
  </rect>
</svg>

Suivant un chemin donnée via la balise mpath

Déplacement de plusieurs formes

<svg width="240" height="190">
  <title>Plusieurs formes liées ensemble</title>
  <g>
    <animateMotion id="motion1" dur="5s" repeatcount="indefinite"
      rotate="auto" path="M10,50 q60,50 100,0 q60,-50 100,0" />
    <rect x="0" y="0" width="30" height="15" />
    <circle cx="15" cy="20" r="5" fill="black" />
 </g>
</svg>

L'animation doit être déclarée avant les formes.

Plusieurs formes liées ensemble

Plusieurs déplacements de formes

<svg width="240" height="200">
  <title>Plusieurs formes non liées</title>
  <rect x="0" y="0" width="30" height="15">
    <animateMotion dur="5s" repeatcount="indefinite" path=
      "M10,50 q60,50 100,0 q60,-50 100,0"/>
    </rect>
  <circle cx="5" cy="95" r="5" fill="black">
    <animateMotion dur="5s" repeatcount="indefinite" path="M230,0 L0,90"/>
  </circle>
</svg>

Plusieurs formes non liées

Autant de déplacements, autant de balises <animateMotion>.

<animateTransform>

Cette animation est fondée sur la translation, agrandissement et/ou rotation.

La balise <animateTransform> est contenue dans celle qu'elle doit être animée ou contenue dans la balise <g> dans laquelle se trouve l'animation et les formes liées à cette animation.

Principaux attributs :

Translation

La translation ne modifie pas la forme (ni les angles, ni les côtés).

Translation d'une forme

<svg width="180" height="180">
  <title>Translation d'une forme</title>
  <line x1="0" y1="60" x2="60" y2="60" stroke="black">
    <animateTransform attributeName="transform" type="translate"
    from="0 0" to="60 60" dur="5s"
    repeatcount="indefinite" />
  </line>
</svg>

Translation d'une forme

Même translation pour plusieurs formes

<svg width="180" height="180">
  <title>Même translation pour plusieurs formes</title>
  <g stroke="black">
    <animateTransform attributeName="transform" type="translate"
      from="0 0" to="60 60"
       dur="5s" repeatcount="indefinite" />
    <line x1="0" y1="60" x2="60" y2="60" />
    <rect x="60" y="60" width="45" height="20" />
  </g>
</svg>

L'animation doit être déclarée avant les formes.

Même translation pour plusieurs formes

Différentes translations pour plusieurs formes

<svg width="180" height="180">
  <title>Différentes translations pour plusieurs formes</title>
  <line x1="0" y1="60" x2="60" y2="60" stroke="black">
    <animateTransform attributeName="transform" type="translate"
      from="0 0" to="60 60"
      dur="5s" repeatcount="indefinite" />
  </line>

  <rect x="60" y="60" width="45" height="20">
    <animateTransform attributeName="transform" type="translate"
      from="0 0" to="0 -60"
      dur="5s" repeatcount="indefinite" />
  </rect>

</svg>

Autant de translations, autant de balises <animateTransform>.

Différentes translations pour plusieurs formes

Agrandissement

Agrandissement d'une forme

<svg width="180" height="180">
  <title>Agrandissement d'une forme</title>
  <circle cx="50" cy="50" r="30">
    <animateTransform attributename="transform" type="scale"
      from="0 0" to="1 1"
      dur="5s" repeatcount="indefinite" />
  </circle>
</svg>

Agrandissement d'une forme

Même agrandissement pour plusieurs formes

<svg width="180" height="180">
  <title>Même agrandissement pour plusieurs formes</title>
  <g stroke="black">
    <animateTransform attributeName="transform" type="scale"
      from="1 1" to="0 0"
       dur="5s" repeatcount="indefinite" />
    <line x1="0" y1="60" x2="60" y2="60" />
    <rect x="60" y="60" width="45" height="20" />
  </g>
</svg>

Même agrandissement pour plusieurs formes

Différents agrandissements pour plusieurs formes

<svg width="180" height="180">
  <title>Différents agrandissements pour plusieurs formes</title>
  <line x1="0" y1="60" x2="60" y2="60" stroke="black">
    <animateTransform attributename="transform" type="scale"
      from="0 0" to="1 1"
      dur="5s" repeatcount="indefinite" />
  </line>

  <rect x="60" y="60" width="45" height="20">
    <animateTransform attributename="transform" type="scale"
      from="1 1" to="0 0"
      dur="5s" repeatcount="indefinite" />
  </rect>

</svg>

Autant de redimensionnements, autant de balises <animateTransform>.

Différents agrandissements pour plusieurs formes

Rotation

Rotation d'une forme

<svg width="180" height="180">
  <title>Rotation d'une forme</title>
  <line x1="0" y1="60" x2="60" y2="60" stroke="black">
    <animateTransform attributeName="transform" type="rotate"
    from="0 60 60" to="360 60 60"
    dur="5s" repeatcount="indefinite" />
  </line>
</svg>

Rotation d'une forme

Même rotation pour plusieurs formes

<svg width="180" height="180">
  <title>Même rotation pour plusieurs formes</title>
  <g stroke="black">
    <animateTransform attributeName="transform" type="rotate"
      from="0 60 60" to="-360 60 60"
       dur="5s" repeatcount="indefinite" />
    <line x1="0" y1="60" x2="60" y2="60" />
    <rect x="60" y="60" width="45" height="20" />
  </g>
</svg>

Même rotation pour plusieurs formes

Différentes rotations pour plusieurs formes

<svg width="180" height="180">
  <title>Différentes rotations pour plusieurs formes</title>
  <line x1="0" y1="60" x2="60" y2="60" stroke="black">
    <animateTransform attributeName="transform" type="rotate"
      from="0 60 60" to="360 60 60"
      dur="5s" repeatcount="indefinite" />
  </line>

  <rect x="60" y="60" width="45" height="20">
    <animateTransform attributeName="transform" type="rotate"
      from="0 60 60" to="-360 60 60"
      dur="10s" repeatcount="indefinite" />
  </rect>

</svg>

Autant de rotations, autant de <animateTransform>.

Différentes rotations pour plusieurs formes

Plusieurs transformations d'une forme

L'attribut additive="sum" permet de cumuler les transformations. Ci-dessous, transalation + agrandissement + rotation d'une ligne.

<svg width="180" height="180">
  <title>Plusieurs transformations d'une forme</title>
  <line x1="0" y1="60" x2="60" y2="60" stroke="black">
    <animateTransform attributename="transform" dur="5s" repeatcount="indefinite" additive="sum"
      type="translate" from="0 0" to="60 60" />
    <animateTransform attributename="transform" dur="5s" repeatcount="indefinite" additive="sum"
      type="scale" from="0 0" to="1 1" />
    <animateTransform attributename="transform" dur="5s" repeatcount="indefinite" additive="sum"
      type="rotate" from="0 60 60" to="360 60 60" />
  </line>
</svg>

Autant de transformations simultanées, autant de balises <animateTransform> dans la balise contenante.
Autant de transformations successives, autant de balises contenant une ou plusieurs balises <animateTransform>.

Plusieurs transformations d'une forme

Attributs d'animation


Le format APNG (Animated Portable Network Graphics) semble avoir été abandonné.
Le format GIF (Graphics Interchange Format), naquit en 1987 (avec le web) et y connut un grand succès. Dorénavant, il est dans le domaine public (selon les régions, depuis 2003-2006).

Au niveau de l'animation, le format SVG semble donc être le plus performant, tant au niveau de la légèreté du fichier que de son implémentation dans les navigateurs, de la couleur transparence, de la facilité de la modifier par programmation, de la non pixellisation  ...

Exemple d'une animation SVG qui ne pèse que 12 188 octets : Toy_train_SMIL