以天天生鲜中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;		
		}

	}
})

  

版权声明:本文为regit原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/regit/p/9014414.html