轮播图第二代(已封装)

<!DOCTYPE html>
<html lang="en">
<head>
    <!--
   @作者:@全体人员
   @时间:2022-08-25 13:49:53
   @功能:
   -->
    <style>
        .tim-view{
            width: 600px;
            height: 300px;
            border-radius: 10px;
        }
    </style>
    <meta charset="UTF-8">
    <title>轮播图(封装)</title>
</head>
<body>
    <div id="vi" class="tim-view">
        <img src="imgs1/img.png">
        <img src="imgs1/img_1.png">
        <img src="imgs1/img_2.png">
        <img src="imgs1/img_3.png">
        <img src="imgs1/img_4.png">
        <img src="imgs1/img.png">
        <img src="imgs1/img_1.png">
        <img src="imgs1/img_2.png">
        <img src="imgs1/img_3.png">
        <img src="imgs1/img_4.png">
    </div>
<script>
    //两种方法调用 1传配置对象 2传视图id
    let config={
        id:"vi",
        timeDelay:400,
        timeFastDelay:200,
        timeSpace:10,
        timeDelayMax:405,
        intervalTime:3000,
        backConfig:false,
        pointConfig:true,
        buttonConfig:true
    }
    //createSwiper('vi');
    createSwiper(config);
    function createSwiper(config){
        //元素id
        let elementId;
        //当前页数
        let nowPages=0;
        //正常动画时间,需要与过渡动画的时间一致或者适当大些。
        let timeDelay=400;
        //加速动画时间,需要与过渡的时间保持一致或者更大些。
        let timeFastDelay=200;
        //使得计时器隔开不冲突,如果冲突导致图片显示不正常可以调高该数值。
        let timeSpace=10;
        //节流器的时间设置,可以与过渡时间一样,但是最好比它大一点。
        let timeDelayMax=timeDelay+5;
        //定时器
        let timer=null;
        //定时滚动时间
        let intervalTime=3000;
        //配置是否将第一张图设置为背景图,前提是第一张是img且src属性是图片。
        let backConfig=false;
        //配置是否需要下面的小点点
        let pointConfig=true;
        //配置两边的按钮
        let buttonConfig=true;
        //初始化参数
        if(typeof config=='object'){
            initData(config);
        }else {
            elementId=config;
        }
        if(!elementId){
            throw "没有指定视图元素,请添加视图元素的id";
        }
        let view=document.getElementById(elementId);
        if(!view){
            throw "找不到指定的元素!";
        }
        let imgs=Array.from(document.getElementById(elementId).children);
        let points=new Array();
        let viewWidth=view.clientWidth;
        //生成唯一类名
        let className="item-fast"+(new Date()).valueOf();
        init();
        function initData(configObj){
            if(configObj.id){
                elementId=configObj.id;
            }
            if(configObj.timeDelay){
                timeDelay=configObj.timeDelay;
            }
            if(configObj.timeFastDelay){
                timeFastDelay=configObj.timeFastDelay;
            }
            if(configObj.timeSpace){
                timeSpace=timeSpace;
            }
            if(configObj.timeDelayMax){
                timeDelayMax=configObj.timeDelayMax;
            }
            if(configObj.intervalTime){
                intervalTime=configObj.intervalTime;
            }
            if(configObj.backConfig || configObj.backConfig===false){
                backConfig=configObj.backConfig;
            }
            if(configObj.pointConfig || configObj.pointConfig===false){
                pointConfig=configObj.pointConfig;
            }
            if(configObj.buttonConfig || configObj.buttonConfig===false){
                buttonConfig=configObj.buttonConfig;
            }
        }
        function init(){
            let viewHeight=view.clientHeight;
            if(viewWidth==0 || viewHeight==0){
                return;
            }
            console.log(viewHeight,viewWidth)
            if(imgs.length<3){
                return;
            }
            //添加全局类名到style里面
            let style=document.querySelectorAll("head>style")[0];
            if(!style){
                let head=document.querySelectorAll("head")[0];
                if(!head){
                    throw "你的网页连head头都没有!";
                }
                let st=document.createElement("style");
                head.appendChild(st);
                style=st;
            }
            //初始化css
            let styleText=".tim-com{position: relative !important;overflow: hidden !important;user-select: none;}";
            styleText+=".tim-item{width: 100%;height: 100%;display: inline-block;position: absolute;left:0;top:0;transition-timing-function: ease-in-out;}\n";
            styleText+=".tim-but{width: 100%;height: 30px;position: absolute;text-align: center;bottom: 0;}\n";
            styleText+=".tim-point{display: inline-block;width: 8px;height: 8px;border-radius: 50%;background-color: #888;cursor: pointer;margin: 2px;}\n";
            styleText+=".tim-but-select{background-color: blue;}\n";
            styleText+=".tim-but-icon{display: inline-block;width: 25px;height: 25px;line-height: 25px;text-align: center;color: white;top:50%;border-radius: 50%;position: absolute;background-color: rgba(219,151,151,0.3);margin: 0 5px;cursor: pointer;}\n";
            styleText+=".tim-but-icon:hover{background-color: rgba(219,151,151,0.8);}\n";
            styleText+=".tim-but-right{right: 0;}\n";
            styleText+=".tim-item-none{transition: all 0s !important;}";
            style.innerHTML=style.innerHTML+styleText;
            let classCont="."+className+"{transition: all "+timeFastDelay/1000+"s !important;}\n";
            style.innerHTML=style.innerHTML+classCont;
            view.classList.add("tim-com");
            //初始化
            for(let i=0;i<imgs.length;i++){
                imgs[i].classList.add("tim-item");
                imgs[i].style.left=viewWidth*(i-1)+"px";
                imgs[i].addEventListener("mouseenter",pauseInterval);
                imgs[i].addEventListener("mouseleave",startInterval);
                imgs[i].style.transition="all "+timeDelay/1000+"s";
            }
            //设置背景图片,防止遇到卡顿,直接无显示的状态。
            if(backConfig){
                if(imgs[0].src){
                    view.style.backgroundImage="url("+imgs[0].src+")";
                    view.style.backgroundSize=""+viewWidth+"px"+" "+viewHeight+"px";
                }
            }
            if(pointConfig){
                let but=document.createElement("div");
                but.className="tim-but";
                //添加小点点
                for(let i=0;i<imgs.length;i++){
                    let point=document.createElement("span");
                    point.className="tim-point";
                    point.addEventListener("click",delayStrike(i));
                    point.addEventListener("mouseenter",pauseInterval);
                    point.addEventListener("mouseleave",startInterval);
                    if(i==0){
                        point.classList.add("tim-but-select");
                    }
                    points.push(point);
                    but.appendChild(point);
                }
                view.appendChild(but);
            }
            if(buttonConfig){
                //添加左边按钮
                let element=document.createElement("div");
                element.classList.add("tim-but-icon");
                element.innerText="<";
                element.addEventListener("click",delayStrike(-1));
                element.addEventListener("mouseenter",pauseInterval);
                element.addEventListener("mouseleave",startInterval);
                view.appendChild(element);
                //添加右边按钮
                element=document.createElement("div");
                element.classList.add("tim-but-icon");
                element.classList.add("tim-but-right");
                element.innerText=">";
                element.addEventListener("click",delayStrike(-2));
                element.addEventListener("mouseenter",pauseInterval);
                element.addEventListener("mouseleave",startInterval);
                view.appendChild(element);
            }
            //开启定时器
            startInterval();
        }
        function pauseInterval(){
            clearInterval(timer);
        }
        function startInterval(){
            timer=setInterval(()=>{
                delayStrike(-2)();
            },intervalTime);
        }
        function delayStrike(x){
            //节流
            let timerDelay=null;
            return function() {
                if(timerDelay) return;
                if(x==-1){
                    moveRight();
                }else if(x==-2) {
                    moveLeft();
                }else{
                    locationPoint(x);
                }
                timerDelay=setTimeout(()=>{
                    clearTimeout(timerDelay);
                    timerDelay=null;
                },timeDelayMax);
            }
        }
        function addPointColor(x){
            //给小点点加颜色
            for(let i=0;i<points.length;i++){
                points[i].classList.remove("tim-but-select");
            }
            if(points[x]){
                points[x].classList.add("tim-but-select");
            }
        }
        function locationPoint(x){
            //点小点点
            if(x-nowPages>0){
                moveRange(x-nowPages,1);
            }else {
                moveRange(nowPages-x,-1);
            }
        }
        function moveRange(range,direction){
            //控制方向、距离
            let temp=0;
            for(let i=0;i<range;i++){
                setTimeout(()=>{
                    if(direction>0){
                        for (let k=1;k<=2;k++){
                            imgs[k].classList.add(className);
                        }
                        moveLeft(timeFastDelay);
                    }else {
                        for (let i=0;i<2;i++){
                            imgs[i].classList.add(className);
                        }
                        moveRight(timeFastDelay);
                    }
                },(timeFastDelay+timeSpace)*i);//+timeSpace使得计时器隔开不冲突。
            }
        }
        function moveLeft(time=timeDelay){
            //向左移动
            for (let i=3;i<imgs.length;i++){
                imgs[i].classList.add("tim-item-none");
            }
            imgs[0].classList.add("tim-item-none");
            imgs[0].style.left=(viewWidth*(imgs.length-2))+"px";
            for(let i=1;i<imgs.length;i++){
                let left=imgs[i].style.left;
                left.replaceAll("p","");
                left.replaceAll("x","");
                left=parseInt(left)-viewWidth;
                imgs[i].style.left=left+"px";
            }
            setTimeout(()=>{
                for (let k=1;k<=2;k++){
                    imgs[k].classList.remove(className);
                }
                for (let i=3;i<imgs.length;i++){
                    imgs[i].classList.remove("tim-item-none");
                }
                imgs[0].classList.remove("tim-item-none");
                moveLeftArr();
            },time);
            nowPages=(nowPages+1)%imgs.length;
            addPointColor(nowPages);
        }
        function moveLeftArr(){
            //数组转换
            let img=imgs[0];
            for(let i=1;i<imgs.length;i++){
                imgs[i-1]=imgs[i];
            }
            imgs[imgs.length-1]=img;
        }
        function moveRight(time=timeDelay){
            //给其他的图片加瞬变动画
            for (let i=2;i<imgs.length;i++){
                imgs[i].classList.add("tim-item-none");
            }
            imgs[imgs.length-1].style.left=-viewWidth+"px";
            for(let i=imgs.length-2;i>=0;i--){
                let left=imgs[i].style.left;
                left.replaceAll("p","");
                left.replaceAll("x","");
                left=parseInt(left)+viewWidth;
                imgs[i].style.left=left+"px";
            }
            nowPages--;
            if(nowPages<0){
                nowPages=imgs.length-(-nowPages);
            }
            addPointColor(nowPages);
            setTimeout(()=>{
                for (let i=0;i<2;i++){
                    imgs[i].classList.remove(className);
                }
                for (let i=2;i<imgs.length;i++){
                    imgs[i].classList.remove("tim-item-none");
                }
                moveRightArr();
            },time);
        }
        function moveRightArr(){
            let img=imgs[imgs.length-1];
            for(let i=imgs.length-1;i>=1;i--){
                imgs[i]=imgs[i-1];
            }
            imgs[0]=img;
        }
    }
</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值