我知道这在这里被问了好几次,但我要求对这类动画采取不同的方法。
问题:
第二个框有多个动画,试图创建与第一个相同的效果。看起来transform属性正在被覆盖(正如它应该的那样)*。我试图扩展第一动画(第二框)与属性的第二动画。试图使用animation-fill-mode: forwards,但没有成功。也许我错过了一些最基本的东西。用香草CSS可以吗?
*Reference
“动画名称”属性定义了一个应用动画的列表。如果多个动画试图修改同一个属性,那么最接近名称列表末尾的动画将获胜。
要求:
独立的move2-right和move2-down关键帧规则,但工作相同的元素,保持第一次动画转换。如果有一个替代的方法,这类动画,请指导我通过它。
电流输出:
.animation-1,
.animation-2 {
width: 200px;
height: 200px;
display: inline-block;
background: white;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
.movable-1,
.movable-2 {
background: #41A186;
width: 50px;
height: 50px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
text-align: center;
vertical-align: middle;
line-height: 50px;
}
.movable-1 {
-webkit-animation-name: move1;
animation-name: move1;
-webkit-animation-duration: 4s;
animation-duration: 4s;
-webkit-animation-delay: 0s;
animation-delay: 0s;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
}
.movable-2 {
-webkit-animation-name: move2-right, move2-down;
animation-name: move2-right, move2-down;
-webkit-animation-duration: 2s, 2s;
animation-duration: 2s, 2s;
-webkit-animation-delay: 4s, 6s;
animation-delay: 4s, 6s;
-webkit-animation-fill-mode: forwards, forwards;
animation-fill-mode: forwards, forwards;
}
@-webkit-keyframes move1 {
0% {
-webkit-transform: translateX(0px);
transform: translateX(0px);
}
50% {
-webkit-transform: translateX(30px);
transform: translateX(30px);
}
100% {
-webkit-transform: translateX(30px) translateY(50px);
transform: translateX(30px) translateY(50px);
}
}
@keyframes move1 {
0% {
-webkit-transform: translateX(0px);
transform: translateX(0px);
}
50% {
-webkit-transform: translateX(30px);
transform: translateX(30px);
}
100% {
-webkit-transform: translateX(30px) translateY(50px);
transform: translateX(30px) translateY(50px);
}
}
@-webkit-keyframes move2-right {
0% {
-webkit-transform: translateX(0px);
transform: translateX(0px);
}
50% {
-webkit-transform: translateX(30px);
transform: translateX(30px);
}
100% {
-webkit-transform: translateX(30px);
transform: translateX(30px);
}
}
@keyframes move2-right {
0% {
-webkit-transform: translateX(0px);
transform: translateX(0px);
}
50% {
-webkit-transform: translateX(30px);
transform: translateX(30px);
}
100% {
-webkit-transform: translateX(30px);
transform: translateX(30px);
}
}
@-webkit-keyframes move2-down {
0% {
-webkit-transform: translateY(0px);
transform: translateY(0px);
}
50% {
-webkit-transform: translateY(50px);
transform: translateY(50px);
}
100% {
-webkit-transform: translateY(50px);
transform: translateY(50px);
}
}
@keyframes move2-down {
0% {
-webkit-transform: translateY(0px);
transform: translateY(0px);
}
50% {
-webkit-transform: translateY(50px);
transform: translateY(50px);
}
100% {
-webkit-transform: translateY(50px);
transform: translateY(50px);
}
}<div class="animation-1">
<div class="movable-1">1</div>
</div>
<div class="animation-2">
<div class="movable-2">2</div>
</div>
这里有一个你可以玩的小提琴:JSfiddle
发布于 2015-08-26 11:50:55
据我所知,这在纯CSS中是不可能的,因为(正如您已经指出的那样),当我们向已经有转换的元素添加额外的转换规则时,整个转换会被重置,因为它覆盖并且不附加到现有的转换中。
有了JS,这可能是可能的,但即使在那里,也会很困难,因为我们必须做以下工作:
animationend事件。translateX(...)。translateX(...)作为转换堆栈的第一部分。注:,我假设您有一种情况,您绝对无法使用问题中提到的第一种方法。
实现类似效果的另一种方法是动画元素的margin或position,而不是使用transform: translate()。这种方法的一个主要缺点是,这不会在GPU层完成(不像transform),因此当多个这样的动画同时发生时会慢一些(而且也可能很昂贵)。
使用边距:
下面的片段通过动画化margin-left和margin-top属性来达到效果。
.animation-1,
.animation-2,
.animation-3 {
width: 200px;
height: 200px;
display: inline-block;
background: white;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
vertical-align: middle;
}
.movable-1,
.movable-2,
.movable-3 {
background: #41A186;
width: 50px;
height: 50px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
text-align: center;
vertical-align: middle;
line-height: 50px;
}
.movable-1 {
animation-name: move1;
animation-duration: 4s;
animation-delay: 0s;
animation-fill-mode: forwards;
}
.movable-2 {
animation-name: move2-right, move2-down;
animation-duration: 2s, 2s;
animation-delay: 4s, 6s;
animation-fill-mode: forwards, forwards;
animation-timing-function: linear;
}
.movable-3 {
animation-name: move3-diagonal;
animation-duration: 4s;
animation-delay: 8s;
animation-fill-mode: forwards;
animation-timing-function: linear;
}
@keyframes move1 {
0% {
transform: translateX(0px);
}
50% {
transform: translateX(30px);
}
100% {
transform: translateX(30px) translateY(50px);
}
}
@keyframes move2-right {
0% {
margin-left: 0px;
}
100% {
margin-left: 30px;
}
}
@keyframes move2-down {
0% {
margin-top: 0px;
}
100% {
margin-top: 50px;
}
}
@keyframes move3-diagonal
{
0% {
margin-top: 0px;
margin-left: 0px;
}
100% {
margin-top: 50px;
margin-left: 30px;
}
}<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class="animation-1">
<div class="movable-1">1</div>
</div>
<div class="animation-2">
<div class="movable-2">2</div>
</div>
<div class="animation-3">
<div class="movable-3">3</div>
</div>
使用位置:
这个片段通过动画、left和top属性实现了同样的效果。子元素具有position: absolute。
.animation-1,
.animation-2,
.animation-3 {
width: 200px;
height: 200px;
display: inline-block;
background: white;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
position: relative;
}
.movable-1,
.movable-2,
.movable-3 {
background: #41A186;
width: 50px;
height: 50px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
text-align: center;
vertical-align: middle;
line-height: 50px;
position: absolute;
}
.movable-1 {
animation-name: move1;
animation-duration: 4s;
animation-delay: 0s;
animation-fill-mode: forwards;
}
.movable-2 {
animation-name: move2-right, move2-down;
animation-duration: 2s, 2s;
animation-delay: 4s, 6s;
animation-fill-mode: forwards, forwards;
animation-timing-function: linear;
}
.movable-3 {
animation-name: move3-diagonal;
animation-duration: 4s;
animation-delay: 8s;
animation-fill-mode: forwards;
animation-timing-function: linear;
}
@keyframes move1 {
0% {
transform: translateX(0px);
}
50% {
transform: translateX(30px);
}
100% {
transform: translateX(30px) translateY(50px);
}
}
@keyframes move2-right {
0% {
left: 0px;
}
100% {
left: 30px;
}
}
@keyframes move2-down {
0% {
top: 0px;
}
100% {
top: 50px;
}
}
@keyframes move3-diagonal {
0% {
top: 0px;
left: 0px;
}
100% {
top: 50px;
left: 30px;
}
}<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class="animation-1">
<div class="movable-1">1</div>
</div>
<div class="animation-2">
<div class="movable-2">2</div>
</div>
<div class="animation-3">
<div class="movable-3">3</div>
</div>
注:,正如我在回答here中所描述的,您当然可以添加一个包装器元素,并将向下移动的动画设置到它。这将产生与第一种相同的效果,但我并不是建议采用这种方法,因为它违背了你问题的要点(在我看来,这就是-如何在同一元素中添加多个动画,并从第一个元素结束的地方开始第二个步骤)。
.animation-1,
.animation-2 {
width: 200px;
height: 200px;
display: inline-block;
background: white;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
}
.movable-1,
.movable-2 {
background: #41A186;
width: 50px;
height: 50px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
text-align: center;
vertical-align: middle;
line-height: 50px;
}
.movable-1 {
animation-name: move1;
animation-duration: 4s;
animation-delay: 0s;
animation-fill-mode: forwards;
}
.movable-2 {
animation-name: move2-right;
animation-duration: 2s;
animation-delay: 4s;
animation-fill-mode: forwards;
}
.movable-2-wrapper {
animation-name: move2-down;
animation-duration: 2s;
animation-delay: 6s;
animation-fill-mode: forwards;
}
@keyframes move1 {
0% {
transform: translateX(0px);
}
50% {
transform: translateX(30px);
}
100% {
transform: translateX(30px) translateY(50px);
}
}
@keyframes move2-right {
0% {
transform: translateX(0px);
}
50% {
transform: translateX(30px);
}
100% {
transform: translateX(30px);
}
}
@keyframes move2-down {
0% {
transform: translateY(0px);
}
50% {
transform: translateY(50px);
}
100% {
transform: translateY(50px);
}
}<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<div class="animation-1">
<div class="movable-1">1</div>
</div>
<div class="animation-2">
<div class='movable-2-wrapper'>
<div class="movable-2">2</div>
</div>
</div>
https://stackoverflow.com/questions/32224802
复制相似问题