簡単なアプローチは次のとおりです。
function ticker(el, duration) {
if (!el) {
return false;
}
else {
el = typeof el === 'object' ? el : $(el);
duration = duration || 500;
$(el).find('li').first().slideUp(duration, function() {
$(this)
.insertAfter($(this).nextAll('li').last())
.fadeIn(duration, function(){
ticker(el, duration);
});
});
}
}
これを jQuery オブジェクトで呼び出すことができます。
ticker($('#ticker'));
JS フィドルのデモ。
または、指定された期間 (ミリ秒単位) でプレーンな DOM ノードを使用します。
ticker(document.getElementById('ticker'), 300);
JS フィドルのデモ。
OPが残したコメントに応えて(以下のコメントで):
この解決策は、最初の項目を上にスライドさせ、最後の項目でフェード インします。しかし、最初と次のアイテムの両方でフェード+スライドが必要です。リストは一度に 1 つの項目だけが表示されるようにスタイル設定されています。
animate()
リスト要素の高さ/不透明度をアニメーション化するために使用して、これを提供します。
function ticker(el, duration) {
if (!el) {
return false;
}
else {
el = typeof el === 'object' ? el : $(el);
duration = duration || 500;
var first = el.find('li').first(),
last = first.nextAll().last(),
h = last.height();
first.animate({
height: 0,
opacity: 0
}, duration, function() {
$(this).insertAfter(last).animate({
height: h,
opacity: 1
}, duration, function() {
ticker(el, duration);
});
});
}
}
JS フィドルのデモ。
OPからの明確化に従って、次のように編集されました。
function ticker(el, duration) {
if (!el) {
return false;
}
else {
el = typeof el === 'object' ? el : $(el);
duration = duration || 500;
var lis = el.find('li').css('display', 'none');
lis.first().fadeIn(duration, function(){
$(this).slideUp(duration, function(){
$(this).insertAfter(lis.last());
ticker(el, duration);
});
});
}
}
JS フィドルのデモ。
参考文献: