2012-01-22 4 views
15

jQueryを使用していくつかのdivを循環させる必要があります。私はサイクルによって意味することは、私は7つのdiv要素のシリーズを持っていることです。Divsを介してサイクル

<div id="content-1">Sample text</div> 
<div id="content-2">Sample text</div> 
<div id="content-3">Sample text</div> 
<div id="content-4">Sample text</div> 
<div id="content-5">Sample text</div> 
<div id="content-6">Sample text</div> 
<div id="content-7">Sample text</div> 

私が起こるに必要なもの、私はそれらを変更する必要が5秒ごとです。だからdiv "Content-1"は5秒間表示され、div "Content 2"は5秒間表示されます。

私はこれがやりやすいと感じますが、私は馬鹿ですJavaScriptとjQuery。

答えて

36
var divs = $('div[id^="content-"]').hide(), 
    i = 0; 

(function cycle() { 
    divs.eq(i).fadeIn(400) 
       .delay(5000) 
       .fadeOut(400, cycle); 

    i = ++i % divs.length; // increment i, 
          // and reset to 0 when it equals divs.length 
})(); 

DEMO:あなたは、フェードアニメーションをしたいshowhideを使用しない場合http://jsfiddle.net/eFjnU/


(短い遅延で)。 delayとコールバックが機能するように、継続時間を与える必要があります。

var divs = $('div[id^="content-"]').hide(), 
    i = 0; 

(function cycle() { 

    divs.eq(i).show(0) 
       .delay(1000) 
       .hide(0, cycle); 

    i = ++i % divs.length; 

})(); 

DEMO:(短い遅延で)http://jsfiddle.net/eFjnU/1/

+0

ありがとうsooooo!これは素晴らしい!私はうまくいけば実装するのに大きな問題ではない2つの他の質問があります。1)divの上にマウスを置くとアニメーションが一時停止するようなものを追加することは可能ですか? 2)私はどんなdivでもクラスを割り当てられるので、どうすればいいのですか?私は現在のdivに適用したいスタイルを持っています。再度、感謝します! – user1163942

+0

