2012-02-23 51 views
3

私はこのような質問をしばしば見るが、複数の解決策がある。私は再利用可能な短いものを考え出しています。私の質問は、次のコードではclearTimeout()にする必要がありますか?そして、あなたが改善するものは何ですか?パフォーマンスのためにこのコードがどれくらい良いか悪いのですか?
http://jsfiddle.net/elclanrs/fQX8M/15/次々に要素を表示する

var fade1by1 = function ($elms, props) { 

    props = props || {}; 
    props.delay = props.delay || 1; // s 
    props.speed = props.speed || 400; // ms 
    props.ease = props.ease || 'linear'; 

    for (var i=0, d=0, l=$elms.length; i<l; i++, d+=props.delay*1000) { 
     (function (i, d) { 
      // Using `delay()` instead of `setTimeout()` 
      // as Alexander suggested 
      $elms.eq(i).delay(d).fadeIn(props.speed, props.ease); 
     })(i, d); 
    } 
}; 
+0

実際にはとてもクールです。機能を追加する場合は、「遅い」の代わりに個々のフェード速度を設定するパラメータを追加し、フォールバックとして「遅い」または200を使用します。 –

+0

ああ、私は結局これからプラグインを作りますが、私はちょうど最も単純なケースが改善できるかどうかを見たいと思っています。それから私はカスタマイズに入るでしょう。ほとんどの場合、この場合には 'clearTimout()'が本当に必要かどうかを知りたいのですが... – elclanrs

+0

タイマーが無期限に実行されていれば、clearTimeout()が必要になるでしょう。この場合、指定された数の要素に対してのみ実行されるので、明確にする必要はありません。もちろん、停止ボタンを追加して、次の要素をいつでも停止させない限りは、 ind_speedを使った簡単なバージョンもあります(自分で持っているわけではありませんが、私はそれを見たいと思っていました:p http://jsfiddle.net/fQX8M/7/ –

答えて

0

アニメーションを停止するように、それはいないようですので、私はあなたがwindow.clearTimeoutに必要とは思いません。あなたはまだ未確定の場合は.delayを使用すると、明らかにwindow.setTimeoutも使用されます。

var fade1by1 = function ($elms, speed) { 
    speed = speed || 1; // Seconds 
    for (var i=0, s=0, l=$elms.length; i<l; i++, s+=speed*1000) { 
     $elms.eq(i).delay(s).fadeIn('slow'); 
    } 
}; 

実際にはhereをご覧ください。

+0

はい、私はそれを試みましたが、http://jsfiddle.net/elclanrs/fQX8M/13/ – elclanrs

+0

私はちょうどクロージャー機能を試してみましたが、それはうまくいきます。問題の更新を見てください。コードが少し減りましたので、軽くするためにできることはあまりありません。 – elclanrs

+0

閉鎖機能なしで私のために働いたのですが、私はそれにリンクしている回答にjsfiddleを入れています – Alexander

0

私には、fadeIn関数のコールバックを使用してください。以下のような何かがあなたの目標(新しいのparamsで代用)の全てを達成する必要があります代わりに、ますます長い待機期間と一度にすべてのアクションを設定するので

var customFade = function(parent, speed){ 
    $(':hidden:first', parent).fadeIn(speed, function(){ 
     customFade(parent, speed) 
    }); 
} 
$('button').click(function(){ customFade($('ul'), 1000); }); 
+0

もちろん、別のものがまだ進行している間は、フェージングを開始しない限り。 –

0

を、別のアプローチは、それぞれに直接ショーの動作をバインドすることです選択された要素をカスタムイベントとして定義し、そのバインドされた関数に固定待機期間と「next」要素のカスタムイベントが存在する場合はそのカスタムイベントをトリガする呼び出しを含めます。始めるには、最初の要素のヒューズを点灯させるだけです。

ので、このような何か:

var fadeCascade = function fadeCascade(your_selector, props) { 
    props = props || {}; 
    props.delay = props.delay || 1; // s 
    props.speed = props.speed || 2000; // ms 
    props.ease = props.ease || 'linear'; 

    $(your_selector) 
    .addClass('showme') // Being a little lazy here, but it works 
         // You could work out an inspection by attached event 
    .bind('showme', function() { // custom event 
     $(this) 
     .delay(props.delay * 1000) 
     .fadeIn(props.speed, props.ease, function() { 
      $(this).nextAll('.showme:first').trigger('showme'); // jqueryish recursion 
     }); 
    }).hide() // or just hide in initial css 
    .first().trigger('showme'); // set the dominoes falling 
}; 

とは明らかにトリガする:

fadeCascade('div.bar');​ 

あなたは衛生面が心配している場合は、イベントのバインドを解除でき、あなたが行くようにクラスを削除します。

例:http://jsfiddle.net/redler/EKx6s/1/

更新:追加遅延、感謝@Alexander。

+0

それは私だけか、そこに遅れがないのですか? – Alexander

+0

@Alexander、そうですよ!私は秒があるときにそれを追加します。 –

関連する問題