使用javascript实现简单的轮播图效果

最近在做公司的网站,有一个轮播图的功能,网上倒是有现成的js组件,我用了一下swiper,但是发现嵌入进去时不太好用,好在公司的网站要求也不是很高,索性就使用纯的js做一下呗。

1.首先新建一个html页面,先把简单的布局做出来

我的html部分如下


<body>
		<div class="wrap" id="wrap">
			<ul class="pics" id="pic">
				<li>
					<img src="img/banner1.jpg" />
				</li>
				<li>
					<img src="img/banner2.jpg" />
				</li>
				<li>
					<img src="img/banner3.jpg" />
				</li>
			</ul>
			<ol class="listNum" id="listNum">
				<li class="active"><span>0</span></li>
				<li><span>1</span></li>
				<li><span>2</span></li>
			</ol>
		</div>
	</body>

就做一个轮播图,为一个div,,其中轮播图中用到的三个图片用ul, 下面的ol 为轮播图索引的数字

接下来,就是对此布局进行css的样式,思路就是 外层div(wrap)的宽度跟图片li的宽度设置一样,然后整个wrap部分的overflow设置为hidden, 设置为不可见,(我这里是最简单的轮播图的实现,很适合初学者的使用)就用到了display属性的none和block的切换来实现轮播图,其他的用绝对定位,或者margin值做也是可以的,但我这里用最简单的实现,下面是我的css部分

<style>
			*{
				margin: 0;
				padding: 0;
			}
			.wrap{
				width: 1000px;
				height: 400px;
				border: 1px solid black;
				margin: 100px auto;
				overflow: hidden;
				position: relative;
			}
			.wrap ul{
				list-style: none;
			}
			.wrap ul li{
				width: 100%;
				height: 400px;
			}
			.wrap img{
				width: 100%;
				height: 100%;
			}
			.listNum{
				position: absolute;
				bottom: 5px;
				left: 45%;
			}
			.listNum li{
				display: inline-block;
				border: 1px solid black;
				width: 15px;
				height: 15px;
				border-radius: 15px;
				background-color: yellow;
			}
			.listNum li:hover{
				cursor: pointer;
				background-color: red;
			}
			.listNum li span{
				display: none;
			}
			.listNum .active{
				background-color: red;
			}
		</style>

这里html部分和css部分不是重点,我这里不做说明了。


终点是接下来的javascript部分,先贴上完整的javascript代码部分

<script>
			var timer = null;
			var index = 0;
			var wrap = null;
			var pic = null;
			var pics = null;
			var listNum = null;
			var listNumLi = null;
			
			var timer1 = null;
			var timer2 = null;
			window.onload = function(){
				//alert("开始");
				wrap = document.getElementById("wrap");
				pic = document.getElementById("pic");
				pics = pic.getElementsByTagName("li");
				listNum = document.getElementById("listNum");
				listNumLi = listNum.getElementsByTagName("li");
				//默认轮播图的第一个数字
				
				timer1 = setInterval(autoPlay, 5000);
				
				//出了轮播图
				wrap.onmouseout = function(){
					console.log("消失了");
					timer2 = setInterval(autoPlay, 5000);
				}
				
				//数字索引的鼠标进入时间
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].idx = i;
					listNumLi[i].onmouseover = function(){
						clearInterval(timer1);
						clearInterval(timer2);
						index = this.idx;
						changePic(this.idx);
					}
				}
				//进入轮播图
				wrap.onmousemove = function(){
					console.log("进入了");
					clearInterval(timer1);
					clearInterval(timer2);
				}
				
			}
			
			function autoPlay(){
				//alert("之前的index:"+index);
				if(++index >= pics.length){
					//alert("进来了吧index:"+index);
					index = 0;
				}
				//alert("之后的index:"+index);
				changePic(index);
			}
			function changePic(idx){
				for(var i=0;i<pics.length;i++){
					pics[i].style.display = "none";
				}
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].className = "";
				}
				//alert("idx:"+idx);
				pics[idx].style.display = "block";
				listNumLi[idx].className = "active";
			}
		</script>

