自制轮播图

效果:


轮播图的关键:

a.外层容器宽度设为一张图片的宽度,子元素的宽度是n张图片的总宽度(放置这n张图片用),此时子元素宽度大于了外层容器宽度,设置外层容器:overflow:hidden,可每次只显示一张图片。

b.切换到下一张图片时的动画怎么做?从前的话就用jquery的animate函数,现在有了css3,使用transition动画就可以了,transition:left  0.8s  ease ,根据用户的操作 设置上面所说的盛放n张图片的子元素的left(当前必须给它设置position,才能使left生效),left渐变就是想要的动画了。

c.向左,向右,底部的圆点这些控制按钮,可以新做一个层出来,定位在外层容器上。

d.过程中发现,如果设置切换一次时间为0.8s,若用户紧接着再次点击切换按钮的话,由于left的值还没动作到位,图片就是卡住的状态(显示了两张图片,但都没显示完全,就停住了),这肯定是不行的。解决思路:切换动作执行一次后要等待0.8s,让图片动作做完。图片动作过程中,把控制按钮一层的opacity设为0.5,来个半透明,提示用户此时不可操作。

嗯。其实还可以封装得更好,先这样。上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轮播图</title>
    <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script>
    <style>
        *{padding:0 0;margin:0 0;}
        .carousel-wrap{margin:100px auto 0 auto;border:1px solid #ccc}
        .carousel-wrap, .carousel{width:500px;height:300px;}
        .carousel{
            overflow:hidden; /*关键*/
        }
        .carousel ul{width:2000px;margin:0 0;padding:0 0;list-style:none;position:relative;left:0;
            transition:left 0.8s ease; /*关键*/
        }
        .carousel li{display:inline-block;}
        .carousel img{width:500px;height:300px}
        .carousel-wrap{position:relative;background:lightgray;}
        .control{position:absolute;width:500px;height:300px;left:0;top:0;}
        #previous,#next{border-radius:25px;color: white;font-size: 30px;box-sizing: border-box;width: 50px;height: 50px;line-height: 28px;font-style: normal;padding: 10px 10px;background-color: rgba(0,0,0,0.3);text-align: center;cursor:pointer}
        #previous{position:absolute;left:32px;top:150px}
        #next{position:absolute;right:32px;top:150px}
        .control ul{width: 100%;margin: auto;position: absolute; bottom: 20px;text-align: center;padding: 0 0;}
        .control li{display:inline-block;width:20px;height:20px;border-radius:10px;background-color:rgba(255,255,255,0.8);margin-right:18px;cursor:pointer}
        .control li:last-child{margin-right:0}
        .control li.on{background-color:rgba(255,255,255,0.3)}
        #previous,#next{-webkit-user-select:none;}
        #previous{display:none;}
        .control.wait{opacity:0.5}
    </style>
</head>
<body>
<div class="carousel-wrap">
    <div class="carousel">
        <ul>
            <li><img src="image/12.jpg" alt="A"></li><li><img src="image/13.jpg" alt="B"></li><li><img src="image/14.jpg" alt="C"></li><li><img src="image/15.jpg" alt="D"></li>
        </ul>
    </div>
    <div class="control">
        <span id="previous"><</span>
        <span id="next">></span>
        <ul><li class="on"></li><li></li><li></li><li></li></ul>
    </div>
</div>
<script>
    var carousel;
    $(function(){
        carousel=new Carousel(4,500,800);
        $("#previous").click(function(){
            carousel.goPrevious();
        });
        $("#next").click(function(){
            carousel.goNext();
        });
        $(".control li").click(function(){
            carousel.goLocate($(this).index());
        });
    });
    //自动播放 carousel.autoRun();


    //param:count-图片数量
    //param:width-一张轮播图的宽度
    //param:milisecond-一次滑动的毫秒数
    function Carousel(count,width,milisecond){
        var current=0;
        var canRun=true;
        var goPrevious=function (num){
            if(!canRun){return;}
            canRun=false;
            $(".control").addClass("wait");
            num=num || 1;
            if(current>0){
                var left=(getLeft()+num*width)+"px";
                $(".carousel ul").css("left",left);
                current=current-num;
            }
            setControl();
            setTimeout(function(){canRun=true;$(".control").removeClass("wait");},milisecond);
        };
        var goNext=function (num){
            if(!canRun){return;}
            canRun=false;
            $(".control").addClass("wait");
            num=num || 1;
            if(current<(count-1)){
                var left=(getLeft()-num*width)+"px";
                $(".carousel ul").css("left",left);
                current=current+num;
            }
            setControl();
            setTimeout(function(){canRun=true;$(".control").removeClass("wait");},milisecond);
        };
        var goLocate=function (index){
            if(index>current){        //展示右侧
                var num=index-current;
                goNext(num);
            }else if(index<current){  //展示左侧
                var num=current-index;
                goPrevious(num);
            }
        };
        var getLeft=function (){
            return parseInt($(".carousel ul").css("left").replace("px",""));
        };
        var setControl=function(){
            $(".control li").removeClass("on").eq(current).addClass("on");
            current === 0 ? $("#previous").hide() : $("#previous").show();
            current ===(count-1) ? $("#next").hide():$("#next").show();
        };
        var autoRun=function(){
            setInterval(function(){
                var index=(current+1) % 4;
                goLocate(index);
            },milisecond);
        };
        return{
            goPrevious:goPrevious,
            goNext:goNext,
            goLocate:goLocate,
            autoRun:autoRun //自动播放
        }
    }

</script>

</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值