我的元素具有无限的CSS3动画,当悬停元素时,它将更改为另一个无限动画。一切都还好,但是有时候动画的改变太弹了,是否有一种方法可以使动画之间的过渡(也许会将元素带入动画之间的初始状态)和MouseEleave上的初始状态?这两个动画的开始和结尾状态都是相同的。
@keyframes first-animation {
0% { transform: scale3d(1,1,0);}
50% { transform: scale3d(0.8,0.8,0); }
100% { transform: scale3d(1,1,0); }
};
@keyframes second-animation {
0% { transform: scale3d(1,1,0); }
70% { transform: scale3d(0.7,0.7,0); }
80% { transform: scale3d(0.9,0.9,0); }
100% { transform: scale3d(1,1,0); }
};
div{
animation: first-animation 1.7s ease-in-out infinite;
}
div:hover, div:focus{
animation: second-animation 1.1s ease-in-out infinite;
}
我认为它不能使用比例转换来实现。
您可以从scale()转换为translatez()。当应用透视图时,净效应也将是量表。但是有趣的观点是将视角设置为高价值,这种比例效应可以很小。透视图是一种动画属性。
不利的一面是我们需要在图层周围添加2个包裹...但是最终结果是。我保留了原始版本以比较
@keyframes first-animation {
0% { transform: scale(1,1);}
50% { transform: scale(0.8,0.8); }
100% { transform: scale(1,1); }
}
@keyframes second-animation {
0% { transform: scale(1,1); }
70% { transform: scale(0.7,0.7); }
80% { transform: scale(0.9,0.9); }
100% { transform: scale(1,1); }
}
.sample {
background-color: lightblue;
animation: first-animation 1.7s ease-in-out infinite;
}
.sample:hover {
animation: second-animation 1.1s ease-in-out infinite;
}
.dim {
width: 200px;
height: 200px;
}
.base1 {
perspective: 1000px;
transition: perspective 2s ease-out;
position: absolute;
left: 300px;
top: 10px;
}
.base1:hover {
perspective: 9999px;
}
.base2 {
width: 100%;
height: 100%;
animation: animation1 1.7s ease-in-out infinite;
perspective: 9999px;
transition: perspective 2s ease-in;
}
.base1:hover .base2 {
perspective: 1000px;
}
.inner {
width: 100%;
height: 100%;
background-color: lightgreen;
animation: animation2 1.1s ease-in-out infinite;
transform-style: preserve-3d;
perspective: 99999px;
}
@keyframes animation1 {
0% { transform: translateZ(0px);}
50% { transform: translateZ(-200px); }
100% { transform: translateZ(0px); }
}
@keyframes animation2 {
0% { transform: translateZ(0px);}
70% { transform: translateZ(-300px); }
80% { transform: translateZ(-100px); }
100% { transform: translateZ(0px); }
}
<div class="sample dim">SAMPLE</div>
<div class="base1 dim">
<div class="base2">
<div class="inner">DEMO</div>
</div>
</div>
为了获得所需的效果,您需要使用CSS3动画事件。在这种情况下,您需要使用" AnimationIteration"。因此,您可以在迭代后解雇活动。我为第二个动画添加了此次活动的课程。
codepen demo
$(document).ready(function() {
var animationElement = $(".animation");
$("body").on({
mouseover: function() {
animationElement.one('webkitAnimationIteration mozAnimationIteration AnimationIteration', function() {
animationElement.addClass("second-animation");
});
},
mouseleave: function() {
animationElement.one('webkitAnimationIteration mozAnimationIteration AnimationIteration', function() {
animationElement.removeClass("second-animation");
});
}
});
});
您是否使用过 transition ?如果不是,请在父级
中添加过渡规则div{
-webkit-transition: all 500ms linear;
-moz-transition: all 500ms linear;
-ms-transition: all 500ms linear;
-o-transition: all 500ms linear;
transition: all 500ms linear;
}