js轮播图

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

<script>

    //封装的图片预加载

    var loadImg=(function () {

        return{

            //图片的预加载,输入要加载图片的数组,加载完成后抛出去(抛发形式)

            loadImage:function (arr,callback) {

                var img=new Image();

                img.arr=arr;//以便在侦听函数中调用数组

                img.list=[];//图片加载完成要存放的数组

                img.num=0;

                img.callback=callback;

                img.addEventListener("load",loadImg.loadHandler);

                img.src=arr[img.num];//从数组的第一项开始加载图片

            },

            //侦听事件函数

            LOAD_IMAGE_FINISH:"load_image_finish",//如果没有回调函数,就用静态方法(常量)

            loadHandler:function () {

                this.list.push(this.cloneNode(false));//this是被侦听的对象img,将图片放到list数组中

                this.num++;//图片加载完一张加载下一张

                if(this.num===this.arr.length){

                    if(this.callback){//如果存在回调函数,同过回调函数返回出去加载完成的图片数组list

                        this.callback(this.list);

                        return;//图片加载完成返回出去

                    }

                    var evt=new Event(loadImg.LOAD_IMAGE_FINISH);

                    evt.list=this.list;

                    document.dispatchEvent(evt);//事件抛发的形式将图片加载完成抛发出去

                    return;//图片加载完成返回出去

                }

                this.src=this.arr[this.num];

            }

        }

    })();

 

    //写一个创建元素的函数:创建什么元素,放在哪里,内容是什么,样式是什么

    function createElem(elem,parent,content,style) {

        var ele=document.createElement(elem);

        if(parent){

            parent.appendChild(ele);

        }

        if(ele==="input"){

            ele.value=content;

        }else if(elem==="img"){

            ele.src=content;

        }else{

            if(content){

                var text=document.createTextNode(content);

                ele.appendChild(text);

            }

        }

        if(style){

            setStyle(ele,style);

        }

        return ele;

    }

    //设置元素的样式

    function setStyle(elem,css) {

        //样式是一个对象:类似下面这种,可以遍历

        /*var divStyle={

           width:"100px",

           height:"120x",

           border:"1px solid #000000"

            };*/

        for(var str in css){

            elem.style[str]=css[str];

        }

    }

 

    var rollImage,imgCon,ul,preLi;

    //rollImage最外面的大容器

    //imgCon放图片的小容器

    //轮播的大图

    var arr = ["image/a.jpeg", "image/b.jpeg", "image/c.jpeg", "image/d.jpeg", "image/e.jpeg"];

    //左右按钮

    var bnArr = ["image/left.png", "image/right.png"];

    //小图

    var icon = ["image/icon_a.jpeg", "image/icon_b.jpeg", "image/icon_c.jpeg", "image/icon_d.jpeg", "image/icon_e.jpeg"];

    var imgList;//加载出来的轮播图片放在里面

    var bnList;//加载的左右按钮图片放在里面

    var iconList;//加载的小图片放在里面

    var position=0;//轮播的位置,就是轮播到第几张图

    var direction;//图片轮播的方向

    var bool=false;

    var autoBool=false;

    var time=120;

    //    loadImage(arr);//加载图片

    loadImg.loadImage(arr,loadImageFinish);//加载图片

    function loadImageFinish(list) {

        imgList=list;

        loadImg.loadImage(bnArr,loadBnFinish);

    }

    function loadBnFinish(list) {

        bnList=list;

        loadImg.loadImage(icon,loadIconFinish);

    }

    function loadIconFinish(list) {

        iconList=list;

        init();//初始化函数

    }

    function init() {

        animation();

        createRollImage();//再初始函数中创建

        creatLi();

        changeLi();

        imgCon.appendChild(imgList[0]);

        imgList[0].style.width=rollImage.offsetWidth+"px";

        imgList[0].style.height=rollImage.offsetHeight+"px";

        rollImage.addEventListener("mouseleave",mouseHandler);

        rollImage.addEventListener("mouseenter",mouseHandler);

    }

    //创建框架

    function createRollImage() {

        var divStyle={

            width:"960px",

            height:"320px",

            margin:"auto",

            position:"relative",

            overflow:"hidden"

        };

        var imgConStyle={

            position:"absolute",

            height:"320x"

        };

        var ulStyle={

            position:"absolute",

            listStyle:"none",

            bottom:"30px",

            dispaly:"none"

        };

        var leftStyle={

            position:"absolute",

            left:"5px"

        };

        var rightStyle={

            position:"absolute",

            right:"5px"

        }

        leftStyle.top=rightStyle.top=(parseInt(divStyle.height)-bnList[0].height)/2+"px";

        rollImage=createElem("div",document.body,"",divStyle);//创建最外面的大容器

        imgCon=createElem("div",rollImage,"",imgConStyle);//放图片的小容器

        ul=createElem("ul",rollImage,"",ulStyle);

        for(var i=0;i<bnList.length;i++){

            rollImage.appendChild(bnList[i]);

            setStyle(bnList[i],i===0 ? leftStyle : rightStyle);

            bnList[i].addEventListener("click",bnClickHandler);

        }

    }

    //创建小图

    function creatLi() {

        var liStyle={

          width:"108px",

          height:"67px",

          marginLeft:"1px",

          float:"left"

        };

        for(var i=0;i<imgList.length;i++){

            var li=createElem("li",ul,"",liStyle);

            li.num=i;

            li.appendChild(iconList[i]);

            li.addEventListener("click",liClickHandler);

        }

        ul.style.left=(rollImage.offsetWidth-ul.offsetWidth)/2+"px";

    }

    //左右按钮点击事件

    function bnClickHandler(e) {

        if(bool) return;

        if(this===bnList[0]){

            direction="right";

            position--;

            if(position<0) position=imgList.length;

        }else if(this===bnList[1]){

            direction="left";

            position++;

            if(position===imgList.length) position=0;

        }

        creatNext();

    }

    //小图点击事件

    function liClickHandler(e) {

        if(bool) return;

        if(this.num===position) return;

        direction=this.num>position ? "left" : "right";

        position=this.num;

        creatNext();

    }

    function mouseHandler(e) {

        if(e.type==="mouseleave"){

            autoBool=true;

        }else if(e.type==="mouseenter"){

            autoBool=false;

            time=120;

        }

    }

    function creatNext() {

        imgList[position].style.width=rollImage.offsetWidth+"px";

        imgList[position].style.height=rollImage.offsetHeight+"px";

        imgCon.style.width=rollImage.offsetWidth*2+"px";

        if(direction==="left"){

            imgCon.appendChild(imgList[position]);

            imgCon.style.left="0px";

        }else if(direction==="right"){

            imgCon.insertBefore(imgList[position],imgCon.firstElementChild);

            imgCon.style.left=-rollImage.offsetWidth+"px";

        }

        bool=true;

    }

    function changeLi() {

        if(preLi){

            preLi.style.border="0";

        }

        preLi=ul.children[position];

        preLi.style.border="1px solid #ff0000";

    }

    //图片轮播的速度

    function animation() {

        requestAnimationFrame(animation);

        autoPlay();

        if(!bool) return;

        if(direction==="left"){

            imgCon.style.left=imgCon.offsetLeft-20+"px";

            if(imgCon.offsetLeft<-rollImage.offsetWidth){

                imgCon.style.left=-rollImage.offsetWidth+"px";

                bool=false;

                direction="";

                imgCon.firstElementChild.remove();

                imgCon.style.left="0px";

            }

        }else if(direction==="right"){

            imgCon.style.left=imgCon.offsetLeft+20+"px";

            if(imgCon.offsetLeft>=0){

                imgCon.style.left="0px";

                bool=false;

                direction="";

                imgCon.lastElementChild.remove();

            }

        }

        changeLi();

    }

    function autoPlay() {

        if(!autoBool) return;

        time--;

        if(time===0){

            direction="left";

            position++;

            if(position===imgList.length) position=0;

            time=120;

            creatNext();

        }

    }

</script>

</body>

</html>

结果截图:(不点击时自动轮播)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值