2015-12-18 102 views
1

我試圖讓一個div不斷動畫:循環格動畫

$(document).ready(function() { 
 
    function arrowmovement() { 
 
    setTimeout(function() { 
 
     $("#downarrowimg").animate({ 
 
     'margin-top': "-=30px" 
 
     }); 
 
    }, 500); 
 
    setTimeout(function() { 
 
     $("#downarrowimg").animate({ 
 
     'margin-top': "+=30px" 
 
     }); 
 
    }, 500); 
 
    } 
 
    arrowmovement(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="downarrow"> 
 
    <img id="downarrowimg" src="https://upload.wikimedia.org/wikipedia/en/f/f1/Down_Arrow_Icon.png"> 
 
</div>

它只運行一次。我做錯了什麼,如何解決?

回答

3

這裏是一個純CSS的解決方案,它連續動畫#downarrow

@keyframes downarrowanimation { 
 
    0% {margin-top: 30px;} 
 
    50% {margin-top: -30px;} 
 
    100% {margin-top: 30px;} 
 
} 
 

 
#downarrow { 
 
    animation: downarrowanimation 1s ease-in-out infinite; 
 
}
<div id="downarrow"> 
 
<img id="downarrowimg" src="https://upload.wikimedia.org/wikipedia/en/f/f1/Down_Arrow_Icon.png"> 
 
</div>

+0

很好的答案。如果可能的話,最好將CSS用於最大FPS的動畫,儘管按照正確的順序使用所有瀏覽器特定的前綴會很乏味。如果動畫是有條件的,則可以將相關的CSS包裝在'.animated'類中,並有條件地將其應用於元素。這種技術唯一的缺點是你無法控制動畫的「同步」 - 一旦你把它交給css,你只能啓動/停止 - 平穩的intros-n-outros不再可能。如果您需要該級別的控制,請查看requestAnimationFrame。 – case2000

+0

@ case2000它不回答這個問題是什麼:我做錯了什麼,我該如何解決它? –

+0

@GCyrillus - 你說得對,它不回答這個問題。相反,這是一個解決方案(幾個)OP的概述方案:「我試圖讓一個div不斷動畫。」 – Rounin

-1

jQuery在動畫方面真的很糟糕。 Greensock動畫軟件包(GSAP)是一個夢幻般的輕量級動畫庫,您可以改爲查看。

TweenMax.to($("div"), .5, {y: "+=50", ease: Linear.easeNone, yoyo: true, repeat: -1});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.1/TweenMax.min.js"></script> 
 
<div style="width: 50px; height: 50px; background-color: red;"></div>

一號線做了所有你需要的。如果您想要更復雜的緩動,請使用TimelineMax類鏈接動畫。

var timeline = new TimelineMax({repeat: -1}); 
 
timeline.to($("div"), .5, {y: "+=50", ease: Power2.easeOut}); 
 
timeline.to($("div"), .5, {y: "-=50", ease: Power2.easeOut});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.1/TweenMax.min.js"></script> 
 
<div style="width: 50px; height: 50px; background-color: red;"></div>

0

你可以只調用arrowmovement功能在每個動畫的結尾:

function arrowmovement(direction) { 
    $("#downarrowimg").animate({ 
     'margin-top': "+="+ (30 * direction) +"px" 
    }, 500, function() { 
     arrowmovement(direction * -1); 
    }); 
} 

$(document).ready(function() { 
    arrowmovement(1); 
}); 

演示:https://jsfiddle.net/louisbros/dhwoejon/

0

你需要使用的setInterval()。

$(document).ready(function() { 
 
    var repeatIt = setInterval(arrowmovement, 1000); 
 
    function arrowmovement() { 
 
    setTimeout(function() { 
 
     $("#downarrowimg").animate({ 
 
     'margin-top': "-=30px" 
 
     }); 
 
    }, 500); 
 
    setTimeout(function() { 
 
     $("#downarrowimg").animate({ 
 
     'margin-top': "+=30px" 
 
     }); 
 
    }, 500); 
 
    } 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="downarrow"> 
 
    <img id="downarrowimg" src="https://upload.wikimedia.org/wikipedia/en/f/f1/Down_Arrow_Icon.png"> 
 
</div>

一套它在一個變種,所以你可以阻止它:

function abortTimer() { // to be called when you want to stop the timer 
    clearInterval(repeatIt); 
} 
1

有幾種方法可以做到這一點,我建議使用setInterval(),波紋管檢查例子。

希望這會有所幫助。


var down=true; 
 

 
setInterval(function() { 
 
    if(down){ 
 
     $("#downarrowimg").animate({ 
 
     'margin-top' : "-=30px" 
 
     }, function() { 
 
     down=false; 
 
     }); 
 
    }else{ 
 
    $("#downarrowimg").animate({ 
 
     'margin-top' : "+=30px" 
 
    }, function() { 
 
     down=true; 
 
    }); 
 
    } 
 
},500);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="downarrow"> 
 
    <img id="downarrowimg" src="https://upload.wikimedia.org/wikipedia/en/f/f1/Down_Arrow_Icon.png"> 
 
</div>

0

你爲什麼不只是使用CSS? GPU加速的動畫帶來的額外好處讓您獲得所有的好處。

@keyframes bounce { 
 
    from {margin-top: 30px;} 
 
    to {margin-top: -30px;} 
 
} 
 

 
.arrow { 
 
    animation-name: bounce; 
 
    animation-duration: 1s; 
 
    animation-direction: alternate; 
 
    animation-iteration-count: infinite; 
 
}
<div id="downarrow"> 
 
     <img class="arrow" src="https://upload.wikimedia.org/wikipedia/en/f/f1/Down_Arrow_Icon.png"> 
 
    </div>

1

你可以用動畫的方法的完整功能,你不這樣做真的需要在這裏暫停。
像純粹的CSS動畫Rounin建議也是一個選項。

.animate()

完整 類型:Function() 要調用的函數一旦動畫完成,稱爲每一個匹配元素一次。

這裏是一個例子。

$(document).ready(function() { 
 
    function arrowmovement() { 
 
     var d = ($("#downarrowimg").css('margin-top') === "-30px") ? "+" : "-"; 
 
     $("#downarrowimg").animate({ 
 
      'margin-top' : d + "=30px" 
 
     }, 500, // duration 
 
\t function() { // complete fn 
 
      arrowmovement(); 
 
     }); 
 
    } 
 
    arrowmovement(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<div id="downarrow"> 
 
    <img id="downarrowimg" src="https://upload.wikimedia.org/wikipedia/en/f/f1/Down_Arrow_Icon.png"> 
 
</div>

1

$(document).ready(function() { 
 
    function arrowUp() { 
 
    $("#downarrowing").animate(
 
    \t {'margin-top': "-=30px"}, 600, function(){arrowDown()}); 
 
    } 
 

 
    function arrowDown() { 
 
    \t $("#downarrowing").animate(
 
    \t {'margin-top': "+=30px"}, 600, function(){arrowUp()}); 
 
    } 
 
\t arrowUp(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div> 
 
    <img id="downarrowing" src="https://upload.wikimedia.org/wikipedia/en/f/f1/Down_Arrow_Icon.png"> 
 
</div>

0

這很容易理解。

$(document).ready(function (argument) { 
    var operator = '-'; 
    setInterval(arrowMovement,500); 
    function arrowMovement() { 
     if(operator == '-') { 
      operator = '+' 
     } else { 
      operator = '-' 
     } 

     $('#downarrow').animate({'margin-top':operator+10}, 500); 
    } 
});