Sto usando jQuery e jQuery-ui e voglio animare vari attributi su vari oggetti.
Per motivi di spiegazione del problema qui, l'ho semplificato in un div che cambia da blu a rosso quando l'utente passa il mouse su di esso.
Sono in grado di ottenere il comportamento che desidero durante l'utilizzo animate(), tuttavia quando lo faccio gli stili che sto animando devono essere nel codice di animazione e quindi sono separati dal mio foglio di stile. (vedi esempio 1 )
Un'alternativa sta usando addClass()e removeClass()ma non sono stato in grado di ricreare il comportamento esatto che posso ottenere animate(). (vedi esempio 2 )
Esempio 1
Diamo un'occhiata al codice che ho con animate():
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
mostra tutti i comportamenti che sto cercando:
- Si anima uniformemente tra rosso e blu.
- Nessuna animazione "sovrascrittura" quando l'utente sposta rapidamente il mouse dentro e fuori dal div.
- Se l'utente sposta il mouse verso l'esterno / verso l'interno mentre l'animazione è ancora in esecuzione, si sposta correttamente tra lo stato corrente "a metà strada" e il nuovo stato "obiettivo".
Ma poiché i cambiamenti di stile sono definiti in animate()Devo cambiare lì i valori di stile e non posso semplicemente farli puntare al mio foglio di stile. Questo "frammento" di dove sono definiti gli stili è qualcosa che mi disturba davvero.
Esempio 2
Ecco il mio miglior tentativo attuale usando addClass()e removeClass(nota che per far funzionare l'animazione hai bisogno di jQuery-ui):
//assume classes 'red' and 'blue' are defined
$('#someDiv')
.addClass('blue')
.mouseover(function(){
$(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
})
.mouseout(function(){
$(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
});
Questo mostra sia la proprietà 1. che la 2. dei miei requisiti originali, tuttavia 3 non funziona.
Capisco il motivo di questo:
Durante l'animazione addClass() e removeClass()jQuery aggiungono uno stile temporaneo all'elemento, quindi incrementa i valori appropriati fino a quando non raggiungono i valori della classe fornita e solo allora aggiunge / rimuove effettivamente la classe.
Per questo motivo devo rimuovere l'attributo di stile, altrimenti se l'animazione viene interrotta a metà l'attributo di stile rimarrebbe e sovrascriverebbe in modo permanente qualsiasi valore di classe, poiché gli attributi di stile in un tag hanno un'importanza maggiore rispetto agli stili di classe.
Tuttavia, quando l'animazione è terminata a metà strada non ha ancora aggiunto la nuova classe, e quindi con questa soluzione il colore passa al colore precedente quando l'utente sposta il mouse prima che l'animazione sia completata.
Quello che voglio idealmente è poter fare qualcosa del genere:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Dove getClassContentrestituirebbe semplicemente il contenuto della classe fornita. Il punto chiave è che in questo modo non devo mantenere le mie definizioni di stile ovunque, ma posso tenerle in classe nel mio foglio di stile.
getClassContent?