zoukankan      html  css  js  c++  java
  • javascript+html5+css3下拉刷新 数据效果

    文章摘自:suchso.com/projecteactual/javascript-html5-css3-taobao-xiala-data.html  

    segmentfault.com/a/1190000004370220

    原生app里的数据列表都会使用下拉刷新的效果,在webapp里可以采用iscroll、swiper等插件或框架实现,那么如何自己编码实现类似的效果呢,下面介绍使用原生js+css3实现的简单效果。

    html布局

    <!DOCTYPE html>
    <html>
    <head>  
    <meta charset="utf-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0,  user-scalable=no">
    <title>test</title>
    <style type="text/css" media="screen">
        body{margin: 0;}
        ul{list-style: none;padding: 0;}
        li{height: 30px;border-bottom: 1px solid #ddd;line-height: 30px;padding-left: 10px;}
        .scroller .loading{height: 60px;line-height: 60px;text-align: center; 100%;background-color: #f1f1f1;}
        .scroller{-webkit-overflow-scrolling:touch;}
    </style> 
    </head> 
    <body > 
    <div id="container" class="scroller" >
    <div class="loading">
       下拉刷新数据
    </div>
    <ul>
        <li><a href="#">列表数据1</a></li>
        <li><a href="#">列表数据2</a></li>
        <li><a href="#">列表数据3</a></li>
        <li><a href="#">列表数据4</a></li>
        <li><a href="#">列表数据5</a></li>
        <li><a href="#">列表数据6</a></li>
        <li><a href="#">列表数据7</a></li>
        <li><a href="#">列表数据8</a></li>
        <li><a href="#">列表数据9</a></li>
        <li><a href="#">列表数据10</a></li>
        <li><a href="#">列表数据11</a></li>
        <li><a href="#">列表数据12</a></li>
        <li><a href="#">列表数据13</a></li>
        <li><a href="#">列表数据14</a></li>
        <li><a href="#">列表数据15</a></li>
        <li><a href="#">列表数据16</a></li>
        <li><a href="#">列表数据17</a></li>
        <li><a href="#">列表数据18</a></li>
        <li><a href="#">列表数据19</a></li>
        <li><a href="#">列表数据20</a></li>
        <li><a href="#">列表数据21</a></li>
        <li><a href="#">列表数据22</a></li>
        <li><a href="#">列表数据23</a></li>
        <li><a href="#">列表数据24</a></li>
        <li><a href="#">列表数据25</a></li>
        <li><a href="#">列表数据26</a></li>
        <li><a href="#">列表数据27</a></li>
        <li><a href="#">列表数据28</a></li>
        <li><a href="#">列表数据29</a></li>
        <li><a href="#">列表数据30</a></li>
    </ul> 
    </div>
    <body>
    </html>
    
    

    js逻辑

     var slide = function (option) {
        var defaults={
            container:'',
            next:function(){}
        }
        var start,
                end,
                length,
                isLock = false,//是否锁定整个操作
                isCanDo = false,//是否移动滑块
                isTouchPad = (/hp-tablet/gi).test(navigator.appVersion),
                hasTouch = 'ontouchstart' in window && !isTouchPad;
        var obj = document.querySelector(option.container);
        var loading=obj.firstElementChild;
        var offset=loading.clientHeight;
        var objparent = obj.parentElement;
        /*操作方法*/
        var fn =
        {
            //移动容器
            translate: function (diff) {
                obj.style.webkitTransform='translate3d(0,'+diff+'px,0)';
                obj.style.transform='translate3d(0,'+diff+'px,0)';
            },
            //设置效果时间
            setTransition: function (time) {
                obj.style.webkitTransition='all '+time+'s';
                obj.style.transition='all '+time+'s';
            },
            //返回到初始位置
            back: function () {
                fn.translate(0 - offset);
                //标识操作完成
                isLock = false;
            },
            addEvent:function(element,event_name,event_fn){
                if (element.addEventListener) {
                    element.addEventListener(event_name, event_fn, false);
                } else if (element.attachEvent) {
                    element.attachEvent('on' + event_name, event_fn);
                } else {
                    element['on' + event_name] = event_fn;
                }
            }
        };
    
        fn.translate(0-offset);
        fn.addEvent(obj,'touchstart',start);
        fn.addEvent(obj,'touchmove',move);
        fn.addEvent(obj,'touchend',end);
        fn.addEvent(obj,'mousedown',start)
        fn.addEvent(obj,'mousemove',move)
        fn.addEvent(obj,'mouseup',end)
    
        //滑动开始
        function start(e) {
            if (objparent.scrollTop <= 0 && !isLock) {
                var even = typeof event == "undefined" ? e : event;
                //标识操作进行中
                isLock = true;
                isCanDo = true;
                //保存当前鼠标Y坐标
                start = hasTouch ? even.touches[0].pageY : even.pageY;
                //消除滑块动画时间
                fn.setTransition(0);
                loading.innerHTML='下拉刷新数据';
            }
            return false;
        }
    
        //滑动中
        function move(e) {
            if (objparent.scrollTop <= 0 && isCanDo) {
                var even = typeof event == "undefined" ? e : event;
                //保存当前鼠标Y坐标
                end = hasTouch ? even.touches[0].pageY : even.pageY;
                if (start < end) {
                    even.preventDefault();
                    //消除滑块动画时间
                    fn.setTransition(0);
                    //移动滑块
                    if((end-start-offset)/2<=150) {
                        length=(end - start - offset) / 2;
                        fn.translate(length);
                    }
                    else {
                        length+=0.3;
                        fn.translate(length);
                    }
                }
            }
        }
        //滑动结束
        function end(e) {
            if (isCanDo) {
                isCanDo = false;
                //判断滑动距离是否大于等于指定值
                if (end - start >= offset) {
                    //设置滑块回弹时间
                    fn.setTransition(1);
                    //保留提示部分
                    fn.translate(0);
                    //执行回调函数
                    loading.innerHTML='正在刷新数据';
                    if (typeof option.next == "function") {
                        option.next.call(fn, e);
                    }
                } else {
                    //返回初始状态
                    fn.back();
                }
            }
        }
    }
    slide({container:"#container",next: function (e) {
        //松手之后执行逻辑,ajax请求数据,数据返回后隐藏加载中提示
        var that = this;
        setTimeout(function () {
            that.back.call();
        }, 2000);
    }});
    
  • 相关阅读:
    Notes of Daily Scrum Meeting(12.18)
    Notes of Daily Scrum Meeting(12.17)
    Notes of Daily Scrum Meeting(12.16)
    Notes of Daily Scrum Meeting(12.8)
    Notes of Daily Scrum Meeting(12.5)
    Notes of Daily Scrum Meeting(12.3)
    Notes of Daily Scrum Meeting(11.12)
    Linux中profile、bashrc、bash_profile之间的区别和联系
    Linux GCC编译
    mysql 5.7.16 远程连接
  • 原文地址:https://www.cnblogs.com/rik28/p/6296234.html
Copyright © 2011-2022 走看看