平滑停止 CSS 关键帧动画

Posted

技术标签:

【中文标题】平滑停止 CSS 关键帧动画【英文标题】:Smoothly stop CSS keyframe animation 【发布时间】:2015-06-22 11:27:02 【问题描述】:

我有以下代码:http://jsfiddle.net/odj8v0x4/。

function stopGlobe() 
    $('.mapfront').removeClass('mapfront-anim');
    $('.mapback').removeClass('mapback-anim');


function startGlobe() 
    $('.mapfront').addClass('mapfront-anim');
    $('.mapback').addClass('mapback-anim');
@keyframes mapfront_spin 
    0% 
        background-position: 1400px 0%;
    
    100% 
        background-position: 0 0%;
    

@keyframes mapback_spin 
    0% 
        background-position: 0 0%;
    
    100% 
        background-position: 1400px 0%;
    

@-webkit-keyframes mapfront_spin 
    0% 
        background-position: 1400px 0%;
    
    100% 
        background-position: 0 0%;
    

@-webkit-keyframes mapback_spin 
    0% 
        background-position: 0 0%;
    
    100% 
        background-position: 1400px 0%;
    

body 
    margin: 50px;
    background: #000;

.globe 
    width: 400px;
    height: 400px;
    position: relative;

.front 
    width: 400px;
    height: 400px;
    background: url(http://dl.dropboxusercontent.com/u/17180596/SphereForeground.png);
    z-index: 5;
    position: absolute;
    top: 0;
    left: 0;

.back 
    width: 400px;
    height: 400px;
    background: url(http://dl.dropboxusercontent.com/u/17180596/SphereBackground.png);
    z-index: 2;
    position: absolute;
    top: 0;
    left: 0;

.mapfront, .mapback 
    border-radius: 300px;
    width: 340px;
    height: 340px;
    position: absolute;
    top: 30px;
    left: 30px;
    z-index: 4;

.mapfront 
    background: url(http://dl.dropboxusercontent.com/u/17180596/CartoForeground.png) repeat-x;

.mapfront-anim 
    -webkit-animation: mapfront_spin 15s linear infinite;
    animation: mapfront_spin 15s linear infinite;

.mapback 
    background: url(http://dl.dropboxusercontent.com/u/17180596/CartoBackground.png) repeat-x;
    position: absolute;

.mapback-anim 
    -webkit-animation: mapback_spin 15s linear infinite;
    animation: mapback_spin 15s linear infinite;
<div class="globe">
    <div class="front"></div>
    <div class="mapfront mapfront-anim"></div>
    <div class="mapback mapback-anim"></div>
    <div class="back"></div>
</div>

执行javascript函数后stopGlobe()动画停止,但突然停止。

我可以平稳地停止动画,以避免突然跳入,然后从停止点重新开始动画吗?

【问题讨论】:

也许这会有所帮助:github.com/jQueryKeyframes/jQuery.Keyframes 平稳停止是指像ease-in 过渡到停止吗? @aug,也不错 查看此演示 jsfiddle.net/vals/NfX56/9 和此答案 ***.com/a/18025979/1926369 【参考方案1】:

您可以仅使用 CSS 实现此目的。

您只需要一点点动作即可使其顺利进行。

所以,我在需要时设置了转换转换。 并且这种变换是通过缓出来过渡的,以产生平滑效果。

因此,当悬停时,动画会(突然)停止。但同时,应用了变换平移,并且由于此变换是通过适当的缓动进行转换的,因此它立即以与动画相同的速度开始。

这个速度会根据缓动而减慢,直到停止。

我在应用了翻译的元素中添加了一个包装器。为了避免这种变换“移动”元素,我们需要使元素大于可见空间,并设置在限制可见部分的包装器内(这将是静态的)

只需将鼠标悬停在地球上即可。 (看 ma,没有 JS)

 @keyframes mapfront_spin 
    0%         background-position: 1400px 0%;    
    100%         background-position: 0 0%;    

@keyframes mapback_spin 
    0%         background-position: 0 0%;    
    100%         background-position: 1400px 0%;    

@-webkit-keyframes mapfront_spin 
    0%         background-position: 1400px 0%;    
    100%         background-position: 0 0%;    

@-webkit-keyframes mapback_spin 
    0%         background-position: 0 0%;    
    100%         background-position: 1400px 0%;    

body 
    margin: 50px;
    background: #000;

.globe 
    width: 400px;
    height: 400px;
    position: relative;

.front 
    width: 400px;
    height: 400px;
    background: url(http://dl.dropboxusercontent.com/u/17180596/SphereForeground.png);
    z-index: 5;
    position: absolute;
    top: 0;
    left: 0;

.back 
    width: 400px;
    height: 400px;
    background: url(http://dl.dropboxusercontent.com/u/17180596/SphereBackground.png);
    z-index: 2;
    position: absolute;
    top: 0;
    left: 0;

.mapfront, .mapback 
    border-radius: 300px;
    width: 340px;
    height: 340px;
    position: absolute;
    top: 30px;
    left: 30px;
    z-index: 4;
    overflow: hidden;

.mapfront-inner 
    width: 380px;
    height: 340px;
    top: 0px;
    left: 0px;
    position: absolute;
    background: url(http://dl.dropboxusercontent.com/u/17180596/CartoForeground.png) repeat-x;
    transition: transform 1s ease-out;

.mapfront-anim 
    -webkit-animation: mapfront_spin 15s linear infinite;
    animation: mapfront_spin 15s linear infinite;

.globe:hover .mapfront-anim,
.globe:hover .mapback-anim 

    -webkit-animation-play-state: paused;
    animation-play-state: paused;

.globe:hover .mapfront-inner 
    transform: translateX(-40px);


.mapback-inner 
    width: 380px;
    height: 340px;
    top: 0px;
    left: -40px;
    background: url(http://dl.dropboxusercontent.com/u/17180596/CartoBackground.png) repeat-x;
    position: absolute;
    transition: transform 1s ease-out;

.globe:hover .mapback-inner 
    transform: translateX(40px);


.mapback-anim 
    -webkit-animation: mapback_spin 15s linear infinite;
    animation: mapback_spin 15s linear infinite;
<div class="globe">
    <div class="front"></div>
    <div class="mapfront">
        <div class="mapfront-inner mapfront-anim">
        </div>
    </div>
    <div class="mapback">
        <div class="mapback-inner  mapback-anim">
        </div>
    </div>
    <div class="back"></div>
</div>

【讨论】:

我有一个类似的问题,我正在努力理解你的答案。您是说您制作了地图的第二份副本,但具有缓出功能?我现在正在比较原始代码和您的代码,但我仍然对它的工作原理感到有些困惑。 我已经改变了解释。我希望现在更清楚了,但可能是我的英语不够好...... 图片链接失效【参考方案2】:

你大约。添加到所有关键帧动画播放状态:暂停;。 在上面添加类以覆盖暂停到动画播放状态:正在运行;

如果你想暂停它,只需使用 javascript 删除类

【讨论】:

【参考方案3】:

使用 javascript 设置 CSS。将animation-interation-count设置为1(而不是无限)并设置animation-timing-function来缓和。

它应该会自己慢慢停止。

【讨论】:

【参考方案4】:

您不会喜欢这个答案,但事实是 CSS3 动画对于实现这一点并没有真正有用。要完成这项工作,您需要在 Javascript 中复制大量 CSS,这会破坏这一点(例如在这个密切相关的答案 Change speed of animation CSS3? 中)。要真正让它平稳停止,最好的办法是在像Greensock animation library 这样的平台上编写动画,它提供了使它真正平稳停止而不是突然停止所需的所有工具。

【讨论】:

以上是关于平滑停止 CSS 关键帧动画的主要内容,如果未能解决你的问题,请参考以下文章

CSS关键帧动画中的平滑旋转

重新启动时如何使这个 CSS 关键帧动画平滑?

如何停止 CSS 关键帧动画?

在月亮上停止 css 关键帧翻转动画,如月相

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

CSS关键帧动画优雅完成