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

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

Susan Sarandon
发布: 2024-12-04 07:57:15
原创
381 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板