我有两个动画:关于元素加载和悬停:
div {
animation: slide-up 2s;
-webkit-animation: slide-up 2s;
-moz-animation: slide-up 2s;
}
div:hover{
animation: rotate 2s;
-webkit-animation: rotate 2s;
-moz-animation: rotate 2s;
}
加载元素后会运行slide-up
动画,而当元素悬停时会运行rotate
。但是,现在元素在鼠标离开时滑动,我不知道如何防止这种情况。所以我想在悬停时关闭slide-up
动画。
旋转动画使用transform
属性,向上滑动只会更改margins
。
答案 0 :(得分:5)
<强>原因:强>
由于以下原因,当您将鼠标移出元素时,slide-up
动画会再次执行:
slide-up
)。浏览器执行此操作。animation
属性再次仅指定一个动画(rotate
)。这使浏览器从元素中删除slide-up
动画。删除动画会使浏览器忘记执行状态或执行计数。div
选择器适用于该元素,因此浏览器会再次移除rotate
动画并附加slide-up
动画。由于它正在被重新附加,浏览器认为它必须再次执行它。<强>解决方案:强>
即使:hover
开启,您也可以通过 确保动画实际上永远不会从元素中移除 ,从而使幻灯片动画只运行一次而animation-iteration-count
是1。
在下面的代码段中,您还要注意我如何在slide-up
选择器中保留:hover
动画定义。这使得浏览器看到这个动画一直存在,并且因为这个动画在加载时已经执行了一次,所以它不会再次执行它(因为迭代计数)。
( 注意: 为了避免任何混淆 - animation-iteration-count
的默认值为1,但我已将其明确用于解释。这不是主要的原因,但只是一个额外的步骤,以确保其值不会弄乱解决方案。)
div {
height: 100px;
width: 100px;
border: 1px solid;
animation: slide-up 2s 1;
}
div:hover {
animation: slide-up 2s 1, rotate 2s forwards;
}
@keyframes slide-up {
from {
margin-top: 100px;
}
to {
margin-top: 0px;
}
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(60deg);
}
&#13;
<div>Some div</div>
&#13;
答案 1 :(得分:1)
只需添加animation-play-state: paused;
div:hover{
animation: rotate 2s, slide-up paused;
-webkit-animation: rotate 2s, slide-up paused;
-moz-animation: rotate 2s, slide-up paused;
}
答案 2 :(得分:0)
只需在逗号后添加另一个动画。例如,如果我想创建一个淡入(第一个动画)然后它的阴影大小不断变化(第二个动画)的框,那么这就是我要使用的 CSS:
#box{
width: 300px;
height: 250px;
border: 2px solid white;
border-radius: 20px;
display: block;
margin-left: 500px;
margin-top: 190px;
background-color: rgb(0, 204, 228);
animation: animate1 3s 1, animate2 1s infinite;
text-align: center;}
@keyframes animate1{
0% {
opacity: 0;
}
100%{
opacity: 1;
}
}
@keyframes animate2{
0%{box-shadow: 0px 0px 10px 0px gray; }
50%{box-shadow: 0px 0px 30px 0px gray; }
100%{box-shadow: 0px 0px 10px 0px gray; }}