【问题标题】:Moving element on screen and back with keyframes使用关键帧在屏幕上移动元素并返回
【发布时间】:2018-02-18 02:28:10
【问题描述】:

如果我有以下代码:

<div class="leftBox">
    <div class="mainNode"></div>
</div>
<script type="text/javascript">
$('.mainNode').click(function() {
    var element = $('.mainNode');
    if (!element.hasClass('show')) {
        element.removeClass('hide');
        element.addClass('show');
    } else {
        element.removeClass('show');
        element.addClass('hide');
    }
})
</script>

在 CSS 中:

.mainNode {
    width: 160px;
    height: 160px;

    border-radius: 50%;
    background-color: red;
    position :relative;
}

.show {
    -webkit-animation: mymove 1s forwards; /* Safari 4.0 - 8.0 */
    animation: mymove 1s forwards;
}

.hide {
    -webkit-animation: mymove 1s reverse; /* Safari 4.0 - 8.0 */
    animation: mymove 1s reverse;
}

/* Safari 4.0 - 8.0 */
@-webkit-keyframes mymove {
    from   {top: 0px;}
    to {top: 200px;}
}

/* Standard syntax */
@keyframes mymove {
    from   {top: 0px;}
    to {top: 200px;}
}

我正在寻找的是,当我使用关键帧单击它时,我的圆圈会移动到底部(我将来会有更多)。

第一次点击后,圆圈应该停留在底部,上面的代码已经发生了这种情况。

但是,当我重新单击圆圈时,我希望它反向执行相同的动画并返回到原始位置。还允许我在使用相同的动画将其移回后重新单击它...目前无法正常工作。它向下移动并在没有动画的情况下跳转到顶部和底部。

任何帮助将不胜感激。

Here be my example

【问题讨论】:

  • 必须是关键帧吗?我会使用一个具有底部位置的类.bottom,然后将元素的原始位置设置为中间或其他任何位置。将transition: all 0.5s ease; 添加到元素中,它将为位置变化设置动画。现在使用 jQuery,您只需单击 .toggleClass('bottom') 即可。
  • 我想使用关键帧,因为我想移动它,而不是直线,而是弧线,因此有“目标点”可以通过。这只是一个精简的例子。
  • 我觉得元素在下一个被删除之前有效地丢失了类这一事实可能是一个问题。你如何提供它应该通过的点,你打算如何处理这些点之间相对于 CSS 中指定的时间的可变距离?
  • 我可以先添加然后删除类,但这本身并没有改变任何东西。我计划在动画的百分比上设置关键帧,即10% { top: 100px, left: 50px } .....

标签: javascript css animation css-animations keyframe


【解决方案1】:

请试试这个。我尽力了。动画每次从上到下和从下到上工作。

$('.mainNode').click(function() {
    var element = $('.mainNode');   
    
    if (!element.hasClass('show')) {
        element.removeClass('hide');        
        element.addClass('show'); 
        element.before( element.clone(true)).remove();
    } else {
        element.removeClass('show');        
        element.addClass('hide');
         element.before( element.clone(true)).remove();
    }    
})
.mainNode {
  width: 160px;
  height: 160px;
  border-radius: 50%;
  background-color: red;
  position :relative;
}

.show {
  -webkit-animation: mymove 1s forwards; /* Safari 4.0 - 8.0 */
  animation: mymove 1s forwards;  
}

.hide {
  -webkit-animation: mymove1 1s forwards; /* Safari 4.0 - 8.0 */
  animation: mymove1 1s forwards;  
}

/* Safari 4.0 - 8.0 */
@-webkit-keyframes mymove {
  from   {top: 0px;}
  to {top: 200px;}
}

/* Standard syntax */
@keyframes mymove {
  from   {top: 0px;}
  to {top: 200px;}
}
/* Safari 4.0 - 8.0 */
@-webkit-keyframes mymove1 {
  from   {top: 200px;}
  to {top: 0px;}
}

/* Standard syntax */
@keyframes mymove1 {
  from   {top: 200px;}
  to {top: 0px;}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="leftBox">
    <div class="mainNode"></div>
</div>

【讨论】:

  • 如果我将backwards 更改为reverse,这将有效。确实!对象的克隆也是如此,为什么会这样?
  • 动画完成后,我们想重新启动它,所以我使用对象的克隆。
【解决方案2】:

使用 backwords 而不是反向它会为你工作。

.hide {
    -webkit-animation: mymove 1s backwards; /* Safari 4.0 - 8.0 */
    animation: mymove 1s backwards;
    animation-delay: .2s;
}

【讨论】:

    【解决方案3】:

    您需要更改两件事才能使其正常工作:

    .hide {
        -webkit-animation: mymove 1s reverse forwards; /* Safari 4.0 - 8.0 */
        animation: mymove 1s reverse forwards;
        animation-delay: .2s;
    }
    

    使用animation-direction reverse,但animation-fill-mode 转发。这样,动画将从结尾开始,并停留在最后一个关键帧(回到顶部)。

    但是还有一个额外的问题:一旦show 类被删除,它就会跳回到顶部,因为动画不再适用。为了防止这种情况,您可以将animation-name: mymove 添加到您的.mainNode

    .mainNode {
        animation-name: mymove;
        // Other properties...
    }
    

    在此处查看实际操作:https://codepen.io/anon/pen/jLgrjW

    【讨论】:

    • 我是唯一一个看到提供的代码笔的行为与有问题的代码完全相同的人吗?
    • 正如马特所说,对我来说,这段代码也是跳跃而不是动画。在这一点上,它似乎更像是一个隐藏和显示而不是动画移动。
    • 嗯,我在 Edge 中测试过,至少在那个浏览器中可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多