当前位置 : 主页 > 网络编程 > JavaScript >

移动端触摸滑动组件的例子

来源:互联网 收集:自由互联 发布时间:2021-07-03
!DOCTYPE HTMLhtmlheadmeta http-equiv="Content-Type" content="text/html; charset=utf-8"/meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" /meta name="apple-touch-fullscre
 
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
<meta name="apple-touch-fullscreen" content="YES" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<style>
    body{
        margin: 0;
        padding: 0;
        background: #333;
        overflow: hidden;
    }
    li,ul{
        list-style: none;
        margin: 0;
        padding: 0;
        height: 100%;
        overflow: hidden;
    }
    /* 使得图片居中 webkit-box */
    li{
        position: absolute;
        display: -webkit-box;
        -webkit-box-pack: center;
        -webkit-box-align: center;
    }
    li img {
        max-width: 100%;
        max-height: 100%;
    }
    /* 隐藏画布外的内容 */
    #canvas{
        height: 100%;
        width: 100%;
        overflow: hidden;
    }
</style>
</head>
<body>
    <!-- 外层画布 -->
    <div id="canvas"></div>
  
    <script type="text/javascript">
        //所有的数据
        var list = [{
            height: 950,
            width: 800,
            img: "imgs/1.jpg"
        },
        {
            height: 1187,
            width: 900,
            img: "imgs/2.jpg"
        },
        {
            height: 766,
            width: 980,
            img: "imgs/3.jpg"
        },
        {
            height: 754,
            width: 980,
            img: "imgs/4.jpg"
        },
        {
            height: 493,
            img: "imgs/5.jpg",
            width: 750
        },
        {
            height: 500,
            img: "imgs/6.jpg",
            width: 750
        },
        {   
            height: 600,
            img: "imgs/7.jpg",
            width: 400
        }];
  
        //构造函数
        function Slider(opts){
            //构造函数需要的参数
            this.wrap = opts.dom;
            this.list = opts.list;
            //构造三步奏
            this.init();
            this.renderDOM();
            this.bindDOM();
        }
  
        //第一步 -- 初始化
        Slider.prototype.init = function() {
            //设定窗口比率
            this.radio = window.innerHeight/window.innerWidth;
            //设定一页的宽度
            this.scaleW = window.innerWidth;
            //设定初始的索引值
            this.idx = 0;
        };
  
        //第二步 -- 根据数据渲染DOM
        Slider.prototype.renderDOM = function(){
            var wrap = this.wrap;
            var data = this.list;
            var len = data.length;
  
            this.outer = document.createElement('ul');
            //根据元素的
            for(var i = 0; i < len; i++){
                var li = document.createElement('li');
                var item = data[i];
                li.style.width = window.innerWidth +'px';
                li.style.webkitTransform = 'translate3d('+ i*this.scaleW +'px, 0, 0)';
                if(item){
                    //根据窗口的比例与图片的比例来确定
                    //图片是根据宽度来等比缩放还是根据高度来等比缩放
                    if(item['height']/item['width'] > this.radio){
                        li.innerHTML = '<img height="'+ window.innerHeight +'" src="'+ item['img'] +'">';
                    }else{
                        li.innerHTML = '<img width="'+ window.innerWidth +'" src="'+ item['img'] +'">';
                    }
                }
                this.outer.appendChild(li);
            }
  
            //UL的宽度和画布宽度一致
            this.outer.style.cssText = 'width:' + this.scaleW +'px';
  
            wrap.style.height = window.innerHeight + 'px';
            wrap.appendChild(this.outer);
        };
  
        Slider.prototype.goIndex = function(n){
            var idx = this.idx;
            var lis = this.outer.getElementsByTagName('li');
            var len = lis.length;
            var cidx;
  
            //如果传数字 2,3 之类可以使得直接滑动到该索引
            if(typeof n == 'number'){
                cidx = idx;
            //如果是传字符则为索引的变化
            }else if(typeof n == 'string'){
                cidx = idx + n*1;
            }
  
            //当索引右超出
            if(cidx > len-1){
                cidx = len - 1;
            //当索引左超出    
            }else if(cidx < 0){
                cidx = 0;
            }
  
            //保留当前索引值
            this.idx = cidx;
  
            //改变过渡的方式,从无动画变为有动画
            lis[cidx].style.webkitTransition = '-webkit-transform 0.2s ease-out';
            lis[cidx-1] && (lis[cidx-1].style.webkitTransition = '-webkit-transform 0.2s ease-out');
            lis[cidx+1] && (lis[cidx+1].style.webkitTransition = '-webkit-transform 0.2s ease-out');
  
            //改变动画后所应该的位移值
            lis[cidx].style.webkitTransform = 'translate3d(0, 0, 0)';
            lis[cidx-1] && (lis[cidx-1].style.webkitTransform = 'translate3d(-'+ this.scaleW +'px, 0, 0)');
            lis[cidx+1] && (lis[cidx+1].style.webkitTransform = 'translate3d('+ this.scaleW +'px, 0, 0)');
        };
  
        //第三步 -- 绑定 DOM 事件
        Slider.prototype.bindDOM = function(){
            var self = this;
            var scaleW = self.scaleW;
            var outer = self.outer;
            var len = self.list.length;
  
            //手指按下的处理事件
            var startHandler = function(evt){
  
                //记录刚刚开始按下的时间
                self.startTime = new Date() * 1;
  
                //记录手指按下的坐标
                self.startX = evt.touches[0].pageX;
  
                //清除偏移量
                self.offsetX = 0;
  
                //事件对象
                var target = evt.target;
                while(target.nodeName != 'LI' && target.nodeName != 'BODY'){
                    target = target.parentNode;
                }
                self.target = target;
  
            };
  
            //手指移动的处理事件
            var moveHandler = function(evt){
                //兼容chrome android,阻止浏览器默认行为
                evt.preventDefault();
  
                //计算手指的偏移量
                self.offsetX = evt.targetTouches[0].pageX - self.startX;
  
                var lis = outer.getElementsByTagName('li');
                //起始索引
                var i = self.idx - 1;
                //结束索引
                var m = i + 3;
  
                //最小化改变DOM属性
                for(i; i < m; i++){
                    lis[i] && (lis[i].style.webkitTransition = '-webkit-transform 0s ease-out');
                    lis[i] && (lis[i].style.webkitTransform = 'translate3d('+ ((i-self.idx)*self.scaleW + self.offsetX) +'px, 0, 0)');
                }
            };
  
            //手指抬起的处理事件
            var endHandler = function(evt){
                evt.preventDefault();
  
                //边界就翻页值
                var boundary = scaleW/6;
  
                //手指抬起的时间值
                var endTime = new Date() * 1;
  
                //所有列表项
                var lis = outer.getElementsByTagName('li');
  
                //当手指移动时间超过300ms 的时候,按位移算
                if(endTime - self.startTime > 300){
                    if(self.offsetX >= boundary){
                        self.goIndex('-1');
                    }else if(self.offsetX < 0 && self.offsetX < -boundary){
                        self.goIndex('+1');
                    }else{
                        self.goIndex('0');
                    }
                }else{
                    //优化
                    //快速移动也能使得翻页
                    if(self.offsetX > 50){
                        self.goIndex('-1');
                    }else if(self.offsetX < -50){
                        self.goIndex('+1');
                    }else{
                        self.goIndex('0');
                    }
                }
            };
  
            //绑定事件
            outer.addEventListener('touchstart', startHandler);
            outer.addEventListener('touchmove', moveHandler);
            outer.addEventListener('touchend', endHandler);
        };
  
        //初始化Slider 实例
        new Slider({
            dom : document.getElementById('canvas'),
            list : list
        });
    </script>
</body>

网友评论