动画元素变换旋转


82

如何使用jQuery旋转元素.animate()?我正在使用下面的代码行,该代码行目前可以正确地对不透明度进行动画处理,但这是否支持CSS3转换?

$(element).animate({
   opacity: 0.25,
   MozTransform: 'rotate(-' + -amount + 'deg)',
   transform: 'rotate(' + -amount + 'deg)'
});

1
有一个jQuery插件可以动画CSS转换。适用于Firefox,Chrome,Safari,Opera和Internet Explorer。github.com/puppybits/QTransform
puppybits 2011年

在此处进行了相同主题的搜索,并降低了插件的等级;工作正常,但在我制作的另一个插件中与此指令产生了冲突:$(“#” + self.id).css(“ transform”,“ scale(1)”); 我更改了这一行:elem.style [$。cssProps.transform] = val +'%'; 对此:if(isNaN(val))elem.style [$。cssProps.transform] = val; 否则elem.style [$。cssProps.transform] = val +'%'; 认为它不需要进一步的解释。
sergio0983

Answers:


95

据我所知,基本动画无法为非数字CSS属性设置动画。

我相信您可以使用步进功能和针对用户浏览器的适当的CSS3转换来完成此操作。CSS3转换在覆盖所有浏览器方面有些棘手(例如,您需要使用Matrix过滤器的IE6)。

编辑:这是在Webkit浏览器(Chrome,Safari)中工作的示例:http : //jsfiddle.net/ryleyb/ERRmd/

如果您只想支持IE9,则可以使用transform代替-webkit-transform,或者-moz-transform支持FireFox。

使用的技巧是为我们不关心的CSS属性设置动画text-indent,然后在step函数中使用其值进行旋转:

$('#foo').animate(
..
step: function(now,fx) {
  $(this).css('-webkit-transform','rotate('+now+'deg)'); 
}
...

对于代码维护和速度而言,这都是一个痛苦的解决方案。忘记jQuerytransform荷兰国际集团,检查我的解决方案。
Dyin 2013年

如果您拥有不断变化的价值而不是固定的价值怎么办?
edonbajrami 2014年

78

Ryley的答案很好,但我在元素中输入了文字。为了旋转文本以及其他所有内容,我使用border-spacing属性而不是text-indent。

另外,为了澄清一点,在元素的样式中,设置您的初始值:

#foo {
    border-spacing: 0px;
}

然后在动画块中,您的最终值:

$('#foo').animate({  borderSpacing: -90 }, {
    step: function(now,fx) {
      $(this).css('transform','rotate('+now+'deg)');  
    },
    duration:'slow'
},'linear');

就我而言,它会逆时针旋转90度。

这是现场演示


3
如果您未在其他任何地方使用z-index,那么它也是一个不错的选择。但您不想对那一句话持否定态度。
Sherzod

4
您可能还希望添加-ms-和-o-扩展名(请参阅css3please.com
Joram van den Boezem 2012年

如何同时设置其他属性的动画?
MadTurki 2013年

@MadTurki,我在下面写下了您的问题的答案!
skagedal

5
jQuery实际上足够聪明,可以为您添加所有-moz-,-webkit-等前缀,因此您可以稍微简化一下此代码。很好的答案。+1
章鱼

48

在我看来,animate与CSS3相比,jQuery有点过用了,CSS3transition在任何2D或3D属性上执行这种动画。同样,我担心,将其留给浏览器并忘记称为JavaScript的层可能会导致CPU浪费-特别是当您希望播放动画时。因此,由于您使用JavaScript定义功能,因此我喜欢在样式定义所在的位置放动画。您向JavaScript中注入的演示文稿越多,以后您将面临的问题就越多。

您所要做的就是使用addClass要设置动画的元素,在其中设置具有CSStransition属性的类。您只需“激活”动画,即可在纯演示层上实现动画

.js

// with jQuery
$("#element").addClass("Animate");

// without jQuery library
document.getElementById("element").className += "Animate";

可以使用jQuery轻松删除一个类,或者不使用库删除一个类

.css

#element{
    color      : white;
}

#element.Animate{
    transition        : .4s linear;
    color             : red;
    /** 
     * Not that ugly as the JavaScript approach.
     * Easy to maintain, the most portable solution.
     */
    -webkit-transform : rotate(90deg);
}

.html

<span id="element">
    Text
</span>

对于大多数用例而言,这是一种快速便捷的解决方案。

