轮播那套

html

<div class="banner">
                      <div class="lunbo" id="box">
                        <div id="prev" class="prev"><svg t="1590475338509" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2799" width="40" height="40"><path d="M254.89 512l448-448 60.417 60.33-448 448L254.89 512z m60.843-60.757l453.291 453.376-60.33 60.33-453.377-453.376 60.416-60.33z" p-id="2800" fill="#e6e6e6"></path></svg></div>
                        <div id="next" class="next"><svg t="1590475430357" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3162" width="40" height="40"><path d="M769.11 512l-448 448-60.417-60.33 448-448L769.11 512z m-60.843 60.757l-453.291-453.376 60.33-60.33 453.377 453.376-60.416 60.33z" p-id="3163" fill="#e6e6e6"></path></svg></div>
                          
                                 <ul>
                                    <li>
                                        <img src="img/banner1.jpg" >
                                    </li>
                                     <li>
                                        <img src="img/banner2.jpg" >
                                    </li>
                                    <li>
                                       <img src="img/banner3.jpg" >
                                    </li>
                                    <li>
                                       <img src="img/banner1.jpg" >
                                    </li>
                                </ul>
                                <ol>
                                    <li class="current"></li>
                                       <li></li><li></li>
                                </ol>
                            </div>
        </div>

 

css

 .banner{
                            text-align: center;
                            position: relative;
                            height: 300px;
                            overflow: hidden;
                        }
                        .banner ul{
                            width: 400%;
                            position: absolute;
                            display: flex;
                        }
                        .banner ul li{
                            list-style: none;
                            width: 100%;
                            
                        }
                        ol{
                            position: absolute;
                            z-index: 10;
                            bottom: 10px;
                            left: 0;
                            right: 0;
                            margin: 0 auto;
                        }
                        ol li{
                            display: inline-block;
                            width: 20px;
                            height: 20px;
                            background-color: #003D85;
                            margin: 0 10px;
                            border-radius: 100px;
                        }
                        ol li.current{
                            background-color: #269D01;
                        }
                        .banner img{
                            width: 100%; 
                            height: 300px;
                        }
                        #prev,#next{
                            position: absolute;
                            z-index: 100;
                            top: 46%;
                            background-color: #999999;
                            border-radius: 100%;
                            padding: 5px;
                            
                        }
                        #prev{
                            left: 20px;
                        }
                        #next{
                            right:20px;
                        }

 

