js计时器案例--实现拖拽滚动

一、效果图

二、实现思路

  • 第一步:使用循环计时器和一次性计时器实现图片轮播的动画效果。
  • 第二步:设置鼠标进入,动画停止,鼠标离开,动画继续。
  • 第三步:设置鼠标按下进行拖拽,然后检测用户鼠标移动的差值 ,大于图片一半宽, 直接下一张,小于一半直接返回当前的图片。
  • 第四步:遍历图片底下的小按钮,鼠标进入到那个权,当前圈变红并且出现对应的图片。

三、核心代码

    var timer,Item,Box,sx,ex,cha,List;
    var speed=3000;
    //记录当前是哪一张
    var count = 0;
    //每一张动画的宽度
    var maxWidth = 800;
    var isup=false;
    var isdefault;
	window.onblur=function(){
        clearInterval(timer);
    }
    window.onfocus=function(){
        addAnimate();
    }
    window.onload=function(){
        Item=document.querySelector(".item");
        Box=document.querySelector(".box");
        List=document.querySelector(".list").children;
        //复制ul里面的第一个li添加进去
        Item.appendChild(Item.children[0].cloneNode(true));
        isdefault=List[0];
        //默认启动动画
        addAnimate();

        //List遍历添加鼠标进入事件
        for(var i=0;i<List.length;i++){
            List[i].index=i;
            List[i].onmouseenter=function(){
                if(isdefault)
                    isdefault.classList.remove("ck");
                this.classList.add("ck");
                isdefault=this;
                count=this.index;
                Item.style.transform="translateX("+(-count*maxWidth)+"px)";
            }
        }
        //鼠标进入停止动画,离开添加动画
        Box.onmouseenter=function(){
            clearInterval(timer);
        }
        Box.onmouseleave=function(){
            addAnimate();
            if(isup){
                //默认触发onmouseup事件
                var event=document.createEvent("MouseEvents");
                event.initEvent("mouseup",false,false);
                this.dispatchEvent(event);
            }
        }
        Box.onmousedown=function(e){
            //移除动画类
            Item.classList.remove("translate");
            //记录初始点x坐标
            sx= e.layerX;
            isup=true;
            e.preventDefault();
            this.addEventListener("mousemove",moveHandle);
        }
        Box.onmouseup=function(){
            //添加动画类
            Item.classList.add("translate");
            isup=false;
            this.removeEventListener("mousemove",moveHandle);
            //检测用户鼠标移动的差值  大于一半  直接下一张  小于一半直接回去
            if(cha){
                var absCha=Math.abs(cha);
                if(absCha>=maxWidth/2){
                    List[count>=Item.children.length-1?0:count].classList.remove("ck");
                    if(cha<0){
                        count++;
                    }
                    else{
                        count--;
                    }
                }
                animteLoad();
            }
        }
        //move的方法
        function moveHandle(e){
            ex= e.layerX;
            cha=ex-sx;
            //根据差值检测处理
            //大于0处理
            if(cha>0&&count==0){
                count=Item.children.length-1;
            }
            var trans=-count *maxWidth+cha;
            Item.style.transform="translateX("+trans+"px)";
        }
    }
    //计时器的动画方法
    function addAnimate(){
        timer=setInterval(function(){
            //检测ul是否具有translate类
            if(!Item.classList.contains("translate"))
                Item.classList.add("translate");
            //移除之前的ck类
            List[count].classList.remove("ck");
            count++;
            animteLoad();
        },speed)
    }
    //图片动画切换(动画完成)方法
    function animteLoad(){
        List[count >= Item.children.length - 1 ? 0 : count].classList.add("ck");
        Item.style.transform="translateX("+(-count*maxWidth)+"px)";
        //一次性计时器卡每张动画完成(每次最后一张刚出来,立马把整个ul重新放到最后)
        setTimeout(function(){
            if(count>=Item.children.length-1){
                Item.classList.remove("translate");
                count=0;
                Item.style.transform="translateX(0px)";
            }
        },500);
    } 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南初️

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

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

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

打赏作者

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

抵扣说明:

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

余额充值