无法在一个周期结束时停止动画[重复]

Posted

技术标签:

【中文标题】无法在一个周期结束时停止动画[重复]【英文标题】:Can't stop animation at end of one cycle [duplicate] 【发布时间】:2011-03-06 11:12:24 【问题描述】:

我正在制作一个 CSS 动画,在其中我正在移动东西并希望它保持在结束位置,直到用户将鼠标移开。

body 
    background: url('osx.jpg');
    padding: 0;
    margin: 0;
    line-height: 60px;


@-webkit-keyframes item1 
    0%  bottom: -120px; left: 0px; 
    10%  bottom: -40px; left: 10px; -webkit-transform: rotate(5deg); 
    100%  bottom: -40px; left: 10px; -webkit-transform: rotate(5deg); 
    

@-webkit-keyframes item2 
    0%  bottom: -120px; left: 0px; 
    10%  bottom: 60px; left: 20px; -webkit-transform: rotate(7deg); 
    100%  bottom: 60px; left: 20px; -webkit-transform: rotate(7deg); 


@-webkit-keyframes item3 
    0%  bottom: -120px; left: 0px; 
    10%  bottom: 160px; left: 30px; -webkit-transform: rotate(9deg); 
    100%  bottom: 160px; left: 30px; -webkit-transform: rotate(9deg); 


    div 
    position: relative;
    
#folder 
    width: 120px;
    margin: 0px auto;


#folder > div 
    position: absolute; 


#folder:hover > div:nth-of-type(1) 
    -webkit-animation-name: item1;
    -webkit-animation-duration: 10s;


#folder:hover > div:nth-of-type(2) 
    -webkit-animation-name: item2;
    -webkit-animation-duration: 10s;


#folder:hover > div:nth-of-type(3) 
    -webkit-animation-name: item3;
    -webkit-animation-duration: 10s;

不过,只要动画结束,它就会不断重复。我只希望它发生一次并保持原状,直到用户离开。我尝试使用规范中暂停的东西,但它没有像我期望的那样工作。任何帮助表示赞赏。谢谢。 :)

【问题讨论】:

【参考方案1】:

以下评论对我有用。谢谢迈克尔

"在动画结束时需要添加填充模式来冻结动画状态。

-webkit-animation-fill-mode: forwards;

forwards 让动画处于最后一帧的状态

backwards 将动画留在开头

【讨论】:

我知道有点晚了,但实际上正确的方法是动画播放状态:developer.mozilla.org/en-US/docs/Web/CSS/animation-play-state【参考方案2】:

以防您的动画仍然重置到第一帧,请注意您声明 css 的顺序

这工作正常:

    animation: yourAnimationName 1s;
    animation-fill-mode: forwards;

这不会(重置到第一帧):

    animation-fill-mode: forwards;
    animation: yourAnimationName 1s;

棘手!

【讨论】:

谢谢!这是什么原因? 这是因为animation 是所有animation-* 属性的简写,设置animation 将覆盖所有animation-* 属性。此行为与其他简写相同(例如 backgroundborder)。如果您使用animation 简写且未定义填充模式,则默认使用none 好点!我不知道为什么这会发生在我身上! 你可以像这样组合起来单行animation: 1s ease 0s normal forwards 1 running yourAnimationName;【参考方案3】:

如果我正确理解了这个问题,听起来您需要将迭代设置为“1”。

-webkit-animation-iteration-count: 1;

【讨论】:

就是这样,非常感谢!【参考方案4】:

css3 动画在动画结束时重置为默认样式。您可以尝试使用 javascript

您可以将 eventListener 添加到动画中,检索您希望保留的样式,手动应用它们并删除动画。

document.getElementById('yourdiv').addEventListener(
    'webkitAnimationEnd',
    function()
        document.getElementById('yourdiv').style.backgroundPosition = '0px 0px';
        document.getElementById('yourdiv').style.webkitAnimationName = 'none';
    , 
    false
);

【讨论】:

这是真的,但我进行的实验是尝试仅使用 CSS 来完成。感谢您尝试 您需要添加填充模式以在动画结束时冻结动画状态。 "-webkit-animation-fill-mode:forwards" 你不应该只是让动画超长 - 这会消耗你的用户 CPU - CSS 动画非常占用 CPU。 @Michael 有趣!谢谢你,我不知道它存在。我会尝试它,并且一定会在我的下一个项目中使用它。 @MichaelMullany 我认为 CSS3 动画是 CPU 密集型的事实不再适用。如果您在动画中使用 3D 变换,浏览器会尽可能地尝试使用 GPU 加速,而您应该始终这样做。 同意。这又回到了过去。刚刚编辑了答案以反映这一点。【参考方案5】:

试试这个:

-webkit-animation-duration: 10s, 10s;

:)

【讨论】:

将动画超过 10 秒,剩余 10 秒。 还是什么都没有,我决定让动画变得很长(比如 10,000 秒长),这样用户就不太可能将鼠标悬停在上面那么长的时间;D

以上是关于无法在一个周期结束时停止动画[重复]的主要内容,如果未能解决你的问题,请参考以下文章

停止 UIView 动画 [重复]

设置UIButton的标题时如何停止按钮动画[重复]

什么是生命周期感知方式来实现重复的AsyncTask?

悬停时继续 CSS3 关键帧动画/悬停时停止重复

jquery 实现重复点击一个元素时不重复执行效果

延迟 SwiftUI 中的重复动画,在完整的自动反转重复周期之间