js

   var screen=document.getElementsByClassName("lunbo")[0]; //轮播图显示区域div
            var ul=document.querySelector('.lunbo ul'); //显示图片的ul
            var ol=document.getElementsByTagName("ol")[0]; //显示页码的ol
            var left=document.getElementById("prev"); //上一张箭头
            var right=document.getElementById("next"); //下一张箭头
            var index=0; ////声明一个变量记录图片的索引,默认第0张图片
        
            //2.给box添加鼠标移入和移出事件
            //2.1 鼠标移入
          /*  box.onmouseover= function () {
                arr.style.display="block"; //显示上一页下一页箭头
                clearInterval(timeId); //清除定时器(即鼠标移入时,图片要停止自动轮播)
            };
            //2.2 鼠标移出
            box.onmouseout= function () {
                arr.style.display="none"; //隐藏箭头
                timeId=setInterval(scroll,2000);  //重启定时器(鼠标移出,图片要恢复自动轮播)
            };
         */
            //3.给上一页下一页箭头添加点击事件
            //3.1 下一页,图片向左轮播
            right.onclick= function () {
                scroll();
            };
            //3.2 上一页,图片向右轮播
            left.onclick= function () {
                //(1)边界检测,如果当前已经是第一张,则不做任何处理
                if(index==0){
                    //无限轮播原理:如果当前是第一张,则偷偷修改ul的位置是最后一张(第一张与最后一张是同一张图片)
                    index=ul.children.length-1; //index恢复到最后一张
                    ul.style.left=-index*screen.offsetWidth+"px"; ////ul回到最后一张位置
                }
                //(2)索引自减
                index--;
                 // (3)向左移动ul:目标距离 = -screen的宽度 * 索引
                animationMove(ul,-index*screen.offsetWidth,10);
                indexShow(); //同步页码样式
            };
        
            //4.给页码添加点击事件
            for(var i=0;i<ol.children.length;i++){
                 //4.1 循环遍历数组时给每一个页码添加一个liIndex属性记录下标
                ol.children[i].liIndex=i;
                ol.children[i].onclick= function () {
                    index=this.liIndex-1;
                    scroll();
                };
            }
        
            var timeId=setInterval(scroll,3000);
            // 封装一个向右轮播的函数
            function scroll(){
                //(1)边界检测:如果当前已经是最后一张(第n+1张,n代表需要轮播的图片数量)
                if(index==ul.children.length-1){
                    //无限轮播的原理就是滚动到最后一张的时候,偷偷快速的改变ul的位置到第一张(不要任何动画,一瞬间改变)
                    index=0; //index恢复到0
                    ul.style.left=0+"px"; //ul回到初始位置
                }
                // (2)索引自增
                index++;
                // (3)向右移动ul:目标距离 = -screen的宽度 * 索引
                animationMove(ul,-index*screen.offsetWidth,10);
                indexShow(); //同步页码样式
            }
            //5.页码样式保持同步:排他思想(当前页码添加样式,其他页码移除该样式)
            function indexShow(){
                for(var i=0;i<ol.children.length;i++){
                    if(i==index){
                        ol.children[i].classList.add("current");
                    }else{
                        ol.children[i].classList.remove("current");
                    }
                    //特殊情况:当index为最后一张的时候,页码应该显示第一张
                    if(index==ul.children.length-1){
                        ol.children[0].classList.add("current");
                    }
                }
            }
            // 封装一个滚动动画函数
            function animationMove(obj,target,speed){
                clearInterval(obj.timeId);  //每次执行动画先清除原有的定时器
                obj.timeId=setInterval(function () {
                    var currentLeft=obj.offsetLeft; //获取当前位置
                   var isLeft=currentLeft>target?true:false;   //是否往左走
                   if(isLeft){
                       currentLeft-=10;    //往左走
                   }else{
                       currentLeft+=10;    //往右走
                   }
                   if(isLeft?currentLeft>target:currentLeft<target){
                      obj.style.left=currentLeft+"px";  //如果当前位置不是在目标位置则进行位置处理
                   }else{
                       clearInterval(obj.timeId);
                       obj.style.left=target+"px";
                   }
                   
                },speed);
            }
            

 面向对象版改:

 

    function Carousel(id){
                this.screen=document.getElementsByClassName(id)[0], //轮播图显示区域div
                this.ul=document.querySelector('.'+id+' ul'), //显示图片的ul
                this.ol=document.querySelector('.'+id+" ol"), //显示页码的ol
                this.left=document.querySelector('.'+id+" .prev"), //上一张箭头
                this.right=document.querySelector('.'+id+" .next"), //下一张箭头
                this.index=0, ////声明一个变量记录图片的索引,默认第0张图片
                this.timeId="",
                this.ultimer="",
                this.isLeft="",
                this.ulleft='',
                this.right.onclick=function(){
                     this.scroll();
                     console.log(this.right);
                }.bind(this);
                this.left.onclick=function(){
                    //(1)边界检测,如果当前已经是第一张,则不做任何处理
                    if(this.index==0){
                        //无限轮播原理:如果当前是第一张,则偷偷修改ul的位置是最后一张(第一张与最后一张是同一张图片)
                        this.index=this.ul.children.length-1; //index恢复到最后一张
                        this.ul.style.left=-this.index*this.screen.offsetWidth+"px"; ////ul回到最后一张位置
                    }
                    //(2)索引自减
                    this.index--;
                     // (3)向左移动ul:目标距离 = -screen的宽度 * 索引
                    this.animationMove(this.ul,-this.index*this.screen.offsetWidth,10);
                    this.indexShow(); //同步页码样式
                }.bind(this);

var that=this;
this.screen.addEventListener('mouseenter',function(){
console.log('ent')
that.stop()
})
this.screen.addEventListener('mouseleave',function(){
console.log('lev')
that.start()
})


            }
            Carousel.prototype.cliol=function(){
          for(var i=0;i<this.ol.children.length;i++){
                 //4.1 循环遍历数组时给每一个页码添加一个liIndex属性记录下标
                this.ol.children[i].liIndex=i;
                                 var that=this;
                this.ol.children[i].onclick= function () {
                                    
                    that.index= this.liIndex-1;
                                   
                    that.scroll(); 
                };
            }

 


            }
            Carousel.prototype.scroll=function(){
                //(1)边界检测:如果当前已经是最后一张(第n+1张,n代表需要轮播的图片数量)
                console.log(this)
                if(this.index==this.ul.children.length-1){
                    //无限轮播的原理就是滚动到最后一张的时候,偷偷快速的改变ul的位置到第一张(不要任何动画,一瞬间改变)
                    this.index=0; //index恢复到0
                    this.ul.style.left=0+"px"; //ul回到初始位置
                }
                console.log(this)
                // (2)索引自增
                this.index++;
                // (3)向右移动ul:目标距离 = -screen的宽度 * 索引
                
                this.animationMove(this.ul,-this.index*this.screen.offsetWidth,10);
                this.indexShow(); //同步页码样式
            }
            Carousel.prototype.indexShow=function(){
                console.log(this)
                for(var i=0;i<this.ol.children.length;i++){
                    if(i==this.index){
                        this.ol.children[i].classList.add("current");
                    }else{
                        this.ol.children[i].classList.remove("current");
                    }
                    //特殊情况:当index为最后一张的时候,页码应该显示第一张
                    if(this.index==this.ul.children.length-1){
                        this.ol.children[0].classList.add("current");
                    }
                }
            }
            // 封装一个滚动动画函数
            Carousel.prototype.animationMove=function(obj,target,speed){
                var c=-this.index*this.screen.offsetWidth;
                console.log("ani");
                console.log(this.ultimer);
                
                clearInterval(this.ultimer);  //每次执行动画先清除原有的定时器
                this.ultimer=setInterval(function () {
                    
                    this.ulleft=this.ul.offsetLeft; //获取当前位置
                   this.isLeft=this.ul.offsetLeft>c?true:false;   //是否往左走
                   
                   if(this.isLeft){
                       this.ulleft-=10;    //往左走
                     
                   }else{
                       this.ulleft+=10;    //往右走
                      
                   }
                   if(this.isLeft?this.ulleft>c:this.ulleft<c){
                       
                      this.ul.style.left=this.ulleft+"px";  //如果当前位置不是在目标位置则进行位置处理
                     
                   }else{
                       clearInterval(this.ultimer);
                      this.ul.style.left=c+"px";
                   }
                   
                }.bind(this),speed);
            }
            Carousel.prototype.init=function(){
                var that=this;
                this.timeId=setInterval(this.scroll.bind(this),5000);
                this.cliol();
            }

Carousel.prototype.stop=function(){
clearInterval(this.timeId)
}
Carousel.prototype.start=function(){
clearInterval(this.timeId)
this.timeId=setInterval(this.scroll.bind(this),5000);
}


创建实例,注.lunbo可替换,结构如上面html中的代码

var car1=new Carousel('lunbo');
            car1.init();

 

posted @ 2020-05-28 14:28  A-zero  阅读(157)  评论(0编辑  收藏  举报