Accueil

Traduction

Dessiner avec SVG - sommaire

Dessiner avec SVG - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Animer des objets SVG via CSS

Si vous avez lu mon tuto (dans ce même site) sur CSS, vous savez que depuis la version 3 il est possible d'animer des éléments HTML à partir d'un modèle d'animation appelé keyframes. Il suffit ensuite d'appeler ce keyframes via une règle de style basée sur le raccourci animation.

Sachez que ces mêmes outils CSS peuvent s'appliquer à des objets SVG mais avec certaines restrictions ...
Je vous invite à revoir le chapitre à ce sujet dans le tutoriel CSS3 : Animation d'éléments HTML via CSS3

Un exemple basique pour commencer

Thème : un rond devient de plus en plus gros et de plus en plus opaque puis c'est l'inverse.

Première solution envisagée

Le code SVG

Via les valeurs du viewBox, l'origine du canevas est son centre.
Remarquez que les paramètres géométriques du rond (cx,cy,r) sont passés en propriétés.

Le code CSS

@keyframes animer
{ 
	0% {fill-opacity:0.1; r : 10;}
	50% {fill-opacity :1 ; r: 200 ;}
	100% {fill-opacity:0.1; r : 10; }
}
#rond {animation : animer 20s 0s infinite linear;}

On définit un modèle d'animation : un "keyframes". Dans ce keyframes on modifie les valeurs d'un paramètre de style (fill-opacity) et d'un paramètre géométrique (r).

Le keyframes est ensuite appliqué à différents objets SVG via des règles de style. Ici la règle de style #rond {} est basée sur différentes fonctions du raccourci animation : "name, duration, delay, iteration-count, timing-function". Il pourrait y avoir jusqu'à 8 fonctions (ou huit propriétés CSS préfixées animation-.

Je rappelle que tous les outils d'animation CSS3 peuvent s'appliquer tant à des éléments HTML qu'à des objets SVG.
Lien : animation d'éléments HTML via CSS3

Le code du keyframes 'animer' repose sur la spécification SVG version 2 qui autorise à passer en propriétés non seulement les paramètres de style mais aussi les paramètres géométriques (cx,cy,r,rx,ry,x,y,width, height,etc.).
Dans la règle de style #rond{...}, la propriété transform-origin est devenue inutile puisque l'origine du canevas est déjà son centre.
,

Le rendu

Sous Firefox le canevas reste vide ... par contre le rendu est parfait sous Chrome & Edge.
Firefox reste à la version 1 de SVG ; or selon la norme SVG1 les paramètres géométriques ne peuvent être passés qu'en attributs et jamais en propriétés.

Solution retenue

Cette solution doit être compatible avec tous les navigateurs populaires ; il faut donc mixer SMIL & CSS.

Le code SVG

L'origine du canevas est toujours son centre.
Le paramètre géométrique "r" est modifié via le SMIL tandis que le paramètre de style fill_opacity sera changé via le CSS.

Le CSS

@keyframes animer2
{ 
	0% {fill-opacity:0.1;}
	50% {fill-opacity :1 ;}
	100% {fill-opacity:0.1;}
}
#rond2 {animation : animer2 20s 0s infinite linear;}

Le rendu

Animations basées sur "scale" ou "rotate"

les transformations de type "scale" et "rotate" peuvent s'accompagner aussi d'une translation si certaines précautions ne sont pas prises ...

Rappel

Pour un élément HTML, transform-origin fait référence à l'élément lui-même alors qu'en SVG ce paramètre fait référence à la zone de dessin ("canevas").
Pour un élément HTML, la valeur par défaut de cette propriété est "center center" : centre de l'élément lui-même.
Tandis que pour un élément SVG, l'origine de la transformation est l'origine du canevas et celle-ci est le plus souvent le coin supérieur gauche du canevas (mais pas toujours ...).

Transformation : rotation

Le rendu

Ci-dessous trois carrés qui tournent autour du centre du canevas.

Le code SVG

L'origine du canevas est ici son coin supérieur gauche.
Les trois formes sont regroupées dans un groupe identifié "groupe".

Le code CSS

@keyframes pivoter
{
	from {transform : rotate(0deg); }
	to {transform : rotate(360deg); }
}
#groupe {animation : pivoter 12s 0s infinite linear ; transform-origin : 50% 50%; }

Observez bien la règle de style #groupe{ } ; on anime le groupe de formes en appliquant le modèle "pivoter" ; l'origine de la rotation doit être le centre du canevas.

Transformation : changement d'échelle

Le rendu

Le centre du carré rest toujours le centre du canevas.

Le code CSS

@keyframes grossir
{
	from {transform :scale(1); }
	to {transform : scale(3); }
}
#carre {animation : grossir 10s 0s linear infinite alternate ;}

Le code HTML,SVG et JS

Le canevas a pour origine son centre donc transform-origin : 50% 50% est inutile.
Dans les instructions JS on manipule la propriété animation-play-state qui devient "animationPlayState" en JS).

Animation de texte

Vous pouvez bien sûr animer un élément text de SVG via le CSS.

Le rendu

Animer un texte SVG avec CSS !

Le code SVG

Rappel : la balise SVG étant un élémént HTML on peut lui appliquer un dégradé linéaire défini en CSS.

Le code CSS

    
text{font-family : arial ; font-weight : bold ;	font-size : 60px ;  
text-shadow : 5px 5px 5px grey ;fill : navy; }
@keyframes deplace
	{ 
	0% {transform:translateX(-900px); }
	50%{transform : translateX(0px);}
	100% {transform : translateX(900px);}
	}
text{animation : deplace 10s 0s infinite linear alternate;}

Le texte change de direction à chaque cycle car dans la propriété animation il y a le terme alternate.

Une animation 3D

Ci-dessous un jet qui atterit sur la piste.

Le rendu


Il s'agit d'un document SVG qui compte tenu de la complexité du code est inséré via la balise object.

Le code du fichier "atterrissage.svg"

Commentaire

Rappel : dans le cadre d'un fichier SVG (code SVG externe) les espaces de noms ("namespaces") xmlns="http://www.w3.org/2000/svg" & xmlns:xlink="http://www.w3.org/1999/xlink" sont obligatoires.

Le canevas a pour "background" une image vectorielle qui a été produite avec Inkscape : piste.svg.

Le document SVG comprend une feuille de style avec un "keyframes" ; ce modèle d'animation est appliqué à l'objet SVG identifié "jet".
Cet objet "jet" est le clone d'un modèle identifié "avion".
#jet {animation : animer 16s 0s infinite linear forwards ;} : je ne fais pas appel à la propriété transform-origin car je veux que l'agrandissement de l'avion s'accompagne aussi de sa translation. Donc l'origine de la transformation reste le coin supérieur gauche du canevas.