指滑轮播图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>指滑轮播图</title>
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        body{
            overflow: hidden;
        }
        .carousel{
            width: 320px;
            position: relative;
            margin: 0 auto;
            overflow: hidden;
        }
        .carousel ul{
            list-style: none;
        }
        .carousel ul li{
            width: 100%;
            position: absolute;
            top: 0;
            left: 0;
            transform:translate(100%,0);
        }
        .carousel ul li:nth-child(1){
            transform:none;
        }
        .carousel ul li img{
            width: 100%;
        }
    </style>
</head>
<body>
    <div class="carousel" id="carousel">
        <ul>
            <li class="item" data-herf=""><img src="images/0.jpg" alt=""></li>
            <li class="item" data-herf=""><img src="images/1.jpg" alt=""></li>
            <li class="item" data-herf=""><img src="images/2.jpg" alt=""></li>
            <li class="item" data-herf=""><img src="images/3.jpg" alt=""></li>
            <li class="item" data-herf=""><img src="images/4.jpg" alt=""></li>
        </ul>
    </div>

    <script type="text/javascript">
        //构造函数
        function FingerCarousel(JSONParams){
            //自己的最大盒子
            this.box = document.querySelector("#" + JSONParams.id);
            //所有li
            this.lis = this.box.querySelectorAll(".item");
            //所有图片
            this.imgs = this.box.querySelectorAll(".item img");
            //宽度
            this.w = JSONParams.width;
            //算一个高度
            var self = this;
            window.addEventListener("load",function(){
                self.box.style.height = getComputedStyle(self.lis[0])["height"];
            },true);
            //信号量,表示谁在中间
            this.idx = 0;
            //动画时间
            this.duration = JSONParams.duration;
            //缓冲
            this.easingWord = JSONParams.easingWord;
            //过渡
            this.transition = "all " + JSONParams.duration / 1000 + "s " + JSONParams.easingWord + " 0s";
            //绑定监听
            this.bindEvent();
        }
        FingerCarousel.prototype.refresh = function(width){
            console.log(width);
            //改变宽度
            this.w = width;
            this.box.style.width = this.w + "px";
            for(var i = 0 ; i < this.lis.length ; i++){
                this.lis[i].style.width = this.w + "px";
            }

            this.h = parseFloat(getComputedStyle(this.imgs[0])["height"]);
            this.box.style.height = this.h + "px";

            //就位
            //计算信号量前后都是谁:
            var prev = this.idx - 1 > 0 ? this.idx - 1 : this.lis.length - 1;
            var next = this.idx + 1 < this.lis.length ? this.idx + 1 : 0;

            //让所有图片根据新的宽度来进行调整
            for(var i = 0 ; i < this.lis.length ; i++){
                this.lis[i].style.transform = "translate(" + this.w + "px,0px)";
            }
            //三个特定元素
            this.lis[prev].style.transform = "translate(" + -this.w + "px,0px)";
            this.lis[this.idx].style.transform = "translate(0px,0px)";
            this.lis[next].style.transform = "translate(" + this.w + "px,0px)";

        }
        //绑定监听
        FingerCarousel.prototype.bindEvent = function(){
            var self = this;
            this.box.addEventListener("touchstart", function(event){
                self.touchstartlistener(event);
            }, true);

            this.box.addEventListener("touchmove", function(event){
                self.touchmovelistener(event);
            }, true);

            this.box.addEventListener("touchend", function(event){
                self.touchendlistener(event);
            }, true);

        }
        //开始触摸的时候事件处理函数
        FingerCarousel.prototype.touchstartlistener = function(event){
            //阻止默认事件
            event.preventDefault();
            //得到手指
            var finger = event.touches[0];
            //记录开始触摸的位置
            this.startX = finger.clientX;
            //给所有li去掉过渡
            for(var i = 0 ; i < this.lis.length ; i++){
                this.lis[i].style.transition = "none";
            }
            //记录时间戳
            this.startTime = new Date();
            //判定这次的点击和上一次的离开时间差
            var time2 = this.startTime - this.endTime;
            if(time2 < 100){
                this.transition = "none";
            }else if(time2 < this.duration){
                //变为0.1s
                this.transition = "all 0.1s ease 0s";
            }else{
                //正常
                this.transition = "all " + this.duration / 1000 + "s " + this.easingWord + " 0s";
            }
            return false;
        }
        //滑动触摸的时候事件处理函数
        FingerCarousel.prototype.touchmovelistener = function(){
            //阻止默认事件
            event.preventDefault();
            //得到手指
            var finger = event.touches[0];
            //增量
            this.dX = finger.clientX - this.startX;
            //计算信号量前后都是谁:
            var prev = this.idx - 1 >= 0 ? this.idx - 1 : this.lis.length - 1;
            var next = this.idx + 1 < this.lis.length? this.idx + 1 : 0;
            //给所有li去掉过渡
            for(var i = 0 ; i < this.lis.length ; i++){
                this.lis[i].style.transition = "none";
            }
            //跟随手指运动,核心语句。让三个li以各自不同的基准线反应增量:
            this.lis[prev].style.transform = "translate(" + (-this.w + this.dX) + "px,0px)";
            this.lis[this.idx].style.transform = "translate(" + (0 + this.dX) + "px,0px)";
            this.lis[next].style.transform = "translate(" + (this.w + this.dX) + "px,0px)";

            return false;
        }
        //触摸结束的时候事件处理函数
        FingerCarousel.prototype.touchendlistener = function(event){
            //阻止默认事件
            event.preventDefault();
            //计算信号量前后都是谁:
            var prev = this.idx - 1 >= 0 ? this.idx - 1 : this.lis.length - 1;
            var next = this.idx + 1 < this.lis.length ? this.idx + 1 : 0;
            //时间戳
            this.endTime = new Date();
            //从开始碰到屏幕到离开屏幕的总时间毫秒数
            var time = this.endTime - this.startTime;

            //判断dX是不是已经过了一半
            if(this.dX >= this.w / 2 || this.dX > 0 && time < 200){
                //往→→→→→→→→→滑动成功
                //增加过渡
                this.lis[this.idx].style.transition = this.transition;
                this.lis[prev].style.transition = this.transition;
                //移动到标准位置
                this.lis[this.idx].style.transform = "translate(" + this.w + "px,0)";
                this.lis[prev].style.transform = "translate(0px,0)";
                //信号量改变
                this.idx--;
                if(this.idx < 0){
                    this.idx = this.lis.length - 1;
                }
                //延迟一定的时间给所有li去掉过渡
                var self = this;
                setTimeout(function(){
                    for(var i = 0 ; i < self.lis.length ; i++){
                        self.lis[i].style.transition = "none";
                    }
                },this.duration);   
            }else if(this.dX <= -this.w / 2 || this.dX < 0 && time < 200){
                //往←←←←←←←滑动成功
                //增加过渡
                this.lis[this.idx].style.transition = this.transition;
                this.lis[next].style.transition = this.transition;
                //移动到标准位置
                this.lis[this.idx].style.transform = "translate(" + -this.w + "px,0)";
                this.lis[next].style.transform = "translate(0px,0)";
                //信号量改变
                this.idx++;
                if(this.idx > this.lis.length - 1){
                    this.idx = 0;
                }
                //延迟一定的时间给所有li去掉过渡
                var self = this;
                setTimeout(function(){
                    for(var i = 0 ; i < self.lis.length ; i++){
                        self.lis[i].style.transition = "none";
                    }
                },this.duration);   
            }else{
                //没有滑动成功
                this.lis[prev].style.transition = this.transition;
                this.lis[this.idx].style.transition = this.transition;
                this.lis[next].style.transition = this.transition;
                //移动到标准位置
                this.lis[prev].style.transform = "translate(" + -this.w + "px,0)";
                this.lis[this.idx].style.transform = "translate(0px,0)";
                this.lis[next].style.transform = "translate(" + this.w + "px,0)";
                //延迟一定的时间给所有li去掉过渡
                var self = this;
                setTimeout(function(){
                    for(var i = 0 ; i < self.lis.length ; i++){
                        self.lis[i].style.transition = "none";
                    }
                },this.duration);   
            }

            return false;
        }


        var fc = new FingerCarousel({
            "id" : "carousel",
            "width" : 320,
            "duration" : 400,   //动画时间
            "easingWord" : "ease" //动画缓冲
        });


        //当屏幕旋转的时候会触发onresize事件,
        window.onresize = function(){
            if(document.documentElement.clientWidth < 540){
                fc.refresh(320);
            }else{
                fc.refresh(540);
            }
        }
    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值