2017-09-09 89 views
2

提供我有以下代碼:在屏幕上移動元素和背部使用關鍵幀

<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

+0

它必須是關鍵幀?我將使用一個具有底部位置的類「.bottom」,然後將元素的原始位置設置爲中間或其他位置。添加'過渡:所有0.5秒緩解;'元素,它會動畫位置的變化。現在使用jQuery,你只需要點擊.toggleClass('bottom')。 –

+0

我想使用關鍵幀,因爲我想將它移動,而不是以直線形式移動,而是以弧線形式移動,因此有「目標點」可以穿過。這只是一個簡單的例子。 – Tikkes

+0

我覺得這個元素在下一個被移除之前有效地丟失了這個類,這可能是一個問題。你如何提供它應該通過的點,以及你計劃如何處理這些點之間的變化距離與CSS中指定的時間相關? –

回答

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>

+0

如果我將'backwards'更改爲'reverse',這將起作用。確實!所以這是克隆對象的原因,究竟是什麼原因? – Tikkes

+0

一旦動畫完成,我們想重新啓動它,所以我使用克隆的對象。 –

0

使用backwords,而不是扭轉它會爲你工作。

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

這不會觸發動畫,並且不會產生任何影響...... – Tikkes

0

你需要改變兩件事情,使這項工作:

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

使用animation-directionreverse,但animation-fill-mode前鋒。這樣,動畫將從最後開始,並停留在最後一個關鍵幀(返回頂部)。

但還有一個額外的問題:一旦show類被刪除,它會跳回頂部,因爲動畫不再適用。爲了防止這種情況,您可以將animation-name: mymove添加到您的.mainNode

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

看到它在這裏的行動:https://codepen.io/anon/pen/jLgrjW

+0

我是唯一一個看到提供的codepen行爲與有問題的代碼完全一樣的嗎? –

+0

正如馬特所說,對我來說,這個代碼跳躍而不是動畫。這看起來更像是一個隱藏和展示,而不是動畫。 – Tikkes

+1

嗯我在Edge中測試過它,它至少在該瀏覽器中工作。 – user125661