Animation
Une animation en SVG peut se faire en manipulant les propriétés des balises avec le Javascript.
Définition : requestAnimationFrame
La fonction window.requestAnimationFrame permet de lancer une fonction (callback) avant le prochain rafraîchissement de l'écran.
Pour réaliser une animation, il faut que la fonction de callback appelle de nouveau window.requestAnimationFrame.
Le rafraîchissement s'effectuant en moyenne 60 fois par seconde, on peut obtenir une animation fluide et homogène.
let nb=0;
// fonction de callback
const action = () => {
nb++;
console.log(nb);
window.requestAnimationFrame(action);
}
// lancement de la fonction de callback
window.requestAnimationFrame(action);
Copiez le code dans votre console et testez.
La fonction de callback peut contenir un paramètre de temps. Ce paramètre correspond au temps écoulé en millisecondes depuis l'ouverture de la page.
// fonction de callback
const action = time => {
console.log(time);
window.requestAnimationFrame(action);
}
// lancement de la fonction de callback
window.requestAnimationFrame(action);
Calcul de la moyenne de temps écoulée entre deux appels de la fonction.
let before=performance.now(), nb=0, somme=0;
// fonction de callback
const action = time => {
nb++;
somme += time - before
console.log(somme/nb);
before = time;
window.requestAnimationFrame(action);
}
// lancement de la fonction de callback
window.requestAnimationFrame(action);
performance.now() : temps écoulé depuis l'ouverture de la page.
Copiez le code dans votre console et testez.
Vous pouvez constater que la moyenne tend vers 16,7ms.
Attention, si vous changez d'onglet, il n'y a plus de rafraîchissement d'écran dans l'onglet, donc la moyenne augmente.
Exemple : Animation
Déplacement d'un cercle de gauche à droite puis de droite à gauche.
On modifie la coordonnée cx à intervalle de temps régulier.
<svg width="300" height="200">
<circle cx="1" cy="70" r="10" />
</svg>
<script>
const disque = document.querySelector('svg circle');
let cx=1, dx = 1;
// fonction de modification de cx
const deplacer = () => {
// coordonnée cx est comprise entre 0 et 300
if(cx<0 || cx>300){
// change le sens de modification de cx
dx = -dx;
}
// modification de x
cx += dx;
disque.setAttribute('cx',cx);
// relance la fonction deplacer
window.requestAnimationFrame(deplacer);
}
// lancement de la fonction deplacer
window.requestAnimationFrame(deplacer);
</script>