2

速度の異なる複数の要素で無限のアニメーションを実行できますが、いくつかのsetInterval関数を使用しています。私の目標は、これを1つの関数で実行することです。これを試してみると$.fn、すべて同じ速度でアニメーション化されます。どこで間違ったのですか?

これは正確なjsFiddleではなく対象となるサンプルです。

jQuery:

var eleHeight = $('.drop_leds').height();
var windowH = $(window).height();
var count = 0;
var counter;
var limit = windowH + eleHeight;

$.fn.goDown = function(x) {
    var _this = this;
    return counter = window.setInterval(function() {
        if( count >= 0 && count < limit ) {
            count += x;
            _this.css({'top':count +'px'});
        }
        else if( count >= limit ) { 
            count=0; _this.css({'top':'-'+ eleHeight +'px'});
        }

    },1);
};

$('#l_0,#l_6').goDown(1);
$('#l_1,#l_4').goDown(3);
$('#l_2,#l_7').goDown(4);
$('#l_3,#l_5').goDown(2);

html / css:

<div id="l_0" class="drop_leds"></div>
<div id="l_1" class="drop_leds"></div>
<div id="l_2" class="drop_leds"></div>
<div id="l_3" class="drop_leds"></div>
<div id="l_4" class="drop_leds"></div>
<div id="l_5" class="drop_leds"></div>
<div id="l_6" class="drop_leds"></div>
<div id="l_7" class="drop_leds"></div>

.drop_leds {position:absolute; width:10px; height:60px; background:black; top:0;}
#l_0 { left:40px; }#l_1 { left:70px; }#l_2 { left:110px; }#l_3 { left:140px; }
#l_4 { left:180px; }#l_5 { left:210px; }#l_6 { left:220px; }#l_7 { left:240px; }

ソース。

4

1 に答える 1

3

呼び出されるcountたびに上書きするため、すべてのタイマーが同じ値を使用することになります。プラグインの内部スコープ内に移動して、問題を修正します。$.fn.goDowncount

$.fn.goDown = function(x) {
    var count = 0;
    var counter;
    var _this = this;
    return counter = window.setInterval(function() {
        if( count >= 0 && count < limit ) {
            count += x;
            _this.css({'top':count +'px'});
        }
        else if( count >= limit ) { 
            count=0; _this.css({'top':'-'+ eleHeight +'px'});
        }

    },1);
};

フィドル

このように、各間隔には、間隔を作成した実行コンテキスト内でのみアクセス可能なcounter対応する変数があります。プラグインのスコープ内countをスコープした方法とまったく同じです。_this

于 2013-02-22T19:48:14.893 に答える