2010-11-09 9 views
8

Ciao lì Ho realizzato questa animazione utilizzando il framework Raphael. Voglio che la stella (logoStar) giri indefinitamente, ma viene eseguita una sola volta. Qualcuno può aiutare? GraziePerché il loop dell'animazione di Raphael JS non funziona?

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(); 
} 

risposta

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

Animazione da 360 ° a 360 ° sembra che non ci nessuna animazione, quindi è necessario ripristinare la rotazione a zero prima.

+1

+1 ... e * questa è * la risposta giusta! Grazie Dmitry! –

+3

Sì! Sei una leggenda, Dmitry. Grazie mille. Una stella d'oro (spinning) per te. – mradbourne

+1

Dopo mille ore di tentativi per sapere che cosa non va, ho scoperto che la sintassi è: trasformare: "r180" invece rotarion: 180. Il quadro è cambiato? Ti interessa modificare il post per aggiungere queste informazioni? – Ismael

-2

Io non sono molto sicuro, ma cosa succede se si esegue questa operazione:

while(true){starSpin();} 

Sembra che il metodo viene eseguito solo una volta, in modo che "gira" una volta ...

+0

L'idea è che l'animazione accetta una richiamata per quando termina. Il tipo di cicli infiniti mentre quelli nella risposta non sono molto comuni nello sviluppo lato client, poiché possono causare il blocco del thread dell'interfaccia utente. – jbeard4

0

Non ne sono completamente sicuro, ma il non è ancora definito quando si tenta di utilizzarlo nella funzione anonima.

provare a cambiare:

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

a

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

EDIT
Si scopre che questo non è affatto - non so quale sia il problema è (si spera qualcuno che ha più esposizione alla biblioteca di Raffaello può aiutare là fuori), ma una soluzione kludgey-but-works è di cancellare l'elemento in questione prima di chiamare ing l'intera funzione costrutto nel callback (ti avevo avvertito che era kludgey).

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

+0

Non è quello. La funzione è definita. I tuoi costrutti sono assolutamente uguali dal punto di vista del linguaggio JavaScrupt –

+1

@ avok00 - completamente corretto - Non pensavo che fosse il problema, ma non ero sicuro ... grazie per l'heads up! –

+1

avok00, questo non è un problema, ovviamente, ma quei due costrutti non sono "assolutamente uguali". :) –

0

Sono d'accordo con Michael Mao, si dovrebbe mettere

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

in un ciclo.

Ma cicli come questo mentre (vero) non sono sempre una buona idea. Ci vorrà troppa CPU e alcuni browser potrebbero avvisare l'utente che uno script sta causando il lento rallentamento della pagina. Forse è meglio aggiungere un timeout prima di rieseguire l'animazione. Basta provare e vedere che cosa funziona meglio;)

3

Solo una breve osservazione:

Looks like "Rotazione" non è parte del Atrr più da ver 2, quindi non è possibile utilizzarlo in "animate", ma è possibile sostituire che con "trasformare : "r" + (in una certa misura)" ..

esempio:

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

dalla versione 2 è uscito, il vero modo per avere un'animazione infinitamente loop è questa:

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

Infinity è un property in Javascript, quindi non inserirlo come stringa.

Ecco un lavoro fiddle.

Problemi correlati