首页 >web前端 >css教程 >为什么 jQuery.animate() 不能用于 CSS3 旋转,我们如何使用 jQuery 实现跨浏览器动画旋转?

为什么 jQuery.animate() 不能用于 CSS3 旋转,我们如何使用 jQuery 实现跨浏览器动画旋转?

Susan Sarandon
Susan Sarandon原创
2024-12-04 07:57:15406浏览

Why doesn't jQuery.animate() work for CSS3 rotations, and how can we achieve cross-browser animated rotations using jQuery?

使用 jQuery.animate() 进行跨浏览器旋转

问题

使用 jQuery.animate() 进行跨浏览器旋转具有挑战性,因为CSS-Transforms 的非动画功能。下面的代码演示了这个问题:

$(document).ready(function () { 
    DoRotate(30);
    AnimateRotate(30);
});

function DoRotate(d) {

    $("#MyDiv1").css({
          '-moz-transform':'rotate('+d+'deg)',
          '-webkit-transform':'rotate('+d+'deg)',
          '-o-transform':'rotate('+d+'deg)',
          '-ms-transform':'rotate('+d+'deg)',
          'transform': 'rotate('+d+'deg)'
     });  
}

function AnimateRotate(d) {

        $("#MyDiv2").animate({
          '-moz-transform':'rotate('+d+'deg)',
          '-webkit-transform':'rotate('+d+'deg)',
          '-o-transform':'rotate('+d+'deg)',
          '-ms-transform':'rotate('+d+'deg)',
          'transform':'rotate('+d+'deg)'
     }, 1000); 
}

旋转在使用 .css() 时有效,但在使用 .animate() 时无效。为什么?我们如何克服这个障碍?

解决方案

虽然 CSS-Transforms 在 jQuery 中缺乏直接动画支持,但可以使用如下的步骤回调来解决问题:

function AnimateRotate(angle) {
    // Cache the object for performance
    var $elem = $('#MyDiv2');

    // Use a pseudo object for the animation (starts from `0` to `angle`)
    $({deg: 0}).animate({deg: angle}, {
        duration: 2000,
        step: function(now) {
            // Use the `now` parameter (current animation position) in the step-callback
            $elem.css({
                transform: 'rotate(' + now + 'deg)'
            });
        }
    });
}

此方法允许使用 jQuery 旋转元素。此外,jQuery 1.7 不再需要 CSS3 转换前缀。

jQuery 插件

要简化流程,请创建一个如下所示的 jQuery 插件:

$.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);

优化插件

为了更好的效率和灵活性,可以使用优化的插件创建:

$.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);
  });
};

用法

插件提供了两种使用方式:

  1. 单行语法:
$(node).animateRotate(90);
$(node).animateRotate(90, function () {});
$(node).animateRotate(90, 1337, 'linear', function () {});
  1. 对象语法(三个以上首选参数):
$(node).animateRotate(90, {
  duration: 1337,
  easing: 'linear',
  complete: function () {},
  step: function () {}
});

结论

该插件使用 jQuery 的动画功能实现跨浏览器 CSS 旋转。它消除了手动旋转计算的需要,并提供了一种方便且优化的方式来实现旋转效果。

以上是为什么 jQuery.animate() 不能用于 CSS3 旋转,我们如何使用 jQuery 实现跨浏览器动画旋转?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn