Depuis la mise à jour de jQuery en version 1.5 (peut-être 1.5.1?), faire un .animate() avec background-position ne fonctionne plus.
Aujourd’hui nous allons voir comment remédier simplement à ce nouveau « bug » grâce à un tout petit plugin.
C’était mieux avant
Avant cette mise à jour, lorsque l’on voulait animer la position d’une image de fond (comme je l’ai fait pour animer mes boutons bleus « sociaux » en bas d’article sur l’ancien design, maintenant c’est en css3), nous faisions par exemple :
1
$("#btn").animate({"background-position" : "0 -30px"});
Maintenant, l’animation ne fonctionne tout simplement plus.
Le pourquoi avant le comment
Vous avez peut-être remarqué que j’ai utilisé les guillemets pour employer le mot « bug », pourquoi? Parce que ce n’est pas un bug, c’est le fonctionnement normal de .animate()
.
En effet, si l’on regarde la définition de .animate() sur le site de jQuery :
All animated properties should be animated to a single numeric value, except as noted below; most properties that are non-numeric cannot be animated using basic jQuery functionality.
On y apprend que .animate()
est censé animer une valeur numérique, et pas une chaine de caractères « 0 -30px ». Donc en gros, si bug il y a, c’était AVANT cette mise à jour :)
Le comment
Pour solutionner ce problème, il va falloir passer par le plugin cssHooks de Brandon Aaron.
Une fois l’archive téléchargée et décompressée, cherchez le fichier bgpos.min.js (qui pèse seulement 1153 octets) et incluez le dans votre page à la suite de jQuery (ou copiez/collez son contenu directement dans votre fichier javascript) :
12
<script type='text/javascript' src='http://www.mon-site.fr/wp-content/themes/mon-theme/js/jquery-1.5.1.min.js?ver=1.5.1'></script>
<script type='text/javascript' src='http://www.mon-site.fr/wp-content/themes/mon-theme/js/bgpos.min.js?ver=2011.03.03'></script>
Il ne reste plus qu’à modifier la propriété de .animate()
:
12345
$("#btn").animate({backgroundPositionX:0}); // Pour animer la position en horizontal
// ou
$("#btn").animate({backgroundPositionY:-30}); // Pour animer la position en vertical
// ou
$("#btn").animate({backgroundPositionX:0,backgroundPositionY:-30}); // Pour animer les 2 en même temps
A voir le contenu de l’archive du plugin, il y a plein d’autres fichiers javascript. Dans mon empressement, je n’ai pas testé le reste, mais je suis sûr qu’il y a plein de bonnes choses à faire avec :)
Commentaires
Commentaire de HappyLDE.
Merci pour cet article,
Je suis passé à jQuery 1.6.1 et avant j’utilisais tout simplement animate({‘background-position’:’0px -30px’},200) pour avoir mon bonheur… Je suis déçu d’apprendre que ce n’est plus possible par défaut.
Je vais essayer cssHooks, encore merci
Commentaire de HappyLDE.
Fonctionne parfaitement sauf sur IE. Une solution ?
Commentaire de HappyLDE.
Voila la solution :)
http://www.protofunc.com/scripts/jquery/backgroundPosition/
Testé sur :
Firefox
IE
Chrome
Opera
Safari
Commentaire de Greg.
Bien vu, je n’avais pas le temps de chercher là.
Merci pour le lien, il faudra que je mette l’article à jour.
PS : j’ai failli répondre (avec humour bien sûr ;) ), mais n’ayant pas de vraie solution immédiate je me suis abstenu ^^ https://twitter.com/#!/ScreenFeedFr/status/121600623979401216
Commentaire de HappyLDE.
Ce aurait été une excellente réponse.
Pour ma part je n’utilise IE que pour des fins de tests.. et j’ai passé ici avec. 8)
Encore du monde l’utilise hélas, il faut l’inclure dans les tests !
J’en profite pour dire que la syntaxe du plugin que j’ai mis dans le lien est la même qu’il y avait avant dans jQuery par défaut.
Commentaire de Greg.
Oui je me doute bien que tu ne l’utilises pas comme navigateur principal :)
Là je me prends justement la tête avec IE7 sur le site d’un client -_- (oui, parce que bien sûr, il n’utilise QUE IE7 et que ça ne marche pas chez lui, mais chez moi oui avec mon IE7 #JeDeviensFouJeDeviensFouJeDeviensFou).
Bref, j’ai perdu ma journée et ça devient lourdingue >_<
Commentaire de HappyLDE.
Effectivement c’est un cauchemar ce IE >_<' Bon courage à toi
Commentaire de Meeshoot.
merci !!!
Commentaire de jek.
Merci pour l’explication , mais j’ai une question à vous poser : Comment incluer le fichier bgpos.min.js dans ma page ?? Aidez moi svp !!