Vous pouvez me contacter via Facebook pour questions & suggestions :
Page Facebook relative à mon site
Jusqu'à présent nous avons animé les éléments SVG via le SMIL. Mais il existe deux autres solutions : animer avec JavaScript ou
animer avec CSS.
La solution JavaScript est la plus pertinente en cas d'animation complexe ; par exemple une animation qui ne se contente pas
de restyliser des objets SVG mais aussi de modifier leurs attributs voire de créer de nouveaux objets.
Le rond rouge est de plus en grand et de plus opaque puis c'est l'inverse et le cycle reprend à l'infini ...
var X = 400 ; //largeur définie dans le viewbox
var rond = document.querySelector('circle') ;
var rayon = rond.getAttribute('r');
rayon = parseInt(rayon) ;
var opacite =rond.style.fillOpacity ;
opacite =parseFloat(opacite);
var v_rayon = 2; var v_opacite = 0.01 ;
setInterval(animate,100) ;
function animate()
{
if (rayon >= X/4) { v_rayon = -2 ;v_opacite = -0.01; }
if (rayon <= 10) { v_rayon = 2 ; v_opacite = 0.01; }
rayon += v_rayon ;
opacite += v_opacite;
rond.setAttribute('r',rayon) ;
rond.style.fillOpacity = opacite ;
} // fin fonction animate
Ici il faut modifier la valeur de la propriété opacity et la valeur de l'attribut r de l'objet
de type "circle".
var rayon = rond.getAttribute('r') : récupère la valeur de l'attribut r de l'objet référencé "rond".
Attention la méthode getAttribute() retourne une chaine numérique donc il faut convertir en entier avant
toute incrémentation.
var opacite =rond.style.fillOpacity : la variable opacité récupère la valeur de la propriété de style fill-opacity.
Mais dans un script il faut écrire fillOpacity (syntaxe JavaScript).
La variable opacite récupère une chaine ; il faut donc la convertir sous forme d'un décimal.
La animate qui modifie le rayon du cercle et son opacité.
Cette fonction est appelée tous les 100 millisecondes donc 10 fois par seconde grâce au timer setInterval().
Étudions maintenant de plus près la fonction animate !
Pour changer la valeur d'un attribut il faut utiliser la syntaxe : élément.setAttribute("attribut",nouvelle valeur).
Pour changer la valeur d'une propriété de style il faut utiliser la syntaxe : élément.style.propriété = nouvelle valeur.
La variable v_rayon (variation du rayon) est tantôt égale à 2 et tantôt égale à -2.
Donc l'instruction rayon += v_rayon incrémente ou décrémente la variable rayon.
La valeur de rayon est au maximum de X/4 et au minimum de 10.
La variable v_opacite (variation de l'opacité) est tantôt égale à 0.01 et tantôt égale à -0.01.
Donc l'instruction opacite += v_opacite incrémente ou décrémente la variable opacite.
On désigne par "sprites" les personnages d'une animation. Il s'agit souvent de GIF animés.
Ici on se contente d'intégrer deux gif animés avec la balise image du format SVG puis on les déplace via le script.
Ce code SVG constitue une bonne révision des éléments G,use & image.
var chien = document.querySelector('#chien');
var chat = document.querySelector('#chat');
var X = 900; // X récupère la largeur du viewBox
var x_chien = 10 ;
var x_chat = 110;
setInterval(animate,50) ;
function animate()
{
x_chien = x_chien + 2 ;
if(x_chien >= X) x_chien = -90 ; x_chat = x_chien + 100 ;
chien.setAttribute('x', x_chien);
chat.setAttribute('x', x_chat);
}
Le code JS est très simple. Dans le cadre d'une fonction animate (qui est exécutée 20 fois par seconde) on se contente de changer la valeur de l'attribut x des objets SVG chien et chat donc on génère un déplacement des sprites sur l'axe des X.
Il s'agit d'une préparation aux jeux vidéos en SVG.
Déplacez la boule avec les touches directionnelles du clavier.
var billard = document.querySelector('#billard');
var boule = document.querySelector('#boule');
// programmation des touches de direction
document.onkeydown = function(event)
{
if (event.keyCode == 37) gauche();
if (event.keyCode == 39) droite() ;
if (event.keyCode == 38) haut();
if (event.keyCode == 40) bas() ;
}
// quatre fonctions de déplacement
function gauche()
{var x = boule.getAttribute('cx');
console.log(typeof x);
x= parseInt(x) ;
x-=20;
boule.setAttribute('cx',x); }
function droite()
...
function haut()
{var y = boule.getAttribute('cy');
console.log(typeof y);
x= parseInt(y) ;
y-=20;
boule.setAttribute('cy',y); }
function bas()
...
La méthode getAttribute() retourne un "string" comme l'indique la console JS. Donc pensez à convertir avant d'incrémenter !
Si vous avez des difficultés à comprendre la programmation du clavier en JS :
Gestion des évènements par JS
Le billard est bien "tristouné" : aucun effet 3D ; la boule peut sortir du billard.
Toutes ces insuffisances sont résolues dans une nouvelle version en lien ci-dessous.
Le billard est désormais borduré et ombré.
La boule est aussi ombrée
La boule ne peut plus sortir du billard.
À vous de reconstituer le code à partir de la version initiale et de vos connaissances.
J'ai rajouté une feuille de style interne (avec la définition d'un flou) et j'ai modifié le script ; c'est tout !
L'insertion de nouveaux éléments HTML dans une page via JavaScript est facile.
L'insertion de nouveaux objets SVG dans un canevas est un peu plus délicate ...
Ce document comprend du SVG interne.