以天天生鲜中index.html页面中的幻灯片为例,代码如下,需要结合index.html页面的代码多看看
原理:幻灯片的几张图都是以绝对定位的方式放在页面的一个位置,叠加在一起 $(function(){ var $slides = $('.slide_pics li'); //定义有多少张图片,这里有4张 var len = $slides.length; var nowli = 0; //将要运动过来的li,就是你点击想看的图片li,序列号从0开始算起 var prevli = 0; //当前要离开的li var $prev = $('.prev'); //给左边的箭头定义变量 var $next = $('.next'); //右边的箭头定义变量 var ismove = false; var timer = null; //定义一个定时器的占位符 //每个li的宽度是760,这里把除了第一个图之外的所有图都放到右边 $slides.not(':first').css({left:760}); // $slides.each(function(index, el) { var $li = $('<li>'); //创建li标签,就是下面的滚动点 if(index==0) //设定第一个li的样式是高亮的 { $li.addClass('active'); } $li.appendTo($('.points')); //实现把<li>滚动点附加到页面中 }); $points = $('.points li'); //选中4个点 timer = setInterval(autoplay,4000);//定时器4秒放一次图片,实现幻灯片自动播放 //实现把鼠标放在幻灯片上时,停止播放,鼠标移开后继续播放 $('.slide').mouseenter(function() { clearInterval(timer); //消除定时器 }); $('.slide').mouseleave(function() { timer = setInterval(autoplay,4000); }); //幻灯片自动播放,其实就是和右箭头绑定事件一样 function autoplay(){ nowli++; move(); $points.eq(nowli).addClass('active').siblings().removeClass('active'); } //在滚动点上绑定事件,使点击滚动点的时候可跳到相应幻灯片 $points.click(function(event) { if(ismove) { return; } nowli = $(this).index(); //选取想要移动的图片的索引值 //消除重复点击选择图片li点时,出现的bug if(nowli==prevli) { return; } $(this).addClass('active').siblings().removeClass('active'); //选中的点颜色会变化 move(); //move函数来定义运动,在后面定义的有,就是function move() }); //左箭头绑定事件 $prev.click(function() { if(ismove) { return; } nowli--; move(); $points.eq(nowli).addClass('active').siblings().removeClass('active'); //箭头使图片移动的同时,下面的点也要相应移动 }); //右箭头绑定事件 $next.click(function() { if(ismove) { return; } nowli++; move(); $points.eq(nowli).addClass('active').siblings().removeClass('active'); }); //move函数处理所有的运动 //当快速点击箭头时,会出现一些图片显示的问题,解决方法:可以在所有的animate()前面加上stop() //例如:$slides.eq(nowli).stop().animate({left:0},800,'easeOutExpo') function move(){ ismove = true; if(nowli<0) //在第一张图片上还想左移的情况 { nowli=len-1; //让第4张图片从左边过来 prevli = 0 $slides.eq(nowli).css({left:-760}); //把第4张图片先放在左边 $slides.eq(nowli).animate({left:0},800,'easeOutExpo'); //然后放在原先图片1的位置 $slides.eq(prevli).animate({left:760},800,'easeOutExpo',function(){//原先图片1的位置右移 ismove = false; }); prevli=nowli; return; //不执行下面的条件判断语句 } //在第4张图片时,还想按右移箭头时 if(nowli>len-1) { nowli = 0; //出来的图片应该是第一张图 prevli = len-1; $slides.eq(nowli).css({left:760}); $slides.eq(nowli).animate({left:0},800,'easeOutExpo'); $slides.eq(prevli).animate({left:-760},800,'easeOutExpo',function(){ ismove = false; }); prevli=nowli; return; //return的作用是不执行下面的条件语句 } if(prevli<nowli) //看图片按从小到大顺序的时候,比如从第一个到第二个 { $slides.eq(nowli).css({left:760}); //先把大号的图放右边 $slides.eq(prevli).animate({left:-760},800,'easeOutExpo');//把小号图左边放 $slides.eq(nowli).animate({left:0},800,'easeOutExpo',function(){ //再把大号图放在原先小号图的位置 ismove = false; }); prevli=nowli; //nowli的值一直变的,这里把nowli值赋值给preli } //从大到小看图片 else { $slides.eq(nowli).css({left:-760}); $slides.eq(prevli).animate({left:760},800,'easeOutExpo'); $slides.eq(nowli).animate({left:0},800,'easeOutExpo',function(){ ismove = false; }); prevli=nowli; } } })