J'utilise jQuery et jQuery-ui et je veux animer divers attributs sur divers objets.
Pour expliquer le problème ici, je l'ai simplifié à une division qui passe du bleu au rouge lorsque l'utilisateur passe la souris dessus.
J'arrive à obtenir le comportement que je souhaite en utilisant animate()
Cependant, les styles que j'anime doivent se trouver dans le code d'animation et sont donc séparés de ma feuille de style. (voir exemple 1 )
Une alternative consiste à utiliser addClass()
et removeClass()
mais je n'ai pas été en mesure de recréer le comportement exact que je peux obtenir avec animate()
. (voir exemple 2 )
Exemple 1
Jetons 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 que je recherche :
- S'anime en douceur entre le rouge et le bleu.
- Il n'y a pas de "surproduction" d'animation lorsque l'utilisateur déplace rapidement sa souris dans la division et en dehors de celle-ci.
- Si l'utilisateur déplace sa souris vers l'extérieur ou vers l'intérieur alors que l'animation est toujours en cours, le passage entre l'état actuel "à mi-chemin" et le nouvel état "objectif" se fait correctement.
Mais comme les changements de style sont définis dans animate()
Je dois modifier les valeurs de style à cet endroit, et je ne peux pas simplement faire pointer la feuille de style vers moi. Cette "fragmentation" de l'endroit où les styles sont définis est quelque chose qui me dérange vraiment.
Exemple 2
Voici ma meilleure tentative actuelle en utilisant addClass()
et removeClass
(notez que pour que l'animation fonctionne, 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});
});
Cela répond aux propriétés 1 et 2 de mes exigences initiales, mais la propriété 3 ne fonctionne pas.
Je comprends la raison de ce choix :
Lorsque vous animez addClass()
et removeClass()
jQuery ajoute un style temporaire à l'élément, puis incrémente les valeurs appropriées jusqu'à ce qu'elles atteignent les valeurs de la classe fournie, et c'est seulement à ce moment-là qu'il ajoute/supprime réellement la classe.
C'est pourquoi je dois supprimer l'attribut de style, sinon, si l'animation est arrêtée à mi-chemin, l'attribut de style resterait et écraserait de façon permanente les valeurs de la classe, car les attributs de style d'une balise ont plus d'importance que les styles de classe.
Cependant, lorsque l'animation est à moitié terminée, la nouvelle classe n'a pas encore été ajoutée, et donc, avec cette solution, la couleur saute à la couleur précédente lorsque l'utilisateur déplace sa souris avant la fin de l'animation.
Ce que je souhaite idéalement, c'est pouvoir 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
renvoie simplement le contenu de la classe fournie. L'essentiel est que, de cette façon, je n'ai pas besoin de conserver mes définitions de style partout, mais que je peux les conserver dans des classes de ma feuille de style.
1 votes
Quelles versions d'IE devez-vous prendre en charge ? Seriez-vous satisfait d'IE9 ? Ou devez-vous supporter une version inférieure ?
1 votes
Je ne me soucie pas du tout de l'IE pour être honnête. Tout ceci a été testé avec les navigateurs webkit uniquement (safari/chrome).
0 votes
Comment
getClassContent
ressemble à quoi ?