マウスを動かすと一時停止しますが、マウスを動かしたときにクラスを追加/削除するには[こちらのアップデート](http://jsfiddle.net/eFjnU/2/)を参照してください。 –

+1

@ Si8:私はインデックスを使用しないで少しクリーナーだと思う。 https://jsfiddle.net/egLefjwv/11/あなたは '++ 'が要素の最後のインデックスを超えてインデックスを持ってくるケースを扱っていませんでした。これを修正するには、残りの部分を 'vAlertLen'で除算することができます。これは、インデックスが長さに等しいときに' 0'に戻し、増分を行います。 '(vCurrentDispItem%vAlertLen + 1)'私はあなたがそこからアニメーションを持って行くことを許可します。がんばろう! –

5

シンプルなjQueryのフェードギャラリースライドショー

ホバー上の一時停止と:

// FADESHOW // Simple fade gallery 
 
$(".fadeShow").each(function() { 
 

 
    var $slides = $(this).children(), 
 
     tot = $slides.length, 
 
     itv = null, 
 
     idx = 0; 
 
     
 
    $slides.eq(idx).show(); 
 
    
 
    function anim() { $slides.fadeOut().eq(++idx % tot).fadeIn(); } 
 
    function play() { itv = setInterval(anim, 2000); } 
 
    function stop() { clearInterval(itv); } 
 
    
 
    $(this).hover(stop, play); 
 
    
 
    play(); 
 
    
 
});
body{margin:0;} 
 

 
/* FADESHOW basic CSS */ 
 
.fadeShow { 
 
    position:relative; 
 
} 
 
.fadeShow > * { 
 
    position:absolute; 
 
    display:none; 
 
    height: inherit; 
 
    width: 100%; 
 
} 
 

 
/* FADESHOW (your styles) */ 
 
.gal_1 { height:80px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="fadeShow gal_1"> 
 
    <div style="background:#0bf;">1 Hover to pause</div> 
 
    <div style="background:#fb0;">2 You can have as many slideshows as you want</div> 
 
    <div style="background:#b0f;">3</div> 
 
</div> 
 

 
<div class="fadeShow"> 
 
    <p>LOREM</p> 
 
    <p>IPSUM</p> 
 
    <p>DOLOR</p> 
 
    <p>SOMETHING</p> 
 
</div>

.fadeShow()jQueryプラグイン

あなたが異なるフェードを許可し、値を一時停止し、他のオプションが含まためにsimpls jQueryプラグインに変換したい場合:

// FADESHOW // Simple fade gallery by Roko :) 
 
(function($){ 
 
    $.fn.fadeShow = function(options) { 
 

 
    var op = $.extend({ 
 
     pause : 3800, 
 
     fade : 600, 
 
     pauseHover : true 
 
    }, options); 
 

 
    return this.each(function() { 
 

 
     var $slides = $(this).children(), 
 
      tot = $slides.length, 
 
      itv = null, 
 
      idx = 0; 
 

 
     $slides.eq(idx).show(); 
 

 
     function anim() { $slides.fadeOut(op.fade).eq(++idx % tot).fadeIn(op.fade); } 
 
     function play() { itv = setInterval(anim, op.fade+op.pause); } 
 
     function stop() { clearInterval(itv); } 
 

 
     if(op.pauseHover) $(this).hover(stop, play); 
 

 
     play(); 
 

 
    }); 
 
    }; 
 
}(jQuery)); 
 

 

 
// Basic example 
 
$(".gal1").fadeShow(); 
 

 
// With options 
 
$(".gal2").fadeShow({ 
 
    pause : 4000, 
 
    fade : 1000, 
 
    pauseHover : false 
 
});
/* FADESHOW basic CSS */ 
 
.fadeShow { 
 
    position:relative; 
 
} 
 
.fadeShow > * { 
 
    position:absolute; 
 
    display:none; 
 
    height: inherit; 
 
    width: 100%; 
 
} 
 

 
/* FADESHOW (your styles) */ 
 
.gal1 { height:80px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="fadeShow gal1"> 
 
    <div style="background:#0bf;">1 Hover to pause</div> 
 
    <div style="background:#fb0;">2 You can have as many slideshows as you want</div> 
 
    <div style="background:#b0f;">3</div> 
 
</div> 
 

 
<div class="fadeShow gal2"> 
 
    <p>pauseHover : false</p> 
 
    <p>IPSUM</p> 
 
    <p>DOLOR</p> 
 
    <p>SOMETHING</p> 
 
</div>

+1

アップデートありがとう!私はこれを動作させようとしていますが、残念ながら私の質問では完全にはっきりしませんでした(申し訳ありません)。私はここでより良いものを書いています:[http://stackoverflow.com/questions/8966117/cycle-divs-and-thumbnails]あなたが提供したものを実装することを望んでいますか? – user1163942

+0

これは素晴らしいです。ホバーの再生と一時停止に[次へ/前へ]オプションを追加するにはどうすればよいですか?ありがとう。 – Si8

+0

https://jsfiddle.net/egLefjwv/7/私もautoを使うことができますが、どうして互いの上にいるのではなく、互いの上にいるのですか?ありがとう。 – Si8

1

セットを反復して可視性プロパティを処理する必要がありますes。

まず、私が作成した2つのライブラリを見ていきましょう。 1つを仮定し、

/* 
* params: 
*  - selector: jQuery selector 
*  - init: function which gets the Visiblary object to initialize it 
*  - events: object/array 
*   - root: a selector which contain all the affected tags, default is "body" 
*   - types: array, which contains the string representation of the events 
*   - selector: inner selector to identify the target set 
*   - handler: handler function 
*/ 
function Visiblary(params) { 
    var instance = this; 
    if (!params.toggleClass) { 
     params.toggleClass = "invisible"; 
    } 
    this.hideAll = function() { 
     $(params.selector).addClass(params.toggleClass); 
     return instance; 
    }; 
    this.hideSubset = function(subsetSelector) { 
     $(params.selector).filter(subsetSelector).addClass(params.toggleClass); 
     return instance; 
    }; 
    this.hideOnly = function(subsetSelector) { 
     $(params.selector).not(subsetSelector).removeClass(params.toggleClass); 
     $(params.selector).filter(subsetSelector).addClass(params.toggleClass); 
     return instance; 
    }; 
    this.showAll = function() { 
     $(params.selector).removeClass(params.toggleClass); 
     return instance; 
    }; 
    this.showSubset = function(subsetSelector) { 
     $(params.selector).filter(subsetSelector).removeClass(params.toggleClass); 
     return instance; 
    }; 
    this.showOnly = function(subsetSelector) { 
     $(params.selector).not(subsetSelector).addClass(params.toggleClass); 
     $(params.selector).filter(subsetSelector).removeClass(params.toggleClass); 
     return instance; 
    }; 
    this.invert = function() { 
     $(params.selector).each(function() { 
      $(this).hasClass(params.toggleClass) ? $(this).removeClass(params.toggleClass) : $(this).addClass(params.toggleClass); 
     }); 
     return instance; 
    }; 
    if (!!params.init) { 
     params.init(this); 
    } 
    if (!!params.events) { 
     for (var event in params.events) { 
      $(!!params.events[event].root ? params.events[event].root : "body").on(params.events[event].types.join(" "), params.events[event].selector, params.events[event].handler); 
     } 
    } 
    return instance; 
} 

および:

function Iterable(params) { 
    var prevHandlers = []; 
    var nextHandlers = []; 
    var that = this; 
    this.current = params.current; 

    function ensureArray() { 
     if (!that.elements) { 
      that.elements = []; 
     } else if (!Array.isArray(that.elements)) { 
      that.elements = $.map(that.elements, function(value, index) { 
       return [value]; 
      }); 
     } 
     return that.elements; 
    } 

    function calculateCount() { 
     that.count = ensureArray().length; 
    } 

    this.setElements = function(elements) { 
     this.elements = elements; 
     calculateCount(); 
    }; 

    this.prev = function(amount) { 
     if (amount === undefined) { 
      amount = 1; 
     } 
     //Modulo twice to make sure current will be positive 
     that.current = (((that.current - amount) % that.count) + that.count) % that.count; 
     while (amount--) { 
      for (var prevHandler in prevHandlers) { 
       prevHandlers[prevHandler](params); 
      } 
     } 
    }; 

    this.next = function(amount) { 
     if (amount === undefined) { 
      amount = 1; 
     } 
     that.current = (that.current + amount) % that.count; 
     while (amount--) { 
      for (var nextHandler in nextHandlers) { 
       nextHandlers[nextHandler](params); 
      } 
     } 
    }; 

    this.getCurrent = function() { 
     return that.elements[that.current]; 
    }; 

    this.setCurrent = function(current) { 
     for (var index in that.elements) { 
      if (that.elements[index] === current) { 
       that.current = index; 
       return true; 
      } 
     } 
     return false; 
    }; 

    this.pushElement = function(element) { 
     that.elements.push(element); 
    }; 

    this.pushElements = function(elements) { 
     for (var element in elements) { 
      that.pushElement(elements[element]); 
     } 
    }; 

    this.insertElement = function(element, index) { 
     that.elements.splice(index, 0, element); 
    }; 

    this.insertElements = function(elements, indexes, leftToRight) { 
     var start = 0; 
     var end = indexes.length - 1; 
     if (leftToRight === false) { 
      var aux = start; 
      start = end; 
      end = aux; 
     } 
     var leap = (start < end) ? 1 : -1; 
     while (start - leap !== end) { 
      that.insertElement[elements[indexes[start]]]; 
      start += leap; 
     } 
    }; 

    this.popElement = function() { 
     that.elements.pop(); 
    }; 

    this.popElements = function(amount) { 
     that.elements.splice(that.elements.length - amount, amount); 
    }; 

    this.removeElement = function(index) { 
     that.elements.splice(index, 1); 
    }; 

    this.removeElements = function(indexes, leftToRight) { 
     var start = 0; 
     var end = indexes.length - 1; 
     if (leftToRight === false) { 
      var aux = start; 
      start = end; 
      end = aux; 
     } 
     var leap = (start < end) ? 1 : -1; 
     while (start - leap !== end) { 
      that.removeElement(indexes[start]); 
      start += leap; 
     } 
    }; 

    this.register = { 
     prev: function(param) { 
      if (Array.isArray(param)) { 
       for (var func in param) { 
        prevHandlers.push(param[func]); 
       } 
      } else { 
       prevHandlers.push(param); 
      } 
     }, 
     next: function(param) { 
      if (Array.isArray(param)) { 
       for (var func in param) { 
        nextHandlers.push(param[func]); 
       } 
      } else { 
       nextHandlers.push(param); 
      } 
     } 
    }; 

    this.setElements(params.elements); 
    if ((!!this.current) && (!Array.isArray(params.elements))) { 
     this.setCurrent(params.elements[params.current]); 
    } 

} 

第二は、Visiblaryある可視性イベントのすべての種類を扱うように設計されている:第一は、反復のすべての種類を処理するように設計されてIterable、ありますこれらのツールを使用し、7つの要素が既に作成されている場合、これは問題を解決するスクリプトです:

var myVisiblary = new Visiblary({ 
    selector: "#content-1, #content-2, #content-3, #content-4, #content-5, #content-6, #content-7" 
}); 
myVisiblary.showOnly("#content-1"); 
var myIterable = new Iterable({ 
    elements: $("#content-1, #content-2, #content-3, #content-4, #content-5, #content-6, #content-7"), 
    current: 0 
}); 
myIterable.register.next(function() {myVisiblary.showOnly($(myIterable.getCurrent()))}); 
setInterval(function(){ myIterable.next(); }, 5000);