同时播放多个CSS动画


118

如何让两个CSS动画以不同的速度播放?

  • 图像应同时旋转和增长。
  • 旋转将每2秒循环一次。
  • 生长将每4秒循环一次。

示例代码:

.image {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 120px;
    height: 120px;
    margin:-60px 0 0 -60px;
    -webkit-animation:spin 2s linear infinite;
    -webkit-animation:scale 4s linear infinite;
}

@-webkit-keyframes spin { 
    100% { 
        transform: rotate(180deg);
    } 
}

@-webkit-keyframes scale {
    100% {
         transform: scaleX(2) scaleY(2);
    }
}

http://jsfiddle.net/Ugc5g/3388/-仅播放一个动画(声明了最后一个动画)。


旋转时图像应缩放吗?我提供的答案没有,但是如果您需要的是,可以对其进行调整
Ram G Athreya 2014年

Answers:


154

TL; DR

使用逗号,您可以指定多个动画,每个动画都有其自己的属性,如下面的CriticalError答案所述。

例:

animation: rotate 1s, spin 3s;

原始答案

这里有两个问题:

#1

-webkit-animation:spin 2s linear infinite;
-webkit-animation:scale 4s linear infinite;

第二行替换第一行。因此,没有任何效果。

#2

两个关键帧都应用于相同的属性 transform

作为一种替代方法,您可以将图像包裹在中,<div>然后分别以不同的速度为每个动画设置动画

http://jsfiddle.net/rnrlabs/x9cu53hp/

.scaler {
    position: absolute;
    top: 100%;
    left: 50%;
    width: 120px;
    height: 120px;
    margin:-60px 0 0 -60px;
    animation: scale 4s infinite linear;    
}

.spinner {
    position: relative;
    top: 150px;
    animation: spin 2s infinite linear;
}


@keyframes spin { 
    100% { 
        transform: rotate(180deg);
    } 
}

@keyframes scale {
    100% {
         transform: scaleX(2) scaleY(2);
    }
}
<div class="spinner">
<img class="scaler" src="http://makeameme.org/media/templates/120/grumpy_cat.jpg" alt="" width="120" height="120">
<div>


215

万一有新手来赶上这个线程,您可以用逗号指定多个动画(每个都有自己的属性)。

例:

animation: rotate 1s, spin 3s;

3
谢谢,这是一个简单得多的解决方案
Sergey Rotbart

12
死了,逗号!
Zachary Dahan

3
那不同的动画延迟呢?
小家伙

35

您确实可以同时运行多个动画,但是您的示例有两个问题。首先,您使用的语法仅指定一个动画。第二个样式规则隐藏第一个。您可以使用以下语法指定两个动画:

-webkit-animation-name: spin, scale
-webkit-animation-duration: 2s, 4s

就像这个小提琴一样(由于下面要解释的另一个问题,我用“淡入淡出”代替了“缩放” ...请耐心等待。):http : //jsfiddle.net/rwaldin/fwk5bqt6/

其次,两个动画都更改同一DOM元素的同一CSS属性(变换)。我不相信你能做到。您可以在不同的元素(图像和容器元素)上指定两个动画。只需将其中一个动画应用于容器即可,如下面的小提琴所示:http : //jsfiddle.net/rwaldin/fwk5bqt6/2/


感谢您指定我们可以做多个动画,因为我们用逗号分隔名称。
Zachary Dahan

3

您不能播放两个动画,因为该属性只能定义一次。而是为什么不将第二个动画包含在第一个动画中并调整关键帧以获得正确的时间?

.image {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 120px;
    height: 120px;
    margin:-60px 0 0 -60px;
    -webkit-animation:spin-scale 4s linear infinite;
}

@-webkit-keyframes spin-scale { 
    50%{
        transform: rotate(360deg) scale(2);
    }
    100% { 
        transform: rotate(720deg) scale(1);
    } 
}
<img class="image" src="http://makeameme.org/media/templates/120/grumpy_cat.jpg" alt="" width="120" height="120">


2
用户要求“以不同的速度”
rnrneverdies 2014年

由于编写两个动画语句不起作用,所以以不同的速度旋转发生在2秒内,而缩放发生在4秒内。我已经通过关键帧进行了计时。
Ram G Athreya 2014年

虽然不能同时播放两个变换动画是正确的(因为一个变换会覆盖另一个变换),但是说“不能播放两个动画,因为该属性只能定义一次,这是不正确的”。请参阅有关在动画中使用逗号分隔的值的公认答案。
贾斯汀·塔迪

2

你可以尝试这样的事情

将父项设置为rotate,图像设置为,scale以便rotatescale时间可以不同

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.