这里用到了js的定时器,说到定时器,先来了解一下js中的两种定时器,

1.setTimeout(function, interval)

2.setInterval(function, interval)

这里直接粘一下网友写的区别吧


关于js中两种定时器的设置及清除

1、JS中的定时器有两种:

window.setTimeout([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法[function],当方法执行完成定时器停止(但是定时器还在,只不过没用了);

window.setInterval([function],[interval]) 设置一个定时器,并且设定了一个等待的时间[interval],当到达时间后,执行对应的方法[function],当方法执行完成,定时器并没有停止,以后每隔[interval]这么长的时间都会重新的执行对应的方法[function],直到我们手动清除定时器为止;

2、JS中的定时器是有返回值的:->返回值是一个数字,代表当前是第几个定时器

   var timer1=window.setTimeout(function(){},1000);  //timer1->1 当前是第一个定时器
   var timer2=window.setTimeout(function(){},1000);  //timer2->2 当前是第二个定时器
   window.clearTimeout(timer1); //->把第一个定时器清除掉,这里也可以用window.clearInterval(timer1)、window.clearTimeout(1)、window.clearInterval(timer1);
  var timer3=window.setTimeout(function(){},1000);   //timer3->3 当前是第三个定时器 ,虽然上面的定时器timer1清除掉了,但是号还是继续往后排的;
 

3、清除定时器:

window.clearInterval(timer1)/window.clearTimeout(time1);两种清除方式都可以清除通过setTimeout和setInterval设置的定时器(两种方式在设置定时器的时候有区别,清除定时器的时候没有区别),并且参数不仅可以是timer,还可以是其返回值,例如1,2;需要注意的是,定时器即使清除了,其返回值也不会清除,之后设置的定时器的返回值也会在其返回值的基础上继续向后排,这点类似于银行的排队领号,即使1号的业务办理完了,后边的人仍是从2号开始继续领号,而不是重新从1开始;


总结:setTimeout 用一次(主要用于延时做某件事)

   setInterval  主要用来循环做某件事 

两者的使用场景不同, 这里粘一下 上面的地址:http://www.cnblogs.com/wangying731/p/5164780.html


好了说完定时器,下面就来说一说我这里轮播图的实现吧!


一。我这里用到的是过程式编程,没有用到抽象式编程

二。刚开始都是使用js来获取一些元素,这里不做介绍

三。分步骤实现

1.先实现 循环轮播

init()函数中的 这一句:

timer1 = setInterval(autoPlay, 5000);

function autoPlay(){
				//alert("之前的index:"+index);
				if(++index >= pics.length){
					//alert("进来了吧index:"+index);
					index = 0;
				}
				//alert("之后的index:"+index);
				changePic(index);
			}
			function changePic(idx){
				for(var i=0;i<pics.length;i++){
					pics[i].style.display = "none";
				}
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].className = "";
				}
				//alert("idx:"+idx);
				pics[idx].style.display = "block";
				listNumLi[idx].className = "active";
			}

 使用定时器先将 pics中的所有图片隐藏,在使用索引index来定时显示 图片 每执行一次index的值通过++index 加1   这里使用index++不行 这里的index为全局变量

这样简单的自动轮播的功能就出来了,


接下来,再做图片索引的鼠标移入事件,鼠标移入哪个索引值,就显示哪个图片,


//数字索引的鼠标进入时间
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].idx = i;
					listNumLi[i].onmouseover = function(){
						clearInterval(timer1);
						clearInterval(timer2);
						index = this.idx;
						changePic(this.idx);
					}
				}

接下来写wrap区域的鼠标一出事件,将 timer清理掉,我第一次在这里全篇只写了一个timer ,就是init()函数中创建的也是

timer = setInterval(autoPlay, 5000);

listNum鼠标移入事件中创建的也是timer = setInterval(autoPlay, 5000); 

所以在wrap区域的鼠标移除事件清楚地是timer ,具体代码如下:

