欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

纯JS实现轮播图特效——详解

程序员文章站 2022-07-02 21:21:24
CSS部分 布局效果图: JS部分 ......
   <div id="slider">
            
            <div id="sliderimgs">
                <img src="img/mi04.jpg" width="1000px"/>
                
                <img src="img/mi01.jpg" width="1000px" title="oneimg"/>
                <img src="img/mi02.jpg" width="1000px" title="twoimg"/>
                <img src="img/mi03.jpg" width="1000px" title="threeimg"/>
                <img src="img/mi04.jpg" width="1000px" title="fourimg"/>
                
                <img src="img/mi01.jpg" width="1000px"/>
                
                <!--因为要做无缝滚动,所以要克隆第一张和最后一张,放到最后一张后面和最前面-->
            </div>
            
            <div id="buttons">
                <ul>
                    <li class="active"></li>
                    <li></li>
                    <li></li>
                    <li></li>
                </ul>
            </div>
<div> <span id="prev">&lt;</span> <span id="next">&gt;</span> </div>
</div>

css部分

<style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            /*禁止html元素别被鼠标选中,必须要写不然会有bug,--start*/
            *{
                moz-user-select: -moz-none;
                -moz-user-select: none;
                -o-user-select:none;
                -khtml-user-select:none;
                -webkit-user-select:none;
                -ms-user-select:none;
                user-select:none;
            }    
            /*禁止html元素别被鼠标选中--end*/
            
            #slider{
                width: 1000px;                /*设置为图片宽度*/
                height: 376px;                /*设置为图片高度*/
                margin: 0 auto;
                margin-top: 100px;
                overflow: hidden;
                position: relative;
                /*border: 2px solid palegreen;*/
            }
            #sliderimgs{
                width: 600%;                /*几张图片就是  6*100%  */
                position: absolute;            /*必须设置绝对定位,才能使用left属性*/
                left: -1000px;                /*把第一张假图偏移出去*/                    
                /*border: 1px solid blue;*/
            }
            #sliderimgs img{
                float: left;
            }
            
            
            #buttons{
                width: 70px;
                position: absolute;
                z-index: 1;                /*设置图片堆叠属性,仅限于定位的元素使用。默认值为0,值越大,优先级越高*/
                bottom: 10px;
                left: 45%;
                background-color: rgba(255,255,255,0.4);
                
                padding-top: 4px;
                padding-bottom: 4px;
                border-radius: 9px;                    /*高度一半 = 8px + 10px (li的height) */
                /*border: 2px solid red;*/
            }
            #buttons ul{
                list-style-type: none;
            }
            #buttons ul li{
                float: left;
                margin-left: 6px;
                width: 10px;
                height: 10px;
                line-height: 10px;
                border-radius: 100%;
                background-color: #ffffff;
            }
            #buttons ul li:hover{
                cursor: pointer; /*手型光标*/
                background-color:#ff5000;
            }
            #buttons .active{
                background-color: #ff5000;
            }
            #next , #prev{
                position: absolute;
                z-index: 1;
                top: 43%;
                color: rgba(255,255,255,.9);
                font-family: "微软雅黑";
                font-size: 25px;
                text-align: center;
                display: block;
                width: 40px ;
                height: 40px;
                line-height: 40px;
                border-radius: 100%;
                background-color: rgba(0,0,0,.4);
                transition: width 0.3s ,height 0.3s ,line-height 0.3s ,border-radius 0.3s, text-align 0.3s ,ease 0.3s ;
            }
            #prev{
                left: 5%;
            }
            #next{
                right: 5%;
            }
            #next:hover{
                cursor: pointer; /*手型光标*/
                
                width: 44px;
                height: 44px;
                line-height: 44px;
                border-radius:100%;
                text-align: center;
            }
            #prev:hover{
                cursor: pointer; /*手型光标*/
                
                width: 44px;
                height: 44px;
                line-height: 44px;
                border-radius:100% ;
                text-align: center;
            }
        </style>

布局效果图:

纯JS实现轮播图特效——详解

 

 

js部分

