2015-08-02 25 views
6

Un dubbio riguardante Animazione CSS \ trasformazione. Sto cercando di capire le animazioni CSS e in esecuzione nel seguente problema:Direzione di rotazione in Animazione CSS Trasformazione

Una semplice div con l'animazione collegato ad esso in CSS come di seguito

<div id="learn">LEARN</div> 

    #learn { 
    width : 100px; 
    height : 100px; 
    background : blue; 
    position : relative; 
    animation: test1 5s ease-in 2s infinite; 
    } 

Caso 1:

@keyframes test1 { 
    0% { 
    transform: rotate(179deg); 
    } 
    100% { 
    transform: rotate(357deg); 
    } 
    } 

Caso 2 (la trasformazione dello 0% viene divisa in 90 + 89 gradi anziché 179):

@keyframes test1 { 
0% { 
transform: rotate(90deg) rotate(89deg); 
} 
100% { 
transform: rotate(357deg); 
} 
} 

Perché il primo caso ruota in senso orario e il secondo caso ruota in senso antiorario?

+0

Credo che ruoti nella direzione che prende l'angolo più piccolo tra i valori iniziale e finale di un cerchio (con 357 ovviamente pari a -3 gradi) –

+0

Non sono sicuro di aver capito il tuo punto. L'angolo più piccolo in entrambi i casi è in senso orario. –

+0

Qual è il browser che stai utilizzando e la sua versione? Sono su Chrome v38 (vecchio ma ancora) ed entrambe le versioni ruotano in senso orario. – Harry

risposta

1

Questo potrebbe essere solo un bug con trasformazioni di rotazione, che affronterò dopo un po 'di background.

Sfondo

Prima di tutto, il modo in cui le rotazioni sono supposto al lavoro è in relazione a un cerchio. Se si specifica un numero di gradi, questo posizionerà l'elemento nella posizione dettata da una quantità di rotazione specificata dai gradi. Quando non si anima una rotazione, ci sono molti modi per rappresentare la posizione dell'elemento. Codice Univoco è a metà destra nel loro commento in quanto il posizionamento di 357 gradi e -3 gradi è lo stesso, ma quando si anima, sono molto diversi. Passare da 0 gradi a -3 gradi è una piccola rotazione in senso antiorario, mentre passando da 0 gradi a 357 gradi è una grande rotazione in senso orario.

risultati

Cosa hai trovato sembra ignorare questo calcolo (sia in Firefox e Chrome da quello che ho provato fuori). Da quello che vedo, che unisce rotate trasforma in modo efficace inverte il senso che la rotazione dovrebbe andare in, anche se si sta combinando con una rotazione 0deg:

transform: rotate(90deg); //rotates clockwise 
transform: rotate(0deg) rotate(90deg); //rotates counter-clockwise 

Sembra che si può risolvere questo problema "unendo" la rotazione trasforma in entrambe le fasi di animazione:

// this performs a clockwise rotation 
@keyframes test3 { 
    0% { 
     transform: rotate(0deg) rotate(90deg); 
    }  
    100% { 
     transform: rotate(0deg) rotate(357deg); 
    } 
} 

Infine, sembra che il numero di materie "combinazioni". Se si combinano 2 rotazioni in un unico passaggio, ma 3 in un altro, il comportamento imprevisto si verifica:

// rotates counter-clockwise since there are unequal rotation transforms 
@keyframes test4 { 
    0% { 
     transform: rotate(0deg) rotate(0deg) rotate(90deg); 
    } 
    100% { 
     transform: rotate(0deg) rotate(357deg); 
    } 
} 

Conclusione

Questo probabilmente non è la risposta più grande, ma unendo le rotazioni come questo solo doesn' sembra che sia documentato ovunque. Suggerirei di non combinare le stesse trasformazioni rotate (è comunque possibile combinare rotateX e rotateY senza questa stranezza) e rispettare la somma dei valori dei gradi.

Nel caso in cui qualcuno che trova questa spiegazione voglia forse saperne di più su questo comportamento di quello che ho, ecco uno fiddle con gli esempi sopra come punto di partenza.

+0

In realtà ho osservato questo mentre cercavo di capire un comportamento "fluttuante nell'acqua" ottenuto da più trasformazioni. Il seguente keyframe dà un ottimo feeling "fluttuante", con pochissime linee di css. Non ho idea di come !!! 0% {transform: ruotare (0deg) translateX (0) translateY (1px) ruota (0deg)} 100% {transform: ruotare (360deg) translateX (0) translateY (1px) ruotare (-360deg)} Posso capire il ribasso deriva .... ma non sono sicuro di come si muova il movimento da sinistra a destra. –

+0

In realtà è un trucco abbastanza carino. Le 'transforms' in CSS3 hanno un'interessante meccanica di applicare la' rotazione 'a un diverso punto di rotazione a seconda della traduzione precedente (quindi in pratica l'ordine delle parti di una trasformazione gioca un ruolo importante nell'aspetto dell'animazione finale). Dai un'occhiata a questo [aggiornamento fiddle] (http://jsfiddle.net/r8vx5Lw8/1/) per vedere cosa intendo. Il primo div ruota sul suo centro, il secondo ruota in base al 'translateX', il terzo basato su' translateX' e 'translateY', e l'ultimo è il terzo senza il movimento extra (testato in Chrome) –

+0

Bello da vedere Questo. Ma immagino che la differenza di comportamento tra div2 e div3 sia dovuta al fatto che la rotazione "netta" dello stato al 100% in div2 è 360deg, dandole anche la rotazione sul proprio asse. La rotazione netta del 100% in div3 è 0deg. Quindi nessuna rotazione assiale. Ma poi di nuovo perché il "tutto div" segue il percorso a spirale per raggiungere lo stato finale? –

Problemi correlati