轮播图详解


在网上看了一个轮播器,挺感兴趣的,自己用原生JS做了下,起初有很多bug,计时器的问题,大图层级问题,小图移动问题...最后通过视频以及大神的博客算是做成了,总结一下心得,其中的运动框架startMove在上一篇有,就不在这里分享啦

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <link rel="stylesheet" type="text/css" href="css/style.css"/>
        <script src="js/sport.js"></script>
        <script type="text/javascript">
            var currentImgIndex = 0;  //当前图片下标
            var maxZindex = 1; //层级
            window.onload = function(){
                //获取所有元素
                var btnPrev = document.getElementById("btn_prev"); //左按钮
                var btnNext = document.getElementById("btn_next"); //右按钮
                var markLeft = document.getElementById("mark_left"); //左区域
                var markRight = document.getElementById("mark_right"); //右区域
                
                //给左右按钮区域添加鼠标移入移出事件 移入时透明度为100,移出时透明度为0
                //startMove 是完美运动框架
                //左边按钮移入事件
                btnPrev.onmouseover = markLeft.onmouseover = function(){
                    startMove(btnPrev,{opacity:100});  //左边按钮的透明度设为100
                };
                //左边按钮移出事件
                btnPrev.onmouseout = markLeft.onmouseout = function(){
                    startMove(btnPrev,{opacity:0});  //左边按钮的透明度设为0
                };
                //右边按钮输入事件
                btnNext.onmouseover = markRight.onmouseover = function(){
                    startMove(btnNext,{opacity:100});  //右边按钮的透明度设为100
                };
                //右边按钮输出事件
                btnNext.onmouseout = markRight.onmouseout = function(){
                    startMove(btnNext,{opacity:0});  //右边按钮的透明度设为0
                };
                
                //获取上下div里的li 以及下面的ul
                
                //获取小图Div中的li
                var smallLi = document.getElementById("small_pic").getElementsByTagName('li');
                //获取大图Div中的li
                var bigLi = document.getElementById("big_pic").getElementsByTagName("li");
                //获取小图的UL
                var smallUl = document.getElementById("small_UL");
                //给smallUl的宽度赋值 = 一个小图的宽度 * 小图的数量
                smallUl.style.width = smallLi[0].offsetWidth * smallLi.length  + 'px';
                
                for(var i = 0; i < smallLi.length; i ++){
                    smallLi[i].index = i;                //给smallLi设置索引值
                    smallLi[i].onmouseover = function(){//给smallLi(下面的小图)添加鼠标移入事件,移入时透明度为100
                        startMove(this,{opacity : 100});
                    };
                    smallLi[i].onmouseout = function(){//给smallLi(下面的小图)添加鼠标移出事件,移入时透明度为50
                        if(this.index == currentImgIndex){//如果是当前图片时,鼠标移出时不触发
                            return;
                        }
                        startMove(this,{opacity : 50});
                    };
                    smallLi[i].onclick = function(){//给smallLi(下面的小图)添加鼠标移出事件,点击时让当前图片下标为this.index
                        currentImgIndex = this.index;
                        tabImg();
                        autotab();
                    };
                }
                
                //给左边按钮添加点击事件
                btnPrev.onclick = function(){
                    currentImgIndex --; //当前的下标递减
                    if(currentImgIndex < 0){  //如果当前下标小于0
                        currentImgIndex = smallLi.length -1;  //将数组中最后一个下标赋给当前下标变量
                    }
                    //切换图片
                    tabImg();
                    autotab();
                };
                
                //给右边按钮添加点击事件
                btnNext.onclick = function(){
                    currentImgIndex ++; //当前下标递增
                    if(currentImgIndex > (smallLi.length -1)){ //如果当前下标大于最大下标
                        currentImgIndex = 0; //将0下标赋给当前下标变量
                    }
                    //切换图片
                    tabImg();
                    autotab();
                };
                
                var timer = 0;
                autotab();
                function autotab(){
                    clearInterval(timer);
                    timer = setInterval(function(){
                    currentImgIndex ++; //当前下标递增
                    if(currentImgIndex > (smallLi.length -1)){ //如果当前下标大于最大下标
                        currentImgIndex = 0; //将0下标赋给当前下标变量
                    }
                    //切换图片
                    tabImg();
                    },5000);
                }
                
                //轮播器在没有任何事件触发时的效果
                //1.根据currentImgIndex 来决定切到哪张图片显示
                //2.下面小图透明度都为50,除了当前大图里显示的那张图
                //3.下面ul在运动过程left值的问题
                function tabImg(){
                    //当前显示的大图增加层级,显示在最上面
                    bigLi[currentImgIndex].style['z-index'] = ++ maxZindex;
                    //遍历smallLi,使小图透明度都为50    
                    for(var i = 0; i < smallLi.length; i ++){
                        startMove(smallLi[i],{opacity : 50});
                    }
                    //当前的小图透明度为100
                    startMove(smallLi[currentImgIndex],{opacity:100});
                    //移动缩略图
                    if(currentImgIndex == 0){ //如果当前下标为0
                        startMove(smallUl,{left:0});  //将小图的UL的left值设为0
                    }else if (currentImgIndex == (smallLi.length - 1)){ //如果当前下标 ==最后一个下标
                        startMove(smallUl,{left:- (smallLi.length - 3) * smallLi[0].offsetWidth}); //取最后三张小图的宽度
                    }else{  //取当前小图和左右、共三张小图的宽度
                        startMove(smallUl,{left: - (currentImgIndex - 1) * smallLi[0].offsetWidth});
                    }
                }
            };
        </script>
    </head>
    <body>    
        <div id="playimages" class="play">
            <ul id="big_pic" class="big_pic">
                <div id="btn_prev" class="prev"></div>
                <div id="btn_next" class="next"></div>
                
                <a id="mark_left" class="mark_left" href="javascript:;"></a>
                <a id="mark_right" class="mark_right" href="javascript:;"></a>
                
                <li style="z-index: 1;"><img src="img/1.jpg" /></li>
                <li><img src="img/2.jpg" /></li>
                <li><img src="img/3.jpg" /></li>
                <li><img src="img/4.jpg" /></li>
                <li><img src="img/5.jpg" /></li>
                <li><img src="img/6.jpg" /></li>
            </ul>
            <div id="small_pic" class="small_pic">
                <ul id="small_UL" style="width:390px;">
                    <li style="filter:100;opacity: 1;"><img src="img/1.jpg" /></li>
                    <li><img src="img/2.jpg" /></li>
                    <li><img src="img/3.jpg" /></li>
                    <li><img src="img/4.jpg" /></li>
                    <li><img src="img/5.jpg" /></li>
                    <li><img src="img/6.jpg" /></li>
                </ul>
            </div>
        </div>
    </body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值