7、滑屏轮播——自动播放加无缝循环

7、滑屏轮播——自动播放加无缝循环

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,user-scalable=no" />
        <title>滑屏轮播——自动播放加无缝循环版</title>
        <!--
              需要掌握知识点:
                1、自动播放;
                2、定义全局now变量:使自动播放与手动滑屏相关联
        -->
        <style id="css">
            body{
                margin: 0;
            }
            #wrap{
                overflow: hidden;
                position: relative;
            }
            #list{
                margin: 0;
                padding: 0;
                list-style: none;
                /*overflow: hidden;*/
               /*position: absolute;*/
            }
            #list li{
                float: left;
            }
            #list img{
                width: 100%;
                display: block;
            }
            #nav{
                position: absolute;
                bottom: 10px;
                left: 0;
                width: 100%;
                text-align: center;
            }
            #nav span{
                display: inline-block;
                width: 10px;
                height: 10px;
                border-radius: 5px;
                background: black;
            }
            #nav .active{
                background: #fff;
            }
            .clear:after{/* 用于清除浮动 */ 
                content: "";
                display: block;
                clear: both;

            }
        </style>
        <script type="text/javascript" src="cssTransform.js" ></script>
        <script>
            document.addEventListener(
                //用于阻止系统默认的菜单、文字默认选中、橡皮筋回弹效果
                //缺点:系统默认滚动条消失
                "touchstart",
                function(e){
                    e.preventDefault();
                }
            );
            window.onload = function(){
                var wrap=document.querySelector('#wrap');
                var list=document.querySelector('#list');
                list.innerHTML+=list.innerHTML;//把滚动层的内容多复制一份
                var lis=document.querySelectorAll('#list li');
                var navSpan=document.querySelectorAll('#nav span');
                //用JS动态设置wrap的高度和ul、li的width;
                var css=document.querySelector('#css');
                var style="#wrap{height:"+lis[0].offsetHeight+"px}";
                style+="#list{width:"+lis.length*100+"%}";
                style+="#list li{width:"+(1/lis.length)*100+"%}";
                css.innerHTML+=style;

                var startPoint=0;//用于储存手指按下的坐标
                var startX=0;//用于储存手指按下时滚动层UL的translateX位移值
                var wrapW=wrap.offsetWidth;//设置这个值在CHROME模拟器下list不运动,解决办法
                                            //1、去掉这个变量
                                            //2、给list设置overflow:hidden
                                            //3、给list设置position:absolute;
                var timer=null;//创建一个变量后面用于储存定时器
                var now=0;//定义全局的变量now让自动播放的图片与滑屏移到的相关联

                cssTransform(list,"translateX",0);//设置滚动层的初始化的translateX值
                autoPlay();//自动播放
                wrap.addEventListener(
                    "touchstart",
                    function(e){//0,1,2,3,
                                //4,5,6,7
                                //共8张,原理是当按下时位于0位时,瞬间移动到第4个,因为两张图是一样的所以视觉上不会有感觉
                                //当按下7位时,瞬间移动到第3个,从而产生无缝循环的感觉。
                        clearInterval(timer);//每次滑屏时清除定时器
                        list.style.transition="none";//为了不在视觉上感觉到,所以要把transition清空,同时也是因为move时不需要transition
                        var translateX=cssTransform(list,"translateX");
                        now=-Math.round(translateX/wrapW);
                        if(now==0){//原理是当按下时位于0位时,瞬间移动到第4个,因为两张图是一样的所以视觉上不会有感觉
                            now=navSpan.length;
                        }
                        if(now==(lis.length-1)){//当按下7位时,瞬间移动到第3个
                            now=navSpan.length-1;
                        }
                        cssTransform(list,"translateX",-now*wrapW);
                        var touch = e.changedTouches[0];
                        startPoint=touch.pageX;//移到过后再获取手指按下时手指距离屏幕X轴的距离
                        startX=cssTransform(list,"translateX");//移到过后再获取手指按下时滚动层UL的translateX位移值

                    }
                );
                wrap.addEventListener(
                    "touchmove",
                    function(e){
                        var touch=e.changedTouches[0];
                        var nowPoint=touch.pageX;//手指移动时手指距离屏幕X轴的距离
                        var distance=nowPoint-startPoint;//手指移动时距离
                        cssTransform(list,"translateX",startX+distance);//设置手指移动时的translateX
                    }
                );
                wrap.addEventListener(
                    "touchend",
                    function(){
                        var translateX=cssTransform(list,"translateX");
                        //判断移动超过一半时自动移动下一张,未到一半时回到当前张
                        now = Math.round(-translateX/wrapW);
                        picTab();
                        autoPlay();
                    }
                );

                //定义自动播放的函数
                function autoPlay(){
                    clearInterval(timer);
                    timer=setInterval(function(){
                        if(now==lis.length-1){
                            now=navSpan.length-1;
                        }
                        list.style.transition="none";
                        cssTransform(list,"translateX",-now*wrapW);
                        setTimeout(function(){
                            now++;
                            picTab();
                        },30);
                    },2000);
                }
                //定义图片切换的函数
                function picTab(){
                    list.style.transition="0.5s";
                    cssTransform(list,"translateX",-now*wrapW);
                    for(var i=0;i<navSpan.length;i++){
                        navSpan[i].className="";
                    }
                    navSpan[now%navSpan.length].className="active";
                }
            }
        </script>
    </head>
    <body>
        <div id="wrap"><!-- 包裹层 -->
            <ul id="list" class="clear"><!-- 滑动层 -->
                <li><a href="#"><img src="img/1.jpg"/></a></li>
                <li><a href="#"><img src="img/2.jpg"/></a></li>
                <li><a href="#"><img src="img/3.jpg"/></a></li>
                <li><a href="#"><img src="img/4.jpg"/></a></li>
            </ul>
            <nav id="nav"><!-- 底部按钮 -->
                <span class="active"></span>
                <span></span>
                <span></span>
                <span></span>
            </nav>
        </div>
    </body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值