JS原生轮播(JS篇)

接着上一篇,我接下来写关于JS的部分,我会按照我当时的思路一步一步的写,在最后附上全部的代码
一开始我打算写最简单的图片切换功能,怎么写呢?当我们点击左右箭头的时候是用改变left的值,有了思路就很好写了

    //首先我们要获取我们需要的属性和id

    var prev=document.getElementById("prev");
    var next=document.getElementById("next");
    var imgs=document.getElementById("contain_imgs");

    //之后我们要添加点击事件
    prev.onclick=function(){
        move(1024);
    }
    next.onclick=function(){
        move(-1024);
    }
    //我们将移动的方法写在move方法里
    function move(offset){
        var left=parseInt(imgs.style.left)+offset;
        imgs.style.left = left + 'px';//改变left的值
        //以下是判断图片如果变到第一个或最后一个时该如何做,图我方在下面
         if(parseInt(left)>-1024){
         imgs.style.left=-3072+"px";
            return;
        }
        if(parseInt(left)<-4096){
            imgs.style.left=-1024   +"px";
            return;
        }
    }

这里写图片描述
完成了这步,那下一步我们干什么呢?我准备做按钮,按钮的切换变色,和切换变图
也就是说我点了第一个按钮第一个按钮变成红色,表示我点击的,图片也切换到第一张,以此类推。
还有我点击箭头来切换图片时,我的按钮也跟着变色,一次这么多需要写那么该怎么写呢?

//首先我们先写最简单的,也就是当我们点击箭头来切换图片时下面的按钮会跟着变化,
//也就是说我们还需要向上面的click中写代码
var count=0;//用来定位按钮是第几个
var span=document.getElementsByTagName("span");//获取按钮
function showspan(){
        for(i=0;i<span.length;i++){
            if(span[i].className=='on')//一开始我们先消除带有on的,让所有按钮都没有
                span[i].className='';
        }
        span[count].className='on';之后根据计数,来锁定那个按钮需要加上on
    }
prev.onclick=function(){//这是左箭头的代码,右箭头的不再写了
        move(1024);
        if(count==0){//如果到头了,就回到最后一个
            count=3;
        }
        else
            count--;否则就减一
        showspan();
    }
//下一步,我们开始写按钮的点击事件
for (var i = 0; i < span.length; i++) {
        span[i].id=i;//先给每个按钮一个索引,方便定位
        span[i].onclick=function(){
            if(this.className=='on'){//如果点击的按钮本来就是选中的,则不做任何改变
            return;
            }
            index=this.id;//这里做一个计数器
            var offset=-1024*(index-count);//因为我们需要点按钮按钮便可以切换到相应的图片,所以
            //需要计算距离,也就是我们的偏移量,index代表我们点击图片的索引,count代表原来图片的索引
            move(offset);
            count=index;//我们再将图片索引重新定位到现在的位置
            showspan();
        }   

    }//这样我们按钮的就做完了

我们接下来就需要写自动播放功能,这个就简单多了,用定时器就可以

    var interval=3000;
    function play() {
                timer = setInterval(function () {
                    next.onclick();
                }, interval);
            }
    function stop() {
                clearInterval(timer);
            }

     contain.onmouseover = stop;//当鼠标移到图片上就停止移动
     contain.onmouseout = play;//移出就继续
        play();//执行函数

那么接下来便是最难的地方,便是动画效果,我们需要自己定义动画,也就是在之前的move函数中添加
动画效果

function move(offset){
        animated = true;//用来防止恶意点击动画的,最后来说
        var time = 1000;//设置动画总的时间
        var inteval = 10;//多长时间执行一次函数
        var speed = offset/(time/inteval);//我们是1024的宽,需要10步走完,就这个意思
        //相除便是速度,
        var left=parseInt(imgs.style.left)+offset;
        var amimate=function(){//动画部分

        if ( (speed > 0 && parseInt(imgs.style.left) < left) || (speed < 0 && parseInt(imgs.style.left) > left)) {//来判断我的动画是想往那边走,最多走一张图
                    imgs.style.left = parseInt(imgs.style.left) + speed + 'px';
                    //这就是动画在慢慢的加
                    setTimeout(amimate, inteval);//我们用递归一次次调用,直到if不成立
                }else{
                //如果不成立也就代表我们走完了一张图,
                    imgs.style.left = left + 'px';
                    if(parseInt(left)>-1024){
                    imgs.style.left=-3072+"px";
                        return;
                    }
                    if(parseInt(left)<-4096){
                    imgs.style.left=-1024   +"px";
                        return;
                    }
                     animated = false;
                }
        }

            amimate();
    }

完整代码

window.onload=function(){
    var prev=document.getElementById("prev");
    var next=document.getElementById("next");
    var imgs=document.getElementById("contain_imgs");
    var span=document.getElementsByTagName("span");
    var count=0;
    var timer;
    var interval=3000;
    var animated = false;
    function move(offset){
        animated = true;
        var time = 1000;
        var inteval = 10;
        var speed = offset/(time/inteval);
        var left=parseInt(imgs.style.left)+offset;
        var amimate=function(){

        if ( (speed > 0 && parseInt(imgs.style.left) < left) || (speed < 0 && parseInt(imgs.style.left) > left)) {
                    imgs.style.left = parseInt(imgs.style.left) + speed + 'px';
                    setTimeout(amimate, inteval);
                }else{
                    imgs.style.left = left + 'px';
                    if(parseInt(left)>-1024){
                    imgs.style.left=-3072+"px";

                    }
                    if(parseInt(left)<-4096){
                    imgs.style.left=-1024   +"px";

                    }
                     animated = false;
                }
        }

            amimate();
    }
    function showspan(){
        for(i=0;i<span.length;i++){
            if(span[i].className=='on')
                span[i].className='';
        }
        span[count].className='on';
    }
    prev.onclick=function(){
        if (animated) {
              return;
            }
        move(1024);
        if(count==0){
            count=3;
        }
        else
            count--;
        showspan();
    }
    next.onclick=function(){
        if (animated) {
              return;
            }
        move(-1024);
        if(count==3){
            count=0;
        }
        else
            count++;
        showspan();
    }

    for (var i = 0; i < span.length; i++) {
        span[i].id=i;
        span[i].onclick=function(){
            if(this.className=='on'){
            return;
            }
            index=this.id;
            var offset=-1024*(index-count);
            move(offset);
            count=index;
            showspan();
        }   

    }
    function play() {
                timer = setInterval(function () {
                    next.onclick();
                }, interval);
            }
    function stop() {
                clearInterval(timer);
            }

     contain.onmouseover = stop;
     contain.onmouseout = play;
        play();
}

其中的anmiated,设置成flase这样我们在判断时如果是false便不执行函数,这样我们在运动的时候就可以避免用户一直点击箭头
效果图
这里写图片描述
这里写图片描述
这里写图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小疯疯0413

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值