js实现图片左右移动轮播

实现效果:
1.图片能够自动轮播.
2.移入图片时自动轮播停止,并且有左右两个箭头.
3.图片下方有一排按钮,可以点击进行切换,并且按钮的样式也随之切换.

代码如下:
html+css:

*{
            margin: 0;
            padding: 0;
        }
        html,body{
            width: 100%;
        }
        .container{
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
            width: 800px;
            height: 500px;
            overflow: hidden;
        }
        .list{
            position: absolute;
            width: 5600px;
            height: 500px;
            z-index: 1;
        }
        .list img{
            float: left;
            width: 800px;
            height: 500px;
        }
        .buttons{
            position: absolute;
            left: 50%;
            bottom: 20px;
            margin-left: -90px;
            width: 180px;
            text-align: center;
            cursor: pointer;
            z-index: 2;
        }
        .buttons span{
            display: inline-block;
            width: 20px;
            height: 20px;
            margin-right: 5px;
            border-radius: 50%;
            background: #aaa;
            border: 1px solid #fff;
        }
        .buttons span:last-child{
            margin-right: 0;
        }
        .buttons .on{
            background: #000;
        }
        .arrow{
            display: none;
            position: absolute;
            top: 230px;
            width: 40px;
            height: 40px;
            background: rgba(0,0,0,0.4);
            font-size: 40px;
            font-weight: bold;
            text-align: center;
            cursor: pointer;
            color: #fff;
            z-index: 2;
        }
        .container:hover .arrow{
            display: block;
        }
        #pre{
            left: 0;
        }
        #next{
            right: 0;
        }

js:

(function shuff(){
        function $(id) {
            return document.getElementById(id);
        }
        /*index是为了确定当前图层坐标,animated是为了使运动过程中的点击失效*/
        var list=$("list"),
            pre=$("pre"),
            next=$("next"),
            index=1,
            animated=true,
            timer,
            button=$("buttons"),
            buttons=$("buttons").getElementsByTagName("span"),
            container=$("container");
         /*
         *运动函数
         *time为图层转换一次的时间
         */
        function animate(len) {
            animated=false; 
            var newLeft=parseInt(list.style.left)+len;
            var time=300;
            var interval=10;
            var speed=len/(time/interval);
            (function move(){
                if ((speed>0&&parseInt(list.style.left)<newLeft)||(speed<0&&parseInt(list.style.left)>newLeft)) {
                    list.style.left=parseInt(list.style.left)+speed+"px";
                    setTimeout(move,interval);
                }else{
                    list.style.left=newLeft+"px";
                    if (newLeft>-800) {
                        list.style.left=-4000+"px";
                    }
                    if (newLeft<-4000) {
                        list.style.left=-800+"px";
                    }
                    animated=true;
                }
            })();
        }
        /*按钮点击样式变化*/
        function showButton(){
            for(var i=0;i<buttons.length;i++){
                buttons[i].className="";
            }
            buttons[index-1].className="on";
        }
        /*按钮点击函数*/
        function buttonListen(){
            if (!animated) {
                return;
            }
            var spanIndex=parseInt(this.getAttribute("index"));
            var diff=spanIndex-index;
            animate(diff*(-800));
            index=spanIndex;
            showButton();
        }
        /*自动轮播函数*/
        function play(){
            timer=setInterval(function(){
                nextListen();
            },3000);
        }
        /*暂停轮播函数*/
        function suspend(){
            clearInterval(timer);
        }
        /*左箭头点击函数*/
        function preListen(){
            if (!animated) {
                return;
            }
            if (index==1) {
                index=5;
            }else{
                index--;
            }
            animate(800);
            showButton();
        }
        /*右箭头点击函数*/
        function nextListen(){
            if (!animated) {
                return;
            }
            if(index==5){
                index=1;
            }else{
                index++;
            }
            animate(-800);
            showButton();
        }
        function start(){
            container.addEventListener('mouseenter',suspend,false);
            container.addEventListener('mouseleave',play,false);
            button.addEventListener('click',function(event){
                if (event.target&&event.target.tagName.toLowerCase()=="span") {
                        buttonListen.call(event.target);
                }
            },false);
            pre.addEventListener('click',preListen,false);
            next.addEventListener('click',nextListen,false);
            play();
        }   
        start();
    })();

思路:
1.为了左右移动轮播顺畅,所以第一张图前插上最后一张图,最后一张图插上第一张图.让所有图片float:left;每张图片的宽度设置为800;最外层为一个id为container的容器,设置它的宽为800,overflow:hidden;水平垂直居中.

2.animate(len)是运动函数,先计算出当前list的left值,time为滑过一张图总共所需的时间,interval是滑过一张图时每次滑动的时间,speed为每次移动的距离,当移动的距离小于len时,setTimeout(move,interval);当left距离小于4000时,图片回到原位.

function animate(len) {
            animated=false; 
            var newLeft=parseInt(list.style.left)+len;
            var time=300;
            var interval=10;
            var speed=len/(time/interval);
            (function move(){
                if ((speed>0&&parseInt(list.style.left)<newLeft)||(speed<0&&parseInt(list.style.left)>newLeft)) {
                    list.style.left=parseInt(list.style.left)+speed+"px";
                    setTimeout(move,interval);
                }else{
                    list.style.left=newLeft+"px";
                    if (newLeft>-800) {
                        list.style.left=-4000+"px";
                    }
                    if (newLeft<-4000) {
                        list.style.left=-800+"px";
                    }
                    animated=true;
                }
            })();
        }

3.创建animated的目的是当图片移动时,点击下方按钮和左右移动按钮无效.index是为了记录当前图片的索引,在每一个span按钮上也设置了index属性.在buttonListen函数中写入showButton()来渲染按钮.

function buttonListen(){
            if (!animated) {
                return;
            }
            var spanIndex=parseInt(this.getAttribute("index"));
            var diff=spanIndex-index;
            animate(diff*(-800));
            index=spanIndex;
            showButton();
        }

4.nextListen()为右箭头点击事件,每调用一次,index++,animate(-800),向右移动800,当index=5时,将index重置为1,并且也要调用showButton()对按钮进行渲染.
5.play()函数内创建一个setInterval,不间断调用nextListen,达到无限向右自动轮播的效果.

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值