Les transformations CSS ne peuvent pas encore être animées avec jQuery. Vous pouvez faire quelque chose comme ceci :
function AnimateRotate(angle) {
// caching the object for performance reasons
var $elem = $('#MyDiv2');
// we use a pseudo object for the animation
// (starts from `0` to `angle`), you can name it as you want
$({deg: 0}).animate({deg: angle}, {
duration: 2000,
step: function(now) {
// in the step-callback (that is fired each step of the animation),
// you can use the `now` paramter which contains the current
// animation-position (`0` up to `angle`)
$elem.css({
transform: 'rotate(' + now + 'deg)'
});
}
});
}
Vous pouvez en savoir plus sur le rappel par étapes ici : http://api.jquery.com/animate/#step
http://jsfiddle.net/UB2XR/23/
Et, au fait : il n'est pas nécessaire de préfixer les transformées css3 avec jQuery 1.7+.
Mise à jour
Vous pouvez l'intégrer dans un plugin jQuery pour vous faciliter la vie :
$.fn.animateRotate = function(angle, duration, easing, complete) {
return this.each(function() {
var $elem = $(this);
$({deg: 0}).animate({deg: angle}, {
duration: duration,
easing: easing,
step: function(now) {
$elem.css({
transform: 'rotate(' + now + 'deg)'
});
},
complete: complete || $.noop
});
});
};
$('#MyDiv2').animateRotate(90);
http://jsbin.com/ofagog/2/edit
Mise à jour2
Je l'ai optimisé un peu pour rendre l'ordre de easing
, duration
y complete
insignifiante.
$.fn.animateRotate = function(angle, duration, easing, complete) {
var args = $.speed(duration, easing, complete);
var step = args.step;
return this.each(function(i, e) {
args.complete = $.proxy(args.complete, e);
args.step = function(now) {
$.style(e, 'transform', 'rotate(' + now + 'deg)');
if (step) return step.apply(e, arguments);
};
$({deg: 0}).animate({deg: angle}, args);
});
};
Mise à jour 2.1
Merci à matteo qui a noté un problème avec le this
-contexte dans l'ensemble- callback
. Si on l'a réparé en liaison le rappel avec jQuery.proxy
sur chaque nœud.
J'ai déjà ajouté l'édition au code à partir de Mise à jour 2 .
Mise à jour 2.2
C'est une modification possible si vous voulez faire quelque chose comme basculer la rotation en avant et en arrière. J'ai simplement ajouté un paramètre de départ à la fonction et remplacé cette ligne :
$({deg: start}).animate({deg: angle}, args);
Si quelqu'un sait comment rendre cela plus générique pour tous les cas d'utilisation, qu'il s'agisse ou non de définir un degré de départ, veuillez faire la modification appropriée.
L'utilisation ...est très simple !
Principalement, vous avez deux façons d'atteindre le résultat souhaité. Mais pour la première, jetons un coup d'oeil aux arguments :
jQuery.fn.animateRotate(angle, duration, easing, complete)
A l'exception de "angle", elles sont toutes optionnelles et reviennent à la valeur par défaut. jQuery.fn.animate
-propriétés :
duration: 400
easing: "swing"
complete: function () {}
1er
Cette méthode est la plus courte, mais elle n'est pas très claire si l'on passe plus d'arguments.
$(node).animateRotate(90);
$(node).animateRotate(90, function () {});
$(node).animateRotate(90, 1337, 'linear', function () {});
2ème
Je préfère utiliser des objets s'il y a plus de trois arguments, donc cette syntaxe est ma préférée :
$(node).animateRotate(90, {
duration: 1337,
easing: 'linear',
complete: function () {},
step: function () {}
});
0 votes
JQuery n'a aucune idée de la façon d'animer la rotation. Peut-être faut-il utiliser les transitions CSS3 ?
1 votes
@JanDvorak - sauf que IE9 ne supporte pas les transitions CSS3.
1 votes
Je vais donner un vote positif pour la partie "réparer" (vous pourriez finir par mettre en œuvre un système de gestion de l'information).
step
), mais la partie "pourquoi ça" est assez claire.0 votes
@Spudley : oui, je sais : le but pour le support d'IE9 sera d'utiliser setInterval et d'appeler la fonction DoRotate plusieurs fois.
0 votes
BTW - J'ai déjà mentionné la bibliothèque CSS Sandpaper dans ma réponse à votre autre question, qui est un polyfill pour les transitions CSS dans IE. Vous pourriez vouloir l'essayer.
0 votes
@Spudley : J'ai regardé Sandpaper mais je préfère éviter une dépendance, c'est pourquoi je cherche à faire fonctionner ce code.
0 votes
C'est vrai. La raison pour laquelle cela vaut la peine est que ce ne serait une dépendance que pour IE9, et que les autres navigateurs seraient en mesure d'utiliser de véritables transformations CSS (avec tous les avantages de rendu qui vont avec). Si vous écrivez une animation jQuery manuelle, vous punirez les autres navigateurs pour le manque de support d'IE. Et vous aurez de toute façon une dépendance (sur votre propre code jQuery). Si vous êtes sûr de ne pas vouloir l'utiliser, c'est normal, mais c'est un bon outil.