同时播放多个CSS动画

215

如何让两个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
6个回答

327
您可以使用逗号指定多个动画,每个动画都有自己的属性。 例如:
animation: rotate 1s, spin 3s;

5
不同的动画延迟怎么办? - little tiny man
4
@little-tiny-man,你也可以使用逗号来指定多个animation-delay,参见这个答案 - Klesun
1
@little-tiny-man 延迟可以作为动画速记形式的一部分进行指定,例如 rotate 1s 0.5s, spin 3s 10s 分别表示 0.5 秒和 10 秒的延迟。 - carecki
@sgrpwr 那个动画似乎没有包括使用语法 animation: X, Y; 的情况,其中 XY 将被串行或按顺序执行,而不是并行执行。这就是我更感兴趣的部分。 - Mikko Rantalainen
@MikkoRantalainen 我认为不可能使用单行代码运行多个动画。我唯一看到的可扩展的真正选项是关键帧。 - sgrpwr
显示剩余4条评论

277

简述

使用逗号,您可以指定多个动画,每个动画都具有自己的属性,如下面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>


你能在你的例子中两个动画之间添加延迟吗?animation: rotate 1s, spin 3s;。所以先运行rotate,然后暂停X秒,然后运行spin动画。 - wharfdale
动画:旋转1秒向前5秒,旋转3秒向前4秒; 在此,5秒是旋转动画的延迟,4秒是旋转动画的延迟。@wharfdale - Sadisha

43

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

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

就像这个代码片段一样(由于下面解释的其他问题,我将“scale”替换为“fade”...请耐心等待。):http://jsfiddle.net/rwaldin/fwk5bqt6/

其次,您的两个动画都修改相同DOM元素的相同CSS属性(transform)。我认为您不能那样做。您可以在不同的元素上指定两个动画,例如图像和容器元素。只需将其中一个动画应用于容器,就像在此代码片段中一样:http://jsfiddle.net/rwaldin/fwk5bqt6/2/


感谢您指定我们可以通过用逗号分隔名称来执行多个动画。 - Zachary Dahan

5
由于属性只能定义一次,因此您无法播放两个动画。为什么不将第二个动画包含在第一个动画中,并调整关键帧以获得正确的时序?

.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
1
旋转速度和缩放速度不同,旋转在2秒内完成,而缩放需要4秒。由于编写两个动画语句无法实现,我通过关键帧来控制时间。 - Ram G Athreya
虽然不能同时播放两个变换动画(因为一个变换会覆盖另一个变换),但说“你不能播放两个动画,因为该属性只能定义一次”是不正确的。请参阅有关使用逗号分隔值和动画的已接受答案。 - Justin Taddei

2

将以下2行代码转换为:

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

into:

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

2
你可以尝试这样做:
将父元素设置为 rotate,将图像设置为 scale,这样 rotatescale 的时间可以不同。

div {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 120px;
  height: 120px;
  margin: -60px 0 0 -60px;
  -webkit-animation: spin 2s linear infinite;
}
.image {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 120px;
  height: 120px;
  margin: -60px 0 0 -60px;
  -webkit-animation: scale 4s linear infinite;
}
@-webkit-keyframes spin {
  100% {
    transform: rotate(180deg);
  }
}
@-webkit-keyframes scale {
  100% {
    transform: scale(2);
  }
}
<div>
  <img class="image" src="http://makeameme.org/media/templates/120/grumpy_cat.jpg" alt="" width="120" height="120" />
</div>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接