<script>
			var timer = null;
			var index = 0;
			var wrap = null;
			var pic = null;
			var pics = null;
			var listNum = null;
			var listNumLi = null;
			
		
			window.onload = function(){
				//alert("开始");
				wrap = document.getElementById("wrap");
				pic = document.getElementById("pic");
				pics = pic.getElementsByTagName("li");
				listNum = document.getElementById("listNum");
				listNumLi = listNum.getElementsByTagName("li");
				//默认轮播图的第一个数字
				
				timer = setInterval(autoPlay, 5000);
				
				//出了轮播图
				wrap.onmouseout = function(){
					console.log("消失了");
					timer = setInterval(autoPlay, 5000);
				}
				
				//数字索引的鼠标进入时间
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].idx = i;
					listNumLi[i].onmouseover = function(){
						clearInterval(timer1);
						clearInterval(timer2);
						index = this.idx;
						changePic(this.idx);
					}
				}
				//进入轮播图
				wrap.onmousemove = function(){
					console.log("进入了");
					clearInterval(timer1);
					clearInterval(timer2);
				}
				
			}
			
			function autoPlay(){
				//alert("之前的index:"+index);
				if(++index >= pics.length){
					//alert("进来了吧index:"+index);
					index = 0;
				}
				//alert("之后的index:"+index);
				changePic(index);
			}
			function changePic(idx){
				for(var i=0;i<pics.length;i++){
					pics[i].style.display = "none";
				}
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].className = "";
				}
				//alert("idx:"+idx);
				pics[idx].style.display = "block";
				listNumLi[idx].className = "active";
			}
		</script>

这样做的后果是,有时候wrap区域的鼠标移入时,定时器没有清理掉,导致鼠标已经放上轮播图的图片了,但是定时器还在执行,就是过一会儿轮播图的图片还是会变,这样就不行。

因为init()函数中的timer和鼠标移入数字索引时创建的timer有可能不一样,故没有清理掉,所以在代码中这两处创建不同的timer,然后再清理的时候把这两个timer都清理掉。具体代码如下:(完整的javascript代码)


<script>
			var timer = null;
			var index = 0;
			var wrap = null;
			var pic = null;
			var pics = null;
			var listNum = null;
			var listNumLi = null;
			
			var timer1 = null;
			var timer2 = null;
			window.onload = function(){
				//alert("开始");
				wrap = document.getElementById("wrap");
				pic = document.getElementById("pic");
				pics = pic.getElementsByTagName("li");
				listNum = document.getElementById("listNum");
				listNumLi = listNum.getElementsByTagName("li");
				//默认轮播图的第一个数字
				
				timer1 = setInterval(autoPlay, 5000);
				
				//出了轮播图
				wrap.onmouseout = function(){
					console.log("消失了");
					timer2 = setInterval(autoPlay, 5000);
				}
				
				//数字索引的鼠标进入时间
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].idx = i;
					listNumLi[i].onmouseover = function(){
						clearInterval(timer1);
						clearInterval(timer2);
						index = this.idx;
						changePic(this.idx);
					}
				}
				//进入轮播图
				wrap.onmousemove = function(){
					console.log("进入了");
					clearInterval(timer1);
					clearInterval(timer2);
				}
				
			}
			
			function autoPlay(){
				//alert("之前的index:"+index);
				if(++index >= pics.length){
					//alert("进来了吧index:"+index);
					index = 0;
				}
				//alert("之后的index:"+index);
				changePic(index);
			}
			function changePic(idx){
				for(var i=0;i<pics.length;i++){
					pics[i].style.display = "none";
				}
				for(var i=0;i<listNumLi.length;i++){
					listNumLi[i].className = "";
				}
				//alert("idx:"+idx);
				pics[idx].style.display = "block";
				listNumLi[idx].className = "active";
			}
		</script>


这样下来,一个简单的轮播图效果就做完了,只包含两个简单的功能:

1.定时轮播

2.鼠标移入轮播图数字所以区域时,对应的图片显示

但是 用鼠标拖动图片的功能还没有,下次有机会再展示吧


不积跬步,无以至千里

不积小流,无以成江海

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值