Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer : 
Jouer plusieurs animations non linéaires 
A l'occasion des précédentes 
astuces Javascript , nous avons compris comment réaliser des 
effets d'animation par le code . Ici, nous poursuivons dans cette voie. Mais cette fois, le 
code Javascript  va influer sur des 
propriétés et fonctions Css  pour 
jouer les animations .
Sur l'exemple illustré par la capture, au clic de l'utilisateur sur l'un des quatre carrés de couleur, chaque forme entame un 
déplacement diagonal  vers le bas. Mais chaque forme ne se déplace pas à la même vitesse. De plus, les trajectoires ne sont pas linéaires.
Source Html 
Pour la mise en place de cette nouvelle 
astuce Javascript , nous proposons d'appuyer les travaux sur une 
page Html  offrant déjà ces formes géométriques, réglées par des 
styles Css .
La page Web, nommée index.htm, est à la racine du dossier de décompression.
Double cliquer sur ce fichier index.htm  pour l'ouvrir dans le navigateur par défaut, 
Nous retrouvons la page Web de la démonstration. Mais cette fois, au clic sur l'une des formes, aucun déplacement n'est à observer fort naturellement. Nous devons créer ces 
effets d'animation .
A la racine du dossier de décompression, cliquer droit sur le fichier index.htm , 
Dans le menu contextuel qui surgit, choisir de l'ouvrir avec un éditeur comme le Notepad++, 
Nous affichons ainsi le 
code Html  de la 
page Web . Les formes géométriques sont placées vers le bas du code dans un 
calque d'identifiant auCentre .
...<div class="boite calque1" onclick="Animer()"></div>  
Au clic, chacun de ces calques appelle une 
fonction  nommée 
Animer . Elle est bien présente en bas de la page dans une 
section de script  mais elle est vide pour l'instant. C'est elle que nous devons implémenter.
...function Animer()  
De même et vous l'avez sans doute constaté, chacun des 
calques  de ces formes est associé à 
deux styles . Le premier est commun à tous. Il est nommé 
boite  et se charge de réglages classiques comme ceux des dimensions par exemple. Le second diffère en fonction de la forme pour lui attribuer une couleur différente. Mais c'est aussi cette différence remarquable que nous saurons exploiter pour piloter les 
quatre animations  en même temps, à l'aide d'une boucle.
Variables de l'animation 
Pour débuter simplement, nous allons nous charger de 
régler l'animation  uniquement pour le premier carré de couleur. Et pour cela, nous avons besoin tout d'abord de deux 
variables . La première doit permettre de récupérer le 
calque de la forme . La seconde doit servir à 
piloter ce calque  par le 
code Javascript  pour 
jouer son animation .
Dans les bornes de la fonction , ajouter les deux déclarations ainsi que l'affectation suivantes : function Animer()var cible; var jouer;  
Une fois n'est pas coutume, nous ne pouvons pas utiliser la 
méthode getElementById  de l'
objet Javascript document  pour récupérer le 
calque  concerné par son 
identifiant . La raison est simple. Il n'en possède pas. C'est alors que surgit la 
méthode querySelector . En lui passant en paramètre le nom de l'un de ses styles (préfixé d'un point), nous pointons bien sur le calque souhaité désormais stocké dans la 
variable objet cible .
Jouer l'animation de la forme 
Maintenant, il est question de 
jouer l'animation de déplacement  de la 
forme géométrique . Et pour cela, nous allons exploiter la 
méthode animate  associée à la 
variable objet cible  représentant le calque. Cette méthode requiert deux arguments. En premier paramètre nous devons lui transmettre les 
étapes de l'animation  qui sont gérées par un 
keyframes que nous avons découvert à l'occasion des astuces Css . Grâce à lui, nous allons pouvoir concevoir une 
animation non linéaire . En deuxième paramètre, nous devons lui transmettre la 
durée en millisecondes  pendant laquelle doit se 
jouer l'animation .
A la suite du code de la fonction, ajouter l'instruction Javascript  suivante : function Animer()jouer = cible.animate([  
Nous définissons donc une 
animation en trois étapes  grâce à l'
attribut Css transform  appelant la 
fonction Css translate . Nous partons de la position d'origine. Nous observons un premier palier 100 pixels plus à droite et 75 pixels plus bas pour finir à 200 pixels plus bas et 200 pixels plus à droite. Le tout doit se jouer sur une demi-seconde (500 millisecondes).
Enregistrer les modifications et basculer sur le navigateur (ALT + Tab), 
Rafraîchir la page Web (F5) et cliquer sur le premier carré, 
Comme vous le constatez, l'
animation  se joue effectivement, mais à peine la position finale est atteinte que la forme recouvre son état d'origine.
Figer la fin de l'animation 
Pour corriger ce défaut, nous avons besoin d'ajouter un 
gestionnaire d'événements . Il s'agit en quelque sorte d'un observateur (Listener). Son rôle est de 
détecter la fin de l'animation  pour la figer dans son état final.
A la suite du code, ajouter l'instruction Javascript  suivante : function Animer()jouer.addEventListener('finish', function(){  
C'est la 
méthode addEventListener  qui officie pour observer l'animation sur laquelle elle est appliquée (jouer). Avec la 
valeur finish  en premier paramètre, nous détectons la fin de cette dernière. Et avec le 
réglage Css  opéré en second paramètre, nous indiquons comment intervenir. En exploitant de nouveau la 
fonction Css  sur les valeurs de 
fin de l'animation , nous la figeons sur son état d'arrivée.
Enregistrer les modifications (CTRL + S) et basculer sur le navigateur (ALT + Tab), 
Actualiser la page Web (F5) et cliquer sur le premier carré, 
Comme vous pouvez le constater, l'
animation se joue  et 
conserve sa position finale , contrairement à ce que nous avons pu constater précédemment.
Combiner les animations 
Maintenant, il est question de jouer les 
quatre animations  des quatre formes en même temps. Une 
boucle for  permet de parcourir chacun des calques grâce aux identifiants incrémentés. Il est donc possible d'enclencher les 
animations  tour à tour. Mais un problème se pose. L'
événement  consistant à 
détecter la fin de l'animation  pour la figer dans son état final n'aura pas le temps de se déclencher pour agir. A chaque passage dans la 
boucle , il sera détruit et remplacé par un nouveau gestionnaire destiné à contrôler l'
animation  suivante. L'
astuce  consiste à le détacher dans une 
fonction indépendante  à appeler à chaque traitement récursif. Ainsi gérés en mémoire, nous aurons bien quatre gestionnaires pour contrôler les quatre animations.
Sous la fonction Animer , créer la fonction Ecouter  comme suit : function Ecouter(jouer,cible) 
Nous la signons avec deux paramètres car il est essentiel qu'elle récupère l'objet désignant le calque et celui gérant son animation. C'est ainsi que nous pourrons figer cette dernière.
Dans la procédure Animer , sélectionner les trois lignes de l'instruction de l'observateur , 
Les couper (CTRL + X) puis les coller dans la fonction Ecouter , function Ecouter(jouer,cible)jouer.addEventListener('finish', function(){  
Ainsi nous détachons complètement le gestionnaire de fin de ses animations qui devront se jouer dans une boucle désormais.
Dans la 
fonction Animer , nous devons maintenant passer en revue tous les calques des formes géométriques pour les animer tour à tour.
Après les déclarations de la fonction Animer, englober le reste du code dans une boucle : function Animer()for(var i=1;i<5;i++) }  
Nous faisons varier son indice de la valeur 1 à la valeur 4 pour considérer les quatre calques possédant cette extension numérique dans l'intitulé de leurs identifiants.
Bien sûr, ce n'est pas fini. Nous devons adapter l'
affectation de lavariable cible  pour qu'elle pointe sur le calque suivant à chaque passage dans la boucle.
Adapter l'affectation de la variable  cible comme suit : cible = document.querySelector('.calque'   + i ); 
De cette manière, nous allons considérer dans l'enchaînement les calques : calque1, calque2, calque3 et calque4 des quatre carrés.
De plus et désormais, pour plus de subtilité, nous souhaitons faire 
varier les vitesses de ces animations . Pour cela, il suffit de multiplier le 
délai  déjà défini par la 
variable de boucle .
Dans l'affectation de la variable jouer , transformer le délai  comme suit : 500*i , 
De cette manière, la deuxième animation sera deux fois plus lente et les suivantes respectivement trois fois et quatre fois plus lentes.
Enfin, à chaque fois qu'une animation est lancée, nous devons déclencher son gestionnaire pour l'observer et l'intercepter à l'issue.
Avant la fermeture de la boucle , ajouter l'appel de la fonction Ecouter  :Ecouter(jouer,cible); 
Le 
code Javascript  complet que nous avons construit pour 
diriger ces animations  est le suivant :
<script type="text/javascript" language="javascript">+ i );*i );Ecouter(jouer,cible);  
Il est temps de tester le résultat.
Enregistrer les modifications (CTRL + S), 
Revenir sur le navigateur Internet (Alt + Tab), 
Puis, cliquer sur l'un des quatre carrés, 
Comme vous pouvez l'apprécier, les quatre animations se jouent en même temps et selon une trajectoire non linéaire grâce au Keyframes en trois étapes que nous avons construit. De plus, elles ne vont pas à la même vitesse. Plus le carré est éloigné, plus il met du temps à rejoindre sa position finale.
C'est un joli ballet que nous avons construit là.