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 getClassContent
restituirebbe 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
?