一.实现原理

    (1)将所有图片放在一个父容器div里面,通过display属性来设置图片的出现与隐藏;

    (2)轮播图分为手动轮播和自动轮播;

        手动轮播的重点是每次点击图片下方的小圆圈,获得它的索引号,并让与之对应索引号的图片显示,并且此时的小圆圈为高亮显示;

        自动轮播:利用定时器setInterval(),来每隔一定的时间来播放一次图片。

    (3)所有的基础知识:dom操作,定时器,事件运用。

二.轮播图页面布局:     

<div id="content">   <!-- 总的父容器 -->

      <div class="carousel-inner">  <!-- 包含图片的容器 -->
      	    <div class="item "><img src="./img/lunbo1.jpg" alt="第一张图片"></div>
            <div class="item"><img src="./img/lunbo2.jpg" alt="第二张图片"></div>
            <div class="item"><img src="./img/lunbo3.jpg" alt="第三张图片"></div>
      </div>
      
  	 <!-- 图片下方的指示圆圈-->
  	 <ul class="carousel-indicators">
  	 	<li id='pic1'>●</li>
  	 	<li id='pic2'>●</li>
  	 	<li id='pic3'>●</li>
  	 </ul>
  	 
  	 <!-- 图片左右方来回滚动图片的左右箭头-->
  	 <a href="#" class="carousel-control prev"><span><</span></a>
  	 <a href="#"  class="carousel-control next"><span>></span></a>
  	 
  </div>

三.轮播图的css样式:

   #content{
    width: 100%;
    height:500px;
    position: relative;
}
.carousel-inner{
    position: relative;
    width: 100%;
    overflow: hidden; 
    height:500px; 
}

.carousel-inner>.item>img{
   display: block; 
    line-height: 1;   
    z-index: 1;
}

.carousel-indicators{
    position: absolute;
    bottom:10px;
    left:45%;
    z-index: 2;
    list-style-type: none;
}
.carousel-indicators li{
    display:inline-block;
    padding: 0 15px;
    font-size: 24px;
    color:#999;    
    cursor: pointer;
    z-index: 2;
      
}
 .active1{
    font-size: 28px;
    color:#fff;
}
.carousel-control{
    position: absolute;
    text-decoration:none;
    color: #999;
    font-weight: bold;
    opacity: .5;
    font-size: 40px;
    z-index: 3;

}
.carousel-control:hover{
    color:fff;
    text-decoration: none;
    opacity: .9;
    outline: none;
    font-size: 42px;
}

.prev{
    top: 30%;   
    left:20px; 
}
.next{
    top:30%;
    right: 20px;
}

四.轮播图的js实现代码:

window.onload = function(){
	
	//轮播初始化
	  var lunbo  = document.getElementById('content');
	  var imgs = lunbo.getElementsByTagName('img');	 
	  var uls = lunbo.getElementsByTagName('ul');
          var lis = lunbo.getElementsByTagName('li');

      //初始状态下,一个圆圈为高亮模式

	      lis[0].style.fontSize = '26px';
	      lis[0].style.color = '#fff';

	  //定义一个全局变量,用来进行自动轮播图片顺序的变化
	      var pic_index = 1;

	 //自动轮播.使用pic_time记录播放,可以随时使用clearInterval()清除掉。
	     var pic_time =  setInterval(autobofang,3000);

       //手动轮播
	    for(var i=0;i<lis.length;i++){      	
      	    lis[i].addEventListener("mouseover",change,false);

            }
     
    
      function change(event){  

             var event=event||window.event;
             var target=event.target||event.srcElement; 
             var children = target.parentNode.children;           
		  	 for(var i=0;i<children.length;i++){
		  	 	 if(target == children[i]){	  		     
		  		        picChange(i);   
		  		   }              
              
		  			
		  	  }
  	     } 
  	     //图片切换函数
  	     function picChange(i){   

  	     	//让所有图片都不显示,所有圆圈都为普通样式	
  	     	for(var j=0;j<imgs.length;j++){
		  		    imgs[j].style.display = 'none';		           	                            lis[j].style.fontSize = '24px';
		  		    lis[j].style.color = '#999';
		  		}

             //让选中的索引的图片显示,对应的圆圈高亮  
		   imgs[i].style.display = 'block'; 	  		   	   	
		   lis[i].style.fontSize = '26px';
		   lis[i].style.color = '#fff';		   	  
		  		   	 
  	     }
         
         //自动播放的事件处理
	     function autobofang(){
	     	
	     	if(pic_index >= lis.length){
	    		pic_index = 0;
	    	}

	    		change1(pic_index);
	    		pic_index++;
	      }
	     //自动播放的图片转化中的事件
	    function change1(index){	  	 		
                  
		  	 picChange(index);

                  //鼠标移入ul标签,自动播放图片暂停

		  	  uls[0].addEventListener("mouseover",pause,false);

		   //鼠标移出ul标签,自动播放图片继续

		  	  uls[0].addEventListener("mouseout",go,false);
		  	       
		}
       
       //自动播放暂停函数

       function pause(event){
       	    var event=event||window.event;
            var target=event.target||event.srcElement;
            switch(target.id){
            	case "pic1":
                    
                    clearInterval(pic_time);          
                    

            	break;
            	case "pic2":
                        
                      clearInterval(pic_time);
            	  

            	break;
            	case "pic3":
                    
            	     clearInterval(pic_time);
                     

            	break;
            }
       	   
       }
     
        //自动播放图片继续函数

         function go(event){
       	    var event=event||window.event;
            var target=event.target||event.srcElement;                  
            switch(target.id){
            	case "pic1":
                       
            	      pic_index = 1;  
            	      pic_time =  setInterval(autobofang,3000);
		  	         

            	break;
            	case "pic2":

                   pic_index = 2;                     
                   pic_time = setInterval(autobofang,3000);

            	break;
            	case "pic3":

            	    pic_index = 3;            	     
                    pic_time = setInterval(autobofang,3000);           	

            	break;
            }
       	   
       }
       }

五.效果图:

js实现图片轮播图(一)_轮播图js实现图片轮播图(一)_轮播图_02六.遇到的问题与不足

    问题:当鼠标第一次移入ul标签时,自动轮播图片停止,鼠标移出,自动轮播继续,但是随着运行,轮播图片的变化速度越来越快,而且这时点击ul标签已经不起作用了。     

    问题原因:在后面停止轮播后再次轮播开始使用定时器的时候,没有给赋值给pic_time来记录,也就没有再次鼠标移到ul标签而清除定时器,因此导致再次点击ul标签不能暂停自动轮播播放,而且速度 越来越快。

    不足:没有实现类似淘宝轮播图那样平滑过渡的无现滚动的效果,左右箭头的指示作用也没有完成。这些在后期会继续学习,继续来完善,来分享.