2010-11-09 7 views
8

Hi là J'ai fait cette animation en utilisant le framework Raphael. Je veux que l'étoile (logoStar) tourne indéfiniment mais elle ne tourne qu'une seule fois. Quelqu'un peut-il aider? MerciPourquoi ma boucle d'animation Raphael JS ne va pas?

window.onload = function() { 
buildLogo(); 
} 

var buildLogo = function() { 
    var logo = Raphael("title",800,236); 

    var logoStar = logo.path("M12.245 131.057L16.039 138.743L24.521 139.974L18.383 145.958L19.832 154.406L12.245 150.418L4.658 154.406L6.108 145.958L-0.03 139.974L8.452 138.743").attr({fill:"#fff",stroke:"none"}); 

    var starSpin = function() { 
     logoStar.animate({rotation: "360"}, 5000, starSpin); 
    } 
    starSpin(); 
} 

Répondre

18
var starSpin = function() { 
    logoStar.attr({rotation: 0}).animate({rotation: 360}, 5000, starSpin); 
} 

animation de 360 ​​° à 360 ° ressemble il n'y a pas d'animation, donc vous devez réinitialiser la rotation à zéro avant.

+1

+1 ... et * c'est * la bonne réponse! Merci Dmitry! –

+3

Oui! Tu es une légende Dmitry. Merci beaucoup. Une étoile d'or (tournante) pour vous. – mradbourne

+1

Après mille heures à essayer de savoir ce qui ne va pas, j'ai découvert que le sintax est: transformer: "r180" au lieu de rotarion: 180. Le cadre a-t-il changé? Vous voulez modifier le post pour ajouter cette info? – Ismael

-2

Je ne suis pas très sûr, mais si vous faites ceci:

while(true){starSpin();} 

Il semble que la méthode est exécutée une seule fois, il « tourne » une fois ...

+0

L'idée est que l'animation accepte un rappel pour quand elle se termine. Le type de boucles while infinies comme celui de votre réponse n'est pas très courant dans le développement côté client, car elles peuvent entraîner le blocage du thread de l'interface utilisateur. – jbeard4

0

Je ne suis pas tout à fait sûr, mais je pense que starSpin n'est pas encore défini lorsque vous essayez de l'utiliser dans la fonction anonyme.

Essayez de changer:

var starSpin = function() { 
    logoStar.animate({rotation: "360"}, 5000, starSpin); 
} 
starSpin(); 

à

function starSpin() { 
    logoStar.animate({rotation: "360"}, 5000, starSpin); 
} 
starSpin(); 

EDIT
Il se trouve que ce n'est pas du tout - je ne sais pas quel est le problème est (je l'espère Quelqu'un qui a plus d'exposition à la bibliothèque de Raphael peut aider là-bas) mais une solution kludgey-mais-travaille est d'effacer l'élément en question avant l'appel toute la fonction de construction dans le rappel (je vous avais prévenu que c'était kludgey).

VOIR:http://jsfiddle.net/rbf5x/1/

+0

Ce n'est pas ça. La fonction est définie. Vos constructions sont absolument égales du point de vue du langage JavaScrupt –

+1

@ avok00 - complètement correct - Je ne pensais pas que c'était le problème, mais je n'étais pas sûr ... merci pour les heads-up! –

+1

avok00, ce n'est pas un problème, bien sûr, mais ces deux constructions ne sont pas "absolument égales". :) –

0

Je suis d'accord avec Michael Mao, vous devez mettre

logoStar.animate({rotation: "360"}, 5000, starSpin); 

dans une boucle.

Mais les boucles comme ceci (vrai) ne sont pas toujours une bonne idée. Il faudra trop de CPU et certains navigateurs peuvent avertir l'utilisateur qu'un script provoque l'exécution lente de la page. Peut-être qu'il est préférable d'ajouter un délai avant de ré-exécuter animer. Juste essayer de voir ce qui fonctionne le mieux;)

3

Juste une observation rapide:

On dirait que « Rotation » ne fait pas partie du Atrr plus depuis ver 2, vous ne pouvez pas l'utiliser dans « Animer », mais vous pouvez le remplacer par « transformer : "r" + (un certain degré) » ..

par exemple:

element.animate({transform: "r" + (-90)}, 2000, 'bounce'); 
6

Depuis la version 2 est sorti, la vraie façon d'avoir une animation en boucle infinie est ceci:

var spin = Raphael.animation({transform: "r360"}, 2500).repeat(Infinity); 
myElement.animate(spin); 

Infinity est un property in Javascript, donc ne l'entrez pas comme une chaîne.

Voici un fonctionnement fiddle.

Questions connexes