jQuery:FadeIn和FadeOut li并重新开始
我正在尝试获取一个列表淡入并按顺序淡出每个li,然后在显示最后一个li后重新开始。
- One
- Two
- Three
这当然不起作用,它同时淡入淡出。
$('.ul li').hide(); var i = 1; while(i < 4){ $('ul li:nth-child('+i+')').delay(1000).fadeIn(1000); $('ul li:nth-child('+i+')').fadeOut(100); i++; }
你可以这样做:
function showTheList() { var i = 1; function showOne() { if (i === 1) $('.ul li').hide(); $('ul li').eq(i-1).delay(1000).fadeIn(1000, function() { $('ul li').eq(i-1).fadeOut(100, function() { if (++i > 4) i = 1; showOne(); }); }); } showOne(); }
该函数所做的是设置另一个函数来完成基于索引变量“i”显示一个
元素的工作。 当“i”为1时,它首先隐藏所有
元素。 然后它启动动画以淡入其中一个元素,然后将其淡出,最后在淡出完成后的回调中,它会增加“i”并再次启动。
这是一个jsfiddle。 请注意,我使用“.eq()”而不是“nth-child”来减少混乱。 否则,这不会做任何非常奇怪的事情。
你正在描述幻灯片,所以让我们制作一个简单的幻灯片插件!
$.fn.ezslide = function () { var $this = this, // cache this cur = 0, // current slide index // our fading function fadeIt = function( which ) { var li = $this.find('li'); // cache list items // reset index when reaching end of list items cur = which = (which >= li.length) ? 0 : which; li.fadeOut(100); li.eq( which ).delay(100).fadeIn(1000, function(){ // after fadeIn complete, call fadeIt again after a delay setTimeout(function() { cur++; fadeIt( cur ); }, 3000); }); }; // init fadeIt( cur ); }; $('ul').ezslide();
这是一个小提琴的例子。
现在让我们使用一些选项扩展这个简单的插件,以便我们可以轻松更改设置:
$.fn.ezslide = function ( options ) { var defaults = { fadeIn : 1000, fadeOut : 100, delay : 3000 }, settings = $.extend( defaults, options ), $this = this, cur = 0, fadeIt = function( which ) { var li = $this.find('li'); cur = which = (which >= li.length) ? 0 : which; li.fadeOut( settings.fadeOut ); li.eq( which ) .delay( settings.fadeOut ) .fadeIn( settings.fadeIn, function(){ setTimeout(function() { cur++; fadeIt( cur ); }, settings.delay); }); }; fadeIt( cur ); }; $('ul').ezslide({ fadeIn : 600, fadeOut : 450, delay : 1500 });
这是我们新的小提琴示例。
CSS
ul li { display: none; }
HTML
- One
- Two
- Three
JS
var i = 0; function iteratelist() { var list = $('ul li'); list.eq(i).delay(1000).fadeIn(1000).fadeOut(100, function() { i++; if(i % list.length == 0) { i = 0; } iteratelist(); }); } iteratelist();
使用mod运算符,以便您可以轻松更改将来的项目数,而无需更新此JS函数。
这是一个很好的做法,从display:none开始,以避免在页面加载时显示一秒钟,特别是如果您要在文档内部调用此函数。