JavaScript各类轮播图(二)

第二种

原理:把所有图片放在一侧,如:全部放在右侧,缓动到盒子中,在从盒子中缓动到左侧,在把左侧的图片放回右侧
//body部分

//具体细节请参照第一种,链接在文章尾部
    <div class="box">
        <div class="slider-content">
            <div><img src="images/1.jpg" alt="" /></div>
            <div><img src="images/2.jpg" alt="" /></div>
            <div><img src="images/3.jpg" alt="" /></div>
            <div><img src="images/4.jpg" alt="" /></div>
            <div><img src="images/5.jpg" alt="" /></div>
        </div>
        <div class="slider-control">
            <!-- <span class="slider-control-bar current"></span>
            <span class="slider-control-bar "></span>
            <span class="slider-control-bar "></span>
            <span class="slider-control-bar "></span>
            <span class="slider-control-bar "></span> -->
        </div>
        <span id="pre"></span>
        <span id="next"></span>
    </div>

//CSS样式

        *{
            margin: 0;
            padding: 0;
        }
        .box{
            width: 800px;
            height: 450px;
            position: relative;
            margin: 50px auto;
            overflow: hidden;
        }
        .box .slider-content{
            width: 800px;
            height: 400px;
        }
        .box .slider-content div{    //让图片全部脱标,便于处理
            position: absolute;
            top: 0;
            left: 0;
        }
        .box .slider-content img{
            width: 800px;
            height: 400px;
        }

        .box .slider-control{       //下标样式
            width: 800px;
            height: 50px;
            /*background-color: pink;*/
            text-align: center;
        }   
        .box .slider-control .slider-control-bar{      //此处的序列加背景图片
            display: inline-block;
            width: 32px;
            height: 5px;
            background: url(images/icon.png) no-repeat -32px -850px;
            /*background-size: 64px 5px;*/
            cursor: pointer;
            margin: 15px 20px 0 15px;
        }
        .box .slider-control .slider-control-bar:hover{
            background: url(images/icon.png) no-repeat -32px -830px;
        }
        .box .slider-control .slider-control-bar.current{
            background: url(images/icon.png) no-repeat 0px -830px;
        }

        #pre,#next{
            width: 20px;
            height: 35px;
            position: absolute;
            top: 40%;
            /*left: 0;*/
            background-color: red;
            cursor: pointer;
        }
        #pre{          //左右切换加背景图片和背景颜色,注意写法。
            left: 5px;
            padding: 5px;
            background: rgba(0,0,0,0.6) url(images/icon.png) no-repeat 5px 5px;
        }
        #next{
            right: 5px;
            padding: 5px;
            background: rgba(0,0,0,0.6) url(images/icon.png) no-repeat -5px -40px;
        }

重点:JS部分

