我正在尝试将2个CSS动画链接在一起,请参阅pen:http://codepen.io/jdesilvio/pen/pjwvyO
我已按照其他类似问题的答案中提供的语法,但它们似乎无法正常工作:
animation-name: falling, laydown;
animation-duration: 2000ms, 1000ms;
animation-timing-function: ease-in, ease-out;
animation-iteration-count: 1, 1;
它正在播放第二个动画,然后是第一个动画,最后是第二个动画。我怎样才能让它发挥第一个,然后第二个?
以下是完整代码:
<!DOCTYPE html>
<meta charset="utf-8">
<style>
html, body {
height: 100%;
}
body {
display: flex;
align-items: center;
justify-content: center;
}
@keyframes falling {
0% {
transform: translate3d(0, -400px, 0);
}
100% {
transform:
translate3d(0, 40%, 0)
rotateX(30deg)
rotateY(0deg)
rotateZ(60deg);
}
}
@keyframes laydown {
0% {
transform:
translate3d(0, 40%, 0)
rotateX(30deg)
rotateY(0deg)
rotateZ(60deg);
}
100% {
transform:
translate3d(0, 40%, 0)
rotateX(70deg)
rotateY(0deg)
rotateZ(80deg);
}
}
#falling-card-parent {
height: 150px;
width: 100px;
margin: auto;
perspective: 1000px;
}
#falling-card {
height: 150px;
width: 100px;
background-color: black;
margin: auto;
transform:
translate3d(0, 40%, 0)
rotateX(70deg)
rotateY(0deg)
rotateZ(80deg);
animation-name:
falling, laydown;
animation-duration:
2000ms, 1000ms;
animation-timing-function:
ease-in, ease-out;
animation-iteration-count:
1, 1;
}
</style>
<html>
<body>
<div id="falling-card-parent">
<div id="falling-card"></div>
</div>
</body>
</html>
答案 0 :(得分:8)
问题实际上不是动画的顺序,而是因为pme元素上的多个动画如何工作。在元素上添加多个动画时,默认情况下会同时启动。
正因为如此,laydown
和falling
动画同时开始,但laydown
动画实际上从一开始就在1000ms
内完成,但第一个动画(这是falling
),直到2000ms
才完成。
关于动画的W3C spec还说明了以下关于动画期间访问同一属性的多个动画:
如果多个动画试图修改同一属性,则最接近名称列表末尾的动画将获胜。
在相关提供的代码中,两个动画都试图修改transform
属性,第二个动画最接近结尾。因此,当第二个动画仍在运行时(即,前1000毫秒),将按照第二个动画中的指定应用变换更改。在此期间,第一个动画仍在运行,但由于其值被覆盖,因此无效。在第二个1000毫秒(当第二个动画已经完成但第一个仍然在执行时),变换将按照第一个动画的指示应用。这就是为什么它看起来好像第二个动画在第一个动画之前运行,然后是第一个动画。
要解决此问题,应暂停(或延迟)第二个动画的执行,直到第一个动画完成为止。这可以通过为第二个动画添加animation-delay
(等于第一个动画的animation-duration
)来完成。
animation-name: falling, laydown;
animation-duration: 2000ms, 1000ms;
animation-delay: 0ms, 2000ms; /* add this */
animation-timing-function: ease-in, ease-out;
animation-iteration-count: 1, 1;
html,
body {
height: 100%;
}
body {
display: flex;
align-items: center;
justify-content: center;
}
@keyframes falling {
0% {
transform: translate3d(0, -400px, 0);
}
100% {
transform: translate3d(0, 40%, 0) rotateX(30deg) rotateY(0deg) rotateZ(60deg);
}
}
@keyframes laydown {
0% {
transform: translate3d(0, 40%, 0) rotateX(30deg) rotateY(0deg) rotateZ(60deg);
}
100% {
transform: translate3d(0, 40%, 0) rotateX(70deg) rotateY(0deg) rotateZ(80deg);
}
}
#falling-card-parent {
height: 150px;
width: 100px;
margin: auto;
perspective: 1000px;
}
#falling-card {
height: 150px;
width: 100px;
background-color: black;
margin: auto;
transform: translate3d(0, 40%, 0) rotateX(70deg) rotateY(0deg) rotateZ(80deg);
animation-name: falling, laydown;
animation-duration: 2000ms, 1000ms;
animation-delay: 0ms, 2000ms;
animation-timing-function: ease-in, ease-out;
animation-iteration-count: 1, 1;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div id="falling-card-parent">
<div id="falling-card"></div>
</div>
&#13;
答案 1 :(得分:0)
html, body {
height: 100%;
}
body {
display: flex;
align-items: center;
justify-content: center;
}
@keyframes falling {
0% {
transform: translate3d(0, -400px, 0);
}
100% {
transform:
translate3d(0, 40%, 0)
rotateX(30deg)
rotateY(0deg)
rotateZ(60deg);
}
}
@keyframes laydown {
0% {
transform:
translate3d(0, 40%, 0)
rotateX(30deg)
rotateY(0deg)
rotateZ(60deg);
}
100% {
transform:
translate3d(0, 40%, 0)
rotateX(70deg)
rotateY(0deg)
rotateZ(80deg);
}
}
#falling-card-parent {
height: 150px;
width: 100px;
margin: auto;
perspective: 1000px;
}
#falling-card {
height: 150px;
width: 100px;
background-color: black;
margin: auto;
transform:
translate3d(0, 40%, 0)
rotateX(70deg)
rotateY(0deg)
rotateZ(80deg);
animation-name:
laydown, falling;
animation-duration:
2000ms, 1000ms;
animation-timing-function:
ease-in, ease-out;
animation-iteration-count:
1, 1;
}
&#13;
<div id="falling-card-parent">
<div id="falling-card"></div>
</div>
&#13;
反过来说:
animation-name:
falling, laydown;
到
animation-name:
laydown, falling;