2013-08-01 8 views
12

Ho difficoltà a cercare su Google questo problema perché la maggior parte delle cose che riesco a trovare riguardano animazioni che dovrebbero essere veloci ma che agiscono lentamente. La mia domanda riguarda un'animazione che desidero avere una lunga durata ma che sia comunque fluida.Perché le animazioni jQuery lente sono discontinue?

Ho creato questo jsfiddle per dimostrare il problema: http://jsfiddle.net/93Bqx/

Sto cercando di fare un elemento si muovono lentamente in un'altra posizione nel corso del tempo. Ma l'animazione è molto mossa.

In sostanza, si riduce a qualcosa di simile:

$elem.animate({ 
     left: x, 
     top: y 
}, someLargeNumber); 

Mi chiedo se il problema è che l'animazione è così lenta che ogni passo è meno di un pixel e quindi li sta girando a 0 o 1, facendo apparire i frame e quindi spostarli tutti contemporaneamente. Ma non so come potrei controllarlo o correggerlo.

C'è un modo migliore per eseguire animazioni lente in modo che siano fluide? Ne avevo uno simile creato con CSS3 e translate (x, y) che era scorrevole, ma sfortunatamente ho bisogno di più flessibilità di quello che penso possa ottenere con i CSS.

+2

buona lettura sull'argomento: http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/ – Yoshi

+0

@ Yoshi grazie!Esattamente quello che mi interessava sapere. Puoi postarlo come risposta, quindi posso accettarlo? –

risposta

5

Non è molto più agevole anche utilizzando una transizione CSS.

Ho aggiunto il Transit jQuery plugin per testare invece una transizione CSS e sembra quasi la stessa.

il codice con correzioni minori: http://jsfiddle.net/thirtydot/93Bqx/5/

Stesso codice, ma con transito aggiunto: http://jsfiddle.net/thirtydot/93Bqx/6/.

Penso che questo sia un limite del fatto che i (più?) Browser non eseguono il rendering di subpixel. Come hai detto, gli elementi x e dell'elemento vengono arrotondati dopo ogni fase dell'animazione, ed è proprio questo arrotondamento che causa l'antiestetico effetto "jiggling".

La versione di transizione CSS ha un aspetto notevolmente migliore per i casi di test meno patologici. Leggi questo per ulteriori informazioni: http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/

+5

Non ne avevo mai sentito parlare; Dovrò cercare in questo plugin. Grazie per il suggerimento! Ho guardato i documenti e l'ho modificato dall'animazione delle proprietà superiore e inferiore direttamente all'utilizzo del suo x/y nativo ed è molto più agevole (ma stranamente un po 'traballante) http://jsfiddle.net/XSEd8/ –

+0

Aggiornamento: I farlo funzionare ora nel mio codice reale ed è fantastico. +1 per jquery.transit. L'unico problema a cui mi sono imbattuto era il non essere un modo per fermare le transizioni ma ho trovato [un fork del codebase] (https://github.com/tblasv/jquery.transit) che aggiunge questa funzionalità. –

+0

Buono a sapersi. Penso che, più o meno, più lento è il computer, più un miglioramento migliorerà la versione di transizione CSS. Inoltre, non penso che dovresti accettare la mia risposta (se avevi intenzione di farlo) ancora. Dagli un po 'più di tempo e vedi se arriva una risposta migliore. – thirtydot

7

Immagino sia l'inevitabile affare con l'animazione programmatica. magari provare un quadro specializzata in animazione come:

http://www.greensock.com/gsap-js/

ma adattare l'animazione per i CSS sarebbe meglio.

+3

Sì, ecco un fork che utilizza il GSAP di GreenSock con le trasformazioni anziché in alto/a sinistra: http://jsfiddle.net/2LpgY/1/ È molto più fluido nel webkit, ma Firefox utilizza una tecnica di antialiasing diversa che non sembra adattarsi rendering sub-pixel. Quindi trenta è giusto a proposito di essere una cosa browser in alcuni casi. Direi anche che le animazioni CSS non sarebbero migliori, specialmente se hai bisogno di un controllo stretto - vedi http://www.greensock.com/why-gsap/ – Jack

0

Penso che abbia qualcosa a che fare con quanto spesso si sposta un elemento. Ad esempio, se muovi l'oggetto una volta al secondo, sembrerà mosso. Prova a diminuire la quantità di tempo tra ogni mossa e diminuendo la distanza tra ogni mossa. Vedi http://jsfiddle.net/2K9xP/ per un esempio.

Così abbiamo ...

var duration = Math.round(10 * distance); 

invece di ...

var duration = Math.round(1000 * distance); 
+4

Il punto è che l'oggetto si muove lentamente. Quella scatola ingrandisce come se fosse in estasi. – thirtydot

+1

È più da dimostrare il fatto che può muoversi senza problemi se la quantità che si muove per fotogramma è un valore sufficientemente alto. Spostare un oggetto 1 pixel al secondo sembrerà instabile perché i nostri occhi vedono più dettagli (qualcosa a che fare con framerate credo). –

+0

Anche se abbiamo schermi a risoluzione più elevata che potrebbero soddisfare posizioni più precise, questo renderebbe le animazioni più lente vedere più senza soluzione di continuità, penso. –