window.onload = function(){
    var box = document.getElementsByClassName('box')[0];
    var content = document.getElementsByClassName('slider-content')[0];
    var imgArr = content.getElementsByTagName('div');
    var control = box.getElementsByClassName('slider-control')[0];
    var listArr = control.getElementsByTagName('span');
    var pre = document.getElementById('pre');
    var next = document.getElementById('next');
    var imgWidth = imgArr[0].offsetWidth;

    for(var i = 0; i < imgArr.length; i++){    //在控制栏中创建序列
        var bar = document.createElement('span');
        if(i == 0){       //创建的第一序列给添加背景颜色
            bar.className = 'slider-control-bar current';
        }else{
            bar.className = 'slider-control-bar';
        }               
        control.appendChild(bar);

        bar.index = i;
        bar.onclick = function(){         //序列的点击事件
            if(currentIndex > this.index){         //如果当前的索引比点击的序列大时,把点击的序列对应的图片放在盒子左侧,当前的图片右移,然后点击序列对应的图片右移 left:0
                imgArr[this.index].style.left = -imgWidth + 'px';
                animate(imgArr[currentIndex],{left:imgWidth});
            }else if(currentIndex < this.index){          //如果点击的序列比当前图片的索引大时,点击序列对应的图片放在右边,当前图片左移,点击序列的图片左移
                imgArr[this.index].style.left = imgWidth + 'px';
                animate(imgArr[currentIndex],{left:-imgWidth}); 
            }
            currentIndex = this.index;        //移动时要更改整体的索引值
            animate(imgArr[this.index],{left:0});
            for(var i = 0; i < imgArr.length; i++){       //用排他思想,为点击的序列添加背景(即切换背景图片,即增加类名)
                listArr[i].className = "slider-control-bar";
            }
            this.className = "slider-control-bar current";
        }
    }

            //设置最初样式,所有图片放在盒子右边,然后第一张图片放在盒子中        
            for(var i = 0; i < imgArr.length; i++){
                imgArr[i].style.left = imgWidth + 'px';
            }
            imgArr[0].style.left = 0 + 'px';
            var currentIndex = 0;      //定义索引值,初始为0
            function nextImg(){         //下一张图片 
                animate(imgArr[currentIndex],{left:-imgWidth});   //当前索引的图片向左移
                currentIndex++;         //索引加1
                if(currentIndex >= imgArr.length){      //如果索引等于图片的数量,索引归0
                    currentIndex = 0;
                }
                imgArr[currentIndex].style.left = imgWidth + "px";    //因为索引加1后,当前索引对应的图片放在盒子右边,并开始移动
                animate(imgArr[currentIndex],{left:0});
                for(var i = 0; i < imgArr.length; i++){     //排他思想设置序列的背景
                    listArr[i].className = "slider-control-bar";
                }
                listArr[currentIndex].className = "slider-control-bar current";
            }

            function preImg(){              //向前移
                animate(imgArr[currentIndex],{left:imgWidth});       //当前索引的图片移到右边
                currentIndex--;         //索引减1
                if(currentIndex < 0){     //如果索引减小于0,则切换到最后一张图片的索引
                    currentIndex = imgArr.length-1;
                }
                imgArr[currentIndex].style.left = -imgWidth + 'px';       //因为索引改变,所以当前索引的图片放在盒子左边,然后右移
                animate(imgArr[currentIndex],{left:0});
                for(var i = 0; i < imgArr.length; i++){      //排他思想设置序列的背景
                    listArr[i].className = "slider-control-bar";
                }
                listArr[currentIndex].className = "slider-control-bar current";
            }
            var timer = setInterval(nextImg,4000);   //开启定时器,自动播放
            pre.onclick = preImg;       //当点击左侧方块的时候,开启左移
            next.onclick = nextImg;      //当点击右侧方块的时候,开启右移
            box.onmouseover = function(){    //鼠标放在盒子上,清除定时器
                clearInterval(timer);
            }
            box.onmouseout = function(){    //鼠标移开,继续
                timer = setInterval(nextImg,4000);
            }
        }

    **//下面是封装的缓动动画函数,详细请点击下文链接**        
    function animate(ele,json,fn){
        clearInterval(ele.timer);
        ele.timer = setInterval(function(){
            var bool = true;
            for(k in json){
                if(k == "opacity"){
                    var leader = parseInt(getStyle(ele,k)*100) || 1;
                }else{
                    var leader = parseInt(getStyle(ele,k)) || 0;
                }                               
                var step = (json[k] - leader) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);   
                leader = leader + step;             
                if(k == "opacity"){             
                    // console.log(leader);     
                    ele.style[k] = leader / 100;
                    ele.style.filter = "alpha(opacity=" + leader + ")";
                }else if(k == "zIndex"){
                    ele.style[k] = leader;
                }else{
                    ele.style[k] = leader + "px";
                }

                if(leader !== json[k]){
                    bool = false;
                }                                                           
            }
            if(bool){
                clearInterval(ele.timer);
                if(typeof fn == 'function'){
                    fn();
                }
            }
        },25);

    }

    function getStyle(ele,attr){
        if(window.getComputedStyle){
            return window.getComputedStyle(ele,null)[attr];
        }else{
            return ele.currentStyle[attr];
        }
    }

第一种轮播图链接:http://blog.csdn.net/qq_33599109/article/details/77249062
缓动动画函数封装:http://blog.csdn.net/qq_33599109/article/details/77257182

作者:kuke_kuke
博客链接:http://blog.csdn.net/qq_33599109
欢迎关注支持,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值