l'animation addClass/removeClass avec jQuery
Je suis à l'aide de jQuery et jQuery ui et que vous souhaitez animer différents attributs de divers objets.
Par souci d'expliquer le problème ici, j'ai simplifié à l'un div qui passe du bleu au rouge lorsque l'utilisateur passe la souris dessus.
Je suis en mesure d'obtenir le comportement que je veux lors de l'utilisation de animate()
, cependant en faisant de la sorte les styles, je suis l'animation doivent être dans le code d'animation et sont donc séparées de ma feuille de style. (voir exemple 1)
Une alternative est d'utiliser addClass()
et removeClass()
mais je n'ai pas été en mesure de recréer le comportement exact que je peux avoir avec animate()
. (voir exemple 2)
Exemple 1
Prenons un coup d'oeil au code que j'ai avec animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
il affiche tous les comportements, je suis à la recherche d':
- Anime en douceur entre le rouge et le bleu.
- Pas de l'animation "overqueue-ing' lorsque l'utilisateur déplace la souris rapidement et de sortir de la div.
- Si l'utilisateur déplace sa souris out/in, tandis que l'animation est toujours en cours de lecture, il facilite correctement entre le courant "à mi-chemin de l'état et de la nouvelle" but " de l'état.
Mais depuis les changements de style sont définis dans animate()
j'ai du modifier le style des valeurs, et ne pouvez pas simplement pointer vers ma feuille de style. Cette "fragmentation" de où les styles sont définis est quelque chose qui vraiment me dérange.
Exemple 2
Ici est ma meilleure tentative à l'aide de addClass()
et removeClass
(à noter que pour l'animation de travailler vous avez besoin de 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});
});
Ce qui témoigne à la fois de la propriété 1. et 2. de mon origine, mais 3 ne fonctionne pas.
Je comprends la raison de ceci:
Lors de l'animation addClass()
et removeClass()
jQuery ajoute une temporaire de style à l'élément, puis incrémente les valeurs appropriées jusqu'à ce qu'ils atteignent les valeurs de la condition de la classe, et alors seulement, il n'en fait ajouter/supprimer la classe.
À cause de cela, je dois supprimer l'attribut style, sinon, si l'animation est arrêtée à mi-chemin de l'attribut style serait de rester et de manière permanente remplacer toutes les valeurs de classe, puisque les attributs de style dans une balise ont plus d'importance que la classe les styles.
Toutefois, lorsque l'animation est à mi-chemin fait qu'il n'a pas encore ajouté de la nouvelle classe, et donc, avec cette solution, la couleur passe à la couleur précédente lorsque l'utilisateur déplace sa souris avant de l'animation est terminée.
Ce que je veux, idéalement, est d'être capable de faire quelque chose comme ceci:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Où getClassContent
serait-il suffit de retourner le contenu de la condition de la classe. Le point clé est que de cette façon je n'ai pas à garder mon style de définitions de tous sur la place, mais peut tenir dans les classes, dans ma feuille de style.
- Quelles sont les versions de IE faire, vous avez besoin de soutien? Souhaitez-vous être heureux avec IE9? Ou avez-vous besoin de soutien plus bas?
- Je ne suis pas soucier c'est à dire à tous pour être honnête. Tout cela a été testé avec les navigateurs webkit seulement (safari/chrome).
- comment
getClassContent
ressemble?
Vous devez vous connecter pour publier un commentaire.
Puisque vous n'êtes pas inquiet au sujet de IE, pourquoi ne pas simplement utiliser les transitions css pour fournir de l'animation et de jQuery pour modifier les classes. Live exemple: http://jsfiddle.net/tw16/JfK6N/
- IE 10+ - Chrome 26+ - FireFox 16+ - Safari 6.1+ - Opera 12.1+
-webkit, -moz, -o n'est nécessaire, même pour les anciens navigateurs. Vous pouvez probablement laisser à économiser de l'espace.Une autre solution (mais il nécessite jQueryUI comme l'a souligné Richard Neil Ilagan dans les commentaires) :-
addClass, removeClass et toggleClass accepte également un second argument; la durée de temps à passer d'un état à l'autre.
Voir jsfiddle:- http://jsfiddle.net/6hvZT/1/
xxxClass()
fonctions.xxxClass
animation de l'interpolation de cette façon?Vous pouvez utiliser jquery ui
switchClass
, Heres un exemple:Ou voir ce jsfiddle.
Vous avez juste besoin de la jQuery UI effets-core (13KB), afin de permettre à la durée de l'ajout (tout comme Omar Tariq il a souligné
J'ai été à la recherche dans ce mais je voulais avoir une différence de taux de transition pour dans et hors.
C'est ce que j'ai fait:
Cela se transforme instantanément la couleur d'arrière-plan #5eb4fc puis disparaît lentement de retour à la normale de plus de 2 secondes.
Voici un violon
Bien que, la question est assez vieux, je suis en ajoutant info n'est pas présent dans les autres réponses.
L'OP est à l'aide de stop() pour arrêter l'animation en cours dès que l'événement est terminé. Cependant, l'utilisation de la bonne combinaison de paramètres avec la fonction devrait aider. par exemple. stop(true,true) ou stop(true,false), car cela affecte la le d'attente des animations bien.
Le lien suivant illustre une démo qui montre les différents paramètres d'arrêt() et comment elles diffèrent de finition().
http://api.jquery.com/finish/
Bien que l'OP avait pas de problèmes à l'aide de JqueryUI, c'est pour les autres utilisateurs qui peuvent venir à travers des scénarios similaires, mais ne peut pas utiliser JqueryUI/besoin de soutien IE7 et 8 trop.