当我想实现不同的样式(替代CSS属性),并希望通过全局.5s动画即时更改样式时,也要使用此样式。我在中添加了一个新类BODY,同时以这种形式添加了替代CSS:

.js

$("BODY").addClass("Alternative");

.css

BODY.Alternative #element{
    color      : blue;
    transition : .5s linear;
}

这样,您可以对动画应用不同的样式,而无需加载不同的CSS文件。您只需要使用JavaScript来设置即可class


1
很好,但是仅限于支持CSS3转换的浏览器。因此,没有IE8或IE9。这是一个很大的部分。
莱利2013年

11
@Ryley您正在谈论12%的用户百分比。IE8或IE9用户低于5%。它并不是一个很大的部分,因为我们仍然在谈论表示层而不是功能。大约5%的访问者看不到您的3D动画。另外,如果浏览器(IE)不支持transition,那么它当然也不支持您的转换。
Dyin

并非完全如此transform-IE9支持。但是我同意这不是放弃的最大用户群体(IE8)。
雷利(Ryley)2013年

2
@Dyin这不是一个固定的12%,这取决于您的目标人群。根据google-analytics,我公司50%的用户使用IE8。关键是要了解您的听众。话虽这么说:老兄!这个答案比前两个要好得多。成为“钻石原石”的方式。
Ziggy 2013年

2
这也不考虑动态旋转值。
Yuschick 2014年

19

要添加到Ryley和atonyc的答案中,您实际上不必使用真正的CSS属性(例如text-index或)border-spacing,而是可以指定伪造的CSS属性(例如rotation或)my-awesome-property。使用不冒将来成为实际CSS属性风险的东西可能是一个好主意。

另外,有人问如何同时制作其他动画。可以照常执行此操作,但是请记住,step每个动画属性都会调用该函数,因此您必须像下面这样检查属性:

$('#foo').animate(
    {
        opacity: 0.5,
        width: "100px",
        height: "100px",
        myRotationProperty: 45
    },
    {
        step: function(now, tween) {
            if (tween.prop === "myRotationProperty") {
                $(this).css('-webkit-transform','rotate('+now+'deg)');
                $(this).css('-moz-transform','rotate('+now+'deg)'); 
                // add Opera, MS etc. variants
                $(this).css('transform','rotate('+now+'deg)');  
            }
        }
    });

(注意:我在jQuery文档中找不到“ Tween”对象的文档;在动画文档页面中,有一个指向http://api.jquery.com/Types#Tween的链接,该链接没有“T似乎存在。你可以找到吐温原型在Github上的代码在这里)。


什么是myRotationProperty ...它是您定义的自定义商品吗?什么now取决于这个。
穆罕默德·乌默尔

@MuhammadUmer-是的,myRotationProperty是自定义的东西,是虚假的CSS伪造属性。now是步骤回调函数的第一个参数,在此步骤中指定对属性值的更改。
skagedal 2014年

那么您是否也在CSS中也初始化了此属性。或者,您可以将其设置为动画以使其为零。
穆罕默德·乌默尔

7

只需使用CSS过渡:

$(element).css( { transition: "transform 0.5s",
                  transform:  "rotate(" + amount + "deg)" } );

setTimeout( function() { $(element).css( { transition: "none" } ) }, 500 );

例如,我将动画的持续时间设置为0.5秒。

请注意,动画结束(500毫秒)后,请setTimeout删除transitioncss属性


为了便于阅读,我省略了供应商前缀。

此解决方案当然需要浏览器的过渡支持。


谢谢,为我工作。您还忘记了右括号后面的分号。
德文·卡彭特

@ Sorrow123444很高兴它为您服务。我更正了丢失的分号,谢谢
Paolo's

3

我偶然发现了这篇文章,希望将jQuery中的CSS转换用于无限循环动画。这对我来说很好。我不知道它有多专业。

function progressAnim(e) {
    var ang = 0;

    setInterval(function () {
        ang += 3;
        e.css({'transition': 'all 0.01s linear',
        'transform': 'rotate(' + ang + 'deg)'});
    }, 10);
}

使用示例:

var animated = $('#elem');
progressAnim(animated)

1
//this should allow you to replica an animation effect for any css property, even //properties //that transform animation jQuery plugins do not allow

            function twistMyElem(){
                var ball = $('#form');
                document.getElementById('form').style.zIndex = 1;
                ball.animate({ zIndex : 360},{
                    step: function(now,fx){
                        ball.css("transform","rotateY(" + now + "deg)");
                    },duration:3000
                }, 'linear');
            } 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.