簡體   English   中英

我的setTimeout無法正常工作

[英]my setTimeout doesn't work correctly

這是代碼:

var stripeAnimation = function() {

var streetDivWidth = $('.street_name').width();
var streetFull = $('.street_name .street_name_text');

for(var i=0; i<streetFull.length; i++) {
    var item = $(streetFull[i]);
    var widthFull = item.width();
    var remainder = widthFull - streetDivWidth;
    var animationSpeed = widthFull * 5;
    var summary = streetDivWidth - widthFull;
    if(summary < 0) {
        item.children('.gradient_span').addClass('gradient');
        infinite();
        setTimeout(infinite, 1000);
    }

}
function infinite() {
    item.animate({
        marginLeft: '-' + remainder + 'px'
    }, animationSpeed).animate({
            marginLeft: 0
        }, widthFull).delay(1000);
}

}
$(document).ready(function() {
    stripeAnimation();
});

看起來應該以1000毫秒的延遲一遍又一遍地循環播放動畫-“ setTimeout(infinite,1000);”。 但事實並非如此。 請幫忙!

如果要循環,則需要使用setInterval()

setInterval(infinite, 10000);

然后

function infinite() {
    item.animate({
        marginLeft: '-' + remainder + 'px'
    }, animationSpeed).animate({
            marginLeft: 0
        }, widthFull);
}

其余變量是局部變量,您像全局函數一樣使用它。 應該在全局進行聲明。

setTimeout將僅調用一次函數,但是,正如Arun P所說,您可以選擇使用setInterval ,但不建議將其用於動畫。 setInterval的問題在於,您指定的延遲間隔是直到它被調用之前的最短時間,但是不能保證在該間隔結束后將被調用。

一個示例是,如果您設置間隔為300毫秒,但隊列被其他操作(UI或其他JS操作)阻塞了,例如600毫秒,則函數將被調用兩次,一個接一個地進行,沒有延遲,這會使您的動畫不均勻。 您不能確保會在您的間隔恰好調用超時,但不能小於該間隔。

更好的方法是像您一樣,使用setTimeout進行首次首次調用,然后在infinite()函數結束時再次調用setTimeout(infinite, 1000)

綜上所述,如果適用,制作動畫的最佳方法是requestAnimationFrame方法,您可以在此處進行研究:

https://developer.mozilla.org/zh-CN/docs/Web/API/window.requestAnimationFrame

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM