`

jquery的animate无法支持transform属性的解决方案

阅读更多

【前言】

    今天有个同事问了道问题,jquery的动画想实现转换类效果,发现无效。。。

 

【主体】

   首先w3c中展示的animate的支持属性:


    所以这是jquery本身代码库的问题,animated方法中没有封装transform属性 

 

解决方案:

(1)css方法

$($sub).animate({},5000,function(){
    $(this).css({'transform':'translateX(300px)'});
})

    在动画函数的回调函数里执行。时间和效果就没了意义,毕竟函数是在动画完成之后才有调用

(2)addClass方法

可以通过addClass()方法来代替此动作: 
比如想旋转一个icon 
在css中加入一个class

.add_transform{
    transform:rotate(180deg);
    -ms-transform:rotate(180deg);/* IE9 */
    -moz-transform:rotate(180deg);/* Firefox */
    -webkit-transform:rotate(180deg);/* Safari和Chrome */
    -o-transform:rotate(180deg);/* Opera */
    transition:all 0.5s ease-in-out;
    -moz-transition:all 0.5s ease-in-out;/*Firefox 4 */
    -webkit-transition:all 0.5s ease-in-out;/* Safari和Chrome */
    -o-transition:all 0.5s ease-in-out;/* Opera */
}

 然后通过$(“选择器”).toggleClass(“.add_transform”);来使icon的旋转变为动画效果。

(3)下载补丁(加一个js文件):

    注意:该方法只支持rotate的2D旋转,无法实现rotateX、rotateY、rotateZ的3D旋转。

https://github.com/zachstronaut/jquery-animate-css-rotate-scale/

用法:

Animate rotate and scale CSS transforms independently using jQuery's
   animate() method.
Animate使用jQuery独立旋转和缩放CSS变换
   Examples:
   $('#example').animate({rotate: '30deg', scale: '1.25'}, 1000);
   $('#example').animate({rotate: '+=30deg', scale: '-=0.1'}, 1000);

    注意:位置放到jquery下面引入

补丁:

/*!
/**
 * Monkey patch jQuery 1.3.1+ to add support for setting or animating CSS
 * scale and rotation independently.
 * https://github.com/zachstronaut/jquery-animate-css-rotate-scale
 * Released under dual MIT/GPL license just like jQuery.
 * 2009-2012 Zachary Johnson www.zachstronaut.com
 */
(function ($) {
    // Updated 2010.11.06
    // Updated 2012.10.13 - Firefox 16 transform style returns a matrix rather than a string of transform functions.  This broke the features of this jQuery patch in Firefox 16.  It should be possible to parse the matrix for both scale and rotate (especially when scale is the same for both the X and Y axis), however the matrix does have disadvantages such as using its own units and also 45deg being indistinguishable from 45+360deg.  To get around these issues, this patch tracks internally the scale, rotation, and rotation units for any elements that are .scale()'ed, .rotate()'ed, or animated.  The major consequences of this are that 1. the scaled/rotated element will blow away any other transform rules applied to the same element (such as skew or translate), and 2. the scaled/rotated element is unaware of any preset scale or rotation initally set by page CSS rules.  You will have to explicitly set the starting scale/rotation value.
    
    function initData($el) {
        var _ARS_data = $el.data('_ARS_data');
        if (!_ARS_data) {
            _ARS_data = {
                rotateUnits: 'deg',
                scale: 1,
                rotate: 0
            };
            
            $el.data('_ARS_data', _ARS_data);
        }
        
        return _ARS_data;
    }
    
    function setTransform($el, data) {
        $el.css('transform', 'rotate(' + data.rotate + data.rotateUnits + ') scale(' + data.scale + ',' + data.scale + ')');
    }
    
    $.fn.rotate = function (val) {
        var $self = $(this), m, data = initData($self);
                        
        if (typeof val == 'undefined') {
            return data.rotate + data.rotateUnits;
        }
        
        m = val.toString().match(/^(-?\d+(\.\d+)?)(.+)?$/);
        if (m) {
            if (m[3]) {
                data.rotateUnits = m[3];
            }
            
            data.rotate = m[1];
            
            setTransform($self, data);
        }
        
        return this;
    };
    
    // Note that scale is unitless.
    $.fn.scale = function (val) {
        var $self = $(this), data = initData($self);
        
        if (typeof val == 'undefined') {
            return data.scale;
        }
        
        data.scale = val;
        
        setTransform($self, data);
        
        return this;
    };

    // fx.cur() must be monkey patched because otherwise it would always
    // return 0 for current rotate and scale values
    var curProxied = $.fx.prototype.cur;
    $.fx.prototype.cur = function () {
        if (this.prop == 'rotate') {
            return parseFloat($(this.elem).rotate());
            
        } else if (this.prop == 'scale') {
            return parseFloat($(this.elem).scale());
        }
        
        return curProxied.apply(this, arguments);
    };
    
    $.fx.step.rotate = function (fx) {
        var data = initData($(fx.elem));
        $(fx.elem).rotate(fx.now + data.rotateUnits);
    };
    
    $.fx.step.scale = function (fx) {
        $(fx.elem).scale(fx.now);
    };
    
    /*
    
    Starting on line 3905 of jquery-1.3.2.js we have this code:
    
    // We need to compute starting value
    if ( unit != "px" ) {
        self.style[ name ] = (end || 1) + unit;
        start = ((end || 1) / e.cur(true)) * start;
        self.style[ name ] = start + unit;
    }
    
    This creates a problem where we cannot give units to our custom animation
    because if we do then this code will execute and because self.style[name]
    does not exist where name is our custom animation's name then e.cur(true)
    will likely return zero and create a divide by zero bug which will set
    start to NaN.
    
    The following monkey patch for animate() gets around this by storing the
    units used in the rotation definition and then stripping the units off.
    
    */
    
    var animateProxied = $.fn.animate;
    $.fn.animate = function (prop) {
        if (typeof prop['rotate'] != 'undefined') {
            var $self, data, m = prop['rotate'].toString().match(/^(([+-]=)?(-?\d+(\.\d+)?))(.+)?$/);
            if (m && m[5]) {
                $self = $(this);
                data = initData($self);
                data.rotateUnits = m[5];
            }
            
            prop['rotate'] = m[1];
        }
        
        return animateProxied.apply(this, arguments);
    };
})(jQuery);

 

 

 

 

 

 

 

 

 

 

 

.

.

  • 大小: 47.7 KB
分享到:
评论

相关推荐

    jquery animate图片模向滑动示例

    在本示例中,已通过了这些浏览器的测试,意味着该解决方案具有良好的跨浏览器兼容性。 `imgs.html` 文件很可能是包含上述 HTML 结构和 JavaScript 代码的示例页面,而 `imgs` 文件可能包含了用于演示的图片资源。...

    jQuery animate或css3制作查看原图按钮收缩隐藏-20130718

    CSS3的动画则提供了更现代且性能优秀的解决方案,它允许开发者定义关键帧(keyframes)并在元素上应用动画。对于按钮收缩隐藏的效果,可以创建一个名为`hideButton`的动画: ```css @keyframes hideButton { 0% { ...

    jquery实现3D图片相册展示.rar

    3. 插件使用:如果觉得手动编写代码过于复杂,可以考虑使用现成的jQuery 3D相册插件,如“jQuery旋转3D相册插件”等,它们通常已经封装好了一套完整的解决方案。 总结,通过jQuery实现3D图片相册展示,主要涉及到...

    jQuery左右滚动支持图片放大缩略图图片轮播代码(附demo,可直接用)

    本项目"jQuery左右滚动支持图片放大缩略图图片轮播代码"提供了一种高效的解决方案,包含了一个可直接使用的demo,下面我们将详细探讨这个轮播代码的关键知识点。 首先,jQuery的`.animate()`方法是实现左右滚动的...

    jQuery跨浏览器控制图标旋转代码.zip

    总之,“jQuery跨浏览器控制图标旋转代码.zip”提供的解决方案是利用jQuery结合CSS3的`transform`和`transition`属性,实现图标在不同浏览器间的旋转动画效果。开发者需要注意针对各种浏览器添加相应的前缀,以确保...

    8种jQuery图片鼠标悬停效果.

    总的来说,这个资源包提供了一套完整的解决方案,帮助开发者快速创建具有吸引力的图片悬停效果,提升了网页的互动性和用户体验。通过深入理解jQuery的事件处理和动画机制,开发者可以灵活运用这些效果,为自己的项目...

    jquery图片横向滚动

    综上所述,这个"jquery图片横向滚动"插件是基于jQuery的图片展示解决方案,它具有横向滚动效果,并且提供左右按钮供用户手动切换。通过优化代码和添加详细注释,提高了用户体验和可维护性。对于前端开发者来说,学习...

    jQuery实现的产品自动360度旋转展示特效源码.zip

    通过结合CSS3的transform属性和jQuery的animate方法,可以实现平滑的3D旋转效果。 在"132677977184834783"这个文件中,很可能包含了实现此特效的HTML结构、CSS样式以及JavaScript代码。HTML部分通常包括一个容器...

    jQuery空中树叶掉落动画效果代码(不兼容IE678)

    《jQuery空中树叶掉落动画效果实现详解》 在网页设计中,动态效果往往能为用户带来更生动、有趣的体验。...不过,对于不支持CSS3特性的老版本浏览器,开发者需权衡性能与兼容性的关系,寻找合适的解决方案。

    jQuery把图片放大及变亮特效插件下载.rar

    总的来说,这个"jQuery把图片放大及变亮特效插件下载"提供的是一种增强网页视觉体验的解决方案,通过jQuery的灵活性和强大的动画支持,我们可以轻松地为网站的图片添加吸引人的交互效果。在实际使用时,应结合项目的...

    jquery动画制作示例图片滚动和飞行乌鸦,车窗效果,非常强大

    开发者可以结合CSS3的transform属性和jQuery的动画方法,使乌鸦在屏幕上飞过,增加页面的动态感和趣味性。 再来说说“车窗效果”。这可能是创建一个类似车窗开关的交互效果,比如点击按钮时,车窗图像会打开或关闭...

    jquery多图3D切换焦点图代码免费下载

    总的来说,这个“jQuery多图3D切换焦点图”是一个利用jQuery和CSS3技术实现的动态图片展示解决方案,它可以为你的网站增添一份现代感和互动性。通过学习和应用这个代码,你可以提升自己的前端开发技能,同时也能为...

    jquery弹性竖向导航菜单特效插件

    "jQuery弹性竖向导航菜单特效插件"是一个专为提升用户体验而设计的专业工具,旨在为网站提供美观且功能强大的导航解决方案。这个插件利用了jQuery库的强大功能,实现了动态效果,使得菜单在响应用户交互时具有良好的...

    jQuery广告图片各大商城首页流行通栏广告图片-20130702

    标题“jQuery广告图片各大商城首页流行通栏广告图片-20130702”表明这个资源是一个关于使用jQuery实现的2013年7月2日时各大电子商务平台首页上流行的通栏广告图片解决方案。jQuery是一款广泛使用的JavaScript库,它...

    jquery+css3 3D旋转效果

    虽然大部分现代浏览器都支持CSS3的3D变换,但老版本的IE浏览器可能需要借助于如Modernizr这样的库来提供兼容性解决方案。同时,为了确保在不支持3D变换的浏览器中也有良好的回退体验,我们可以使用渐进增强或者优雅...

    jQuery相册图片掀开切换代码.zip

    3. 使用jQuery的animate()或css()方法,随着时间的推移逐步改变transform属性,创建平滑的动画效果。 4. 当动画完成后,确保下一张图片处于正确的位置,以便用户可以继续翻阅。 【说明.htm】可能是这个代码示例的...

    jQuery圆形转动切换文字公告代码.zip

    可以引入Modernizr库来检测CSS3属性的支持情况,或者使用jQuery的polyfill来提供兼容性解决方案。此外,为了提高性能,可以使用`.stop()`方法来防止动画堆积,确保动画流畅。 6. **实际应用**:这种圆形转动切换...

    jQuery实现的产品图片滚动及局部放大展示.zip

    总的来说,这个项目利用jQuery的强大力量,结合前端技术,为产品展示提供了一种互动性和视觉效果俱佳的解决方案。对于学习者或者开发者来说,研究这个示例不仅可以提升jQuery的使用技巧,还能了解到如何结合CSS和...

    Jquery图片查看,包含放大、缩小、旋转

    总的来说,这个jQuery图片查看插件结合了jQuery的便利性、CSS3的强大功能和JavaScript的动态特性,为用户提供了一个高效、易用的图片查看解决方案。通过深入理解并实践这些知识点,我们可以构建出更多功能丰富的Web...

    jquery 大转盘抽奖

    为确保在这些浏览器中正常显示,可能需要引入额外的polyfill库(如Modernizr)或者使用其他兼容性解决方案,如渐进增强或优雅降级。 ### 7. 总结 jQuery大转盘抽奖的实现涉及HTML布局、CSS样式设计和JavaScript动画...

Global site tag (gtag.js) - Google Analytics