TL :-)この質問を理由です; - 例DR:http://jsbin.com/ufoceq/8/
あまりにも多くの労力をかけずに無限のイメージスライダーを作成する簡単な方法は次のとおりです。<n>
イメージをループ内でスライドさせるという単純さのために、n
th image次の画像は、1
st(またはその逆)です。
アイデアは、最後の画像のクローンは最初のものの前に付加され
- ようにするために、最初と最後の画像のクローンを作成することです。
- 最後のイメージの後に最初のイメージのクローンが追加されます。
イメージの量は問わず、複製された要素は2つまでしか追加する必要がありません。
また、すべての画像がの幅であり、左右に移動したコンテナに包まれているとします。これは、overflow: hidden
のクリッピングされたマスクに移動します。すると、すべての画像は、display: inline-block
とwhite-space: nowrap
がコンテナにセットされた行に簡単に揃えることができます(flexbox
はさらに簡単です)。
DOM構造はこのようなものになるだろうn = 4
について:初めに
offset(px) 0 100 200 300 400 500
images | 4c | 1 | 2 | 3 | 4 | 1c
/* ^^ ^^
[ Clone of the last image ] [ Clone of the 1st image ]
*/
、あなたのコンテナはleft: -100px
(またはもmargin-left: -100px
or even better (for a matter of performance)transform: translateX(-100px)
)に配置されるので、スライダーは最初の画像を表示することができます。イメージを別のイメージに切り替えるには、以前選択したものと同じプロパティでJavaScriptアニメーションを適用する必要があります。
あなたのスライダーは番目の画像4 に現在あるとき、あなたは1c
に画像4
から切り替える必要があり、その考えはすぐに本当であなたのスライダーラッパーを再配置、アニメーションの最後にコールバックを実行することです1 stイメージオフセット(例:あなただけの画像1
から4c
にアニメーションを実行する必要があるとアニメーションがされていたときに前の画像を表示する:あなたは、スライダーが現在1つのST要素の上に配置されたときにこれが似ている)を容器に
をleft: -100px
を設定しましたコンテナを移動するだけで完了しました。スライダは、4 thイメージオフセットに配置されています(たとえば、left: -400px
をコンテナに設定します)。
あなたは上記のフィドルに効果を見ることができます。これは私が使用し、最小限のjs/jquery
コードである(アイテムの幅がスクリプトにハードコードされていないので、もちろんコードも最適化することができます)
$(function() {
var gallery = $('#gallery ul'),
items = gallery.find('li'),
len = items.length,
current = 1, /* the item we're currently looking */
first = items.filter(':first'),
last = items.filter(':last'),
triggers = $('button');
/* 1. Cloning first and last item */
first.before(last.clone(true));
last.after(first.clone(true));
/* 2. Set button handlers */
triggers.on('click', function() {
var cycle, delta;
if (gallery.is(':not(:animated)')) {
cycle = false;
delta = (this.id === "prev")? -1 : 1;
/* in the example buttons have id "prev" or "next" */
gallery.animate({ left: "+=" + (-100 * delta) }, function() {
current += delta;
/**
* we're cycling the slider when the the value of "current"
* variable (after increment/decrement) is 0 or when it exceeds
* the initial gallery length
*/
cycle = !!(current === 0 || current > len);
if (cycle) {
/* we switched from image 1 to 4-cloned or
from image 4 to 1-cloned */
current = (current === 0)? len : 1;
gallery.css({left: -100 * current });
}
});
}
});
});
前に述べたように、このソリューションは、本当に多くの努力を必要とせず、ループなしで通常のスライダーに、このアプローチを比較すると、パフォーマンスの話、それが唯一のスライダーが初期化されるときに、2つの追加のDOMの挿入を行うことが必要であり、いくつか(かなりtriv ial)後方/前方ループを管理する余分なロジック。
私は、より簡単な方法やより良い方法が存在するかどうかはわかりませんが、これがとにかく役立つことを願っています。
注:あなたも応答ギャラリーを持っている必要がある場合は、多分this answerはあまりにも
詳細な説明ありがとうございます! – user1828928
@ user1828928あなたがライブの例に興味があるなら、私は短いフィドルを作成しました – fcalderan
最初の旗は残念です。私はここでウィキの状態についてあなたが正しいので、ワイヤーがそこに横たわったと思う。 –