<script type="text/javascript">
            var doc = document;
            var sliderid = doc.getelementbyid('slider');
            var sliderimgsid = doc.getelementbyid('sliderimgs');
            var imgs = sliderimgsid.getelementsbytagname('img');
            var btnli = doc.getelementbyid('buttons').getelementsbytagname('li');
            var btnprev = doc.getelementbyid('prev');
            var btnnext = doc.getelementbyid('next');
            
            var imgslength = imgs.length-2;                    //减去2个假图
            var btnlilength = btnli.length;
            var imgwidth = sliderid.clientwidth;            //获取图片宽度
            var imganimatetimer = null;                        //图片animate定时器
            var aotuplaytimer = null;                        //自动播放定时器
            var index = 0;                                    //当前图片默认为第一张
            var speed = 0;                                  //动画速度,这个数必须是能被图片宽度500整除的。正负表示偏移方向
            
            /*非常重要*/
            var isanimate = false;                            //图片是否在动画状态。若在动画状态,此时动画没结束, 则不执行下一个动画。

            sliderimgsid.style.left = -imgwidth+"px";        //初始化为第一张真图
            
            btnprev.onclick = function(){
                if(isanimate == false){        //图片不在动画状态才执行
                    imganimate(imgwidth);
                    index--;
                    if(index<0){
                        index = imgslength-1;
                    }
                    selectbtn();
                }
            }
            btnnext.onclick = function(){
                if(isanimate == false){
                    imganimate(-imgwidth);
                    index++;
                    if(index>imgslength-1){
                        index = 0;
                    }
                    selectbtn();
                }
            }
            
            
            
            for(var i = 0 ; i<btnlilength;i++){
                btnli[i].index = i;
                btnli[i].onclick = function(){
                    var totargetimgoffset = (index - this.index)*imgwidth;    //负数sliderimgsid向左偏转,反之,向右
                    if(totargetimgoffset == 0){return;}
                    
                    if(isanimate == false){
                        imganimate(totargetimgoffset);                        //方法的参数是局部参数
                        index = this.index;
                        selectbtn();
                    }                    
                    
                }
            }
            
            function selectbtn(){
                for(var i = 0; i < btnlilength; i++){
                    if(btnli[i].classname == "active"){
                        btnli[i].classname = "";
                        break;
                    }
                }
                btnli[index].classname = 'active'; 
            }
            
            
            /*动画函数*/
            function imganimate(offset){
                var newleft = parseint(sliderimgsid.style.left) + offset;            //sliderimgsid.style.left永远获取都是当前图片偏移量
                var alltime = 400;                                                    //完成offset偏移量,总共所用时间。offset路程一定,时间越短,速度越快。此时间必须小于autoplay间隔时间,否则,图片运动还没结束,imganimate()再次被调用
                var interval = 20;                                                    //定时器的间隔时间,值越小越好,因为越大,动画越卡
                var speed = offset/(alltime/interval);                                //speed正负由offset决定
                
                isanimate = true;                                                    //图片动画开始
                clearinterval(imganimatetimer);
                imganimatetimer = setinterval(function(){
                    sliderimgsid.style.left = parseint(sliderimgsid.style.left)+speed +"px";
                    /* 第一种情况:当speed<0时,(即图片向左运动时)
                     * 如果当前图片left值 , left只会越来越小 , 当小于等于newleft , 则停止图片运动
                     * 第二种情况:当speed>0时,(即图片向右运动时)
                     * 如果当前图片的left , left只会越来越大 , 大于等于newleft , 则停止图片运动
                     * */
                    if( speed<0 && parseint(sliderimgsid.style.left)<= newleft || speed>0 && parseint(sliderimgsid.style.left) >= newleft){
                        clearinterval(imganimatetimer);                    //到达指定newleft位置停止动画
                        isanimate = false;                                //动画执行结束
                        
                        /*重新定位-- 让图片无限循环 --start*/
                        if(newleft > -imgwidth){
                            sliderimgsid.style.left = -imgslength*imgwidth +"px" ;
                            return;
                        }
                        if(newleft < -imgslength*imgwidth){                
                            sliderimgsid.style.left = -imgwidth +"px" ;
                            return;
                        }
                        sliderimgsid.style.left = newleft+"px";
                        /*重新定位--  让图片无限循环  --end*/
                        
                        /*图片运动结束后。清除上一次定时器时间*/
                        window.onload();
                    }
                },interval);
            }
            
            
            window.onload = function(){
                if(isanimate==false){
                    clearinterval(aotuplaytimer);
                    aotuplaytimer = setinterval(function(){
                        btnnext.onclick();
                    },5000);                                //图片每格5s移动一次
                }
            }
            /*鼠标移入sliderid事件*/
            sliderimgsid.onmouseover = function(){
                clearinterval(aotuplaytimer);
            }
            /*鼠标移出sliderid事件*/
            sliderimgsid.onmouseout =function(){
                window.onload();
            }
            
 </script>