基于iscroll5的下拉刷新和上拉加载的实现原理

  • 原创
  • |
  • 浏览:1790
  • |
  • 更新:
  • |
  • 标签:IWORK 

现在手机端网页经常使用下拉刷新、上拉加载更多的效果,在这里介绍一种基于iscroll实现这两种效果的方法,大致思路为添加一个属性值控回弹高度,具体如下。

代码发布出来格式很乱 可复制到到代码编辑器里看

工具/原料

  • iscroll5官方js文件

方法/步骤

  1. 1

    第一步:下载iscroll5官方js文件,使用其中的iscroll-prob.js

  2. 2

    第二步:打开iscroll5-prob.js 在iscroll中修改几处的代码

    1.function IScroll (el, options){}里加两个属性this.minScrollX     = 0;this.minScrollY     = 0;[如图1]

    2.在iscroll的prototype定义的方法resetPosition里修改一处代码

    if ( !this.hasHorizontalScroll || this.x > 0 ) {    x = this.minScrollX;//todo  ----------0修改而成} else if ( this.x < this.maxScrollX ) {    x = this.maxScrollX-this.minScrollX; //todo 修改了-this.minScrollX}if ( !this.hasVerticalScroll || this.y > 0 ) {    y = this.minScrollY;//todo ----------0修改而成} else if ( this.y < this.maxScrollY ) {    y = this.maxScrollY-this.minScrollY;//todo 修改了-this.minScrollY},如图2。

    这里修改就时为了 页面控制minScrollY 让iscroll重置位置的时候会留一段距离。

    3.在iscroll的prototype定义的方法热refresh方法里修改一处代码 重置那两个属性值为0,this.minScrollX     = 0;this.minScrollY     = 0;如图3.

    基于iscroll5的下拉刷新和上拉加载的实现原理
    基于iscroll5的下拉刷新和上拉加载的实现原理
    基于iscroll5的下拉刷新和上拉加载的实现原理
  3. 2
    此文章非法爬取自百度经验
  4. 3

    第三步:页面部分。可以参考官方demo

    html:

    <div class="wrapper">    <div class="scroller">        <div id="downTag" style="height: 50px;width:100%;background-color: #f3f3f3;position: absolute;z-index: -1;top: -50px;text-align: center; line-height: 50px;">下拉</div>        <ul>            <li>Pretty row 1</li>            <li>Pretty row 2</li>            <li>Pretty row 3</li>            <li>Pretty row 4</li>            <li>Pretty row 5</li>            <li>Pretty row 7</li>            <li>Pretty row 8</li>            <li>Pretty row 9</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>            <li>Pretty row 10</li>        </ul>        <div id="upTag" style="height: 50px;width:100%;background-color: #f3f3f3;position: absolute;z-index: -1;bottom: -50px;text-align: center; line-height: 50px;">上拉</div>    </div></div>

    加了两个div作为下啦 上拉的显示标签,样式丑陋可以自己改。

  5. 4

    css部分:参考官方demo

    <style type="text/css">    body {        overflow: hidden; /* this is important to prevent the whole page to bounce */        margin: 0;        padding: 0;    }    .wrapper {        position: absolute;        z-index: 1;        top: 45px;        bottom: 0;        left: 0;        width: 100%;        overflow: hidden;        background-color: #f3f3f3;    }    .scroller {        position: relative;        z-index: 1;        -webkit-tap-highlight-color: rgba(0,0,0,0);        width: 100%;        -webkit-transform: translateZ(0);        -moz-transform: translateZ(0);        -ms-transform: translateZ(0);        -o-transform: translateZ(0);        transform: translateZ(0);        -webkit-touch-callout: none;        -webkit-user-select: none;        -moz-user-select: none;        -ms-user-select: none;        user-select: none;        -webkit-text-size-adjust: none;        -moz-text-size-adjust: none;        -ms-text-size-adjust: none;        -o-text-size-adjust: none;        text-size-adjust: none;        min-height: 100%;        background-color: #fff;    }    ul,li{        margin: 0;        padding: 0;        list-style: none;    }    .wrapper{        border:1px solid grey;    }    .scroller{        border:1px solid grey;    }    li{        height: 20px;        border-bottom: 1px solid gainsboro;        padding: 5px 0;        text-align: center;    }</style>

    加了些border 看的清楚。。。

    scroller 加了min-height:100%和图三里面那个修改=的一起 便于不满一屏时也可拉动

  6. 5

    最后 js部分:

    都加了注释:

    <script type="text/javascript">var myScroll;function loaded () {    var option = {        pull_up : true, //是否显示上拉        pull_down : true,//是否显示下拉        is_loading : false,//是否正在加载 即上拉后正在加载        is_refresh : false,//是否正在下拉刷新        pull_distance : 50,//拉动距离 即达到出发加载或刷新的临界值        pull_element_height : 50,//上拉 下拉显示标签的高度  也是iscroll回弹后定位的高度        pull_up_element:document.querySelector('#upTag'),//上拉标签        pull_down_element:document.querySelector('#downTag')//下拉标签    };    //上拉下拉几个临界点的显示效果    var loading_style = { // 变化的文字或者效果        refresh_before : function(){            //没有刷新没有加载情况下 才变化            if(!option.is_loading && !option.is_refresh)option.pull_down_element.innerText = '下拉刷新';        },        refresh_able : function(){            //没有刷新没有加载情况下 才变化            if(!option.is_loading && !option.is_refresh)option.pull_down_element.innerText = '松手开始刷新';        },        refresh_start : function(){            document.getElementById('downTag').innerText = '正在刷新...';            //正在刷新的时候隐藏上拉加载            if(option.pull_up)option.pull_up_element.style.display = 'none';        },        refresh_end : function(){            document.getElementById('downTag').innerText = '刷新完成';            //刷新完成 显示上拉加载            if(option.pull_up)option.pull_up_element.style.display = '';        },        load_before : function(){            //没有刷新没有加载情况下 才变化            if(!option.is_loading && !option.is_refresh)option.pull_up_element.innerText = '上拉加载更多';        },        load_able : function(){            //没有刷新没有加载情况下 才变化            if(!option.is_loading && !option.is_refresh)option.pull_up_element.innerText = '松手开始加载';        },        load_start : function(){            document.getElementById('upTag').innerText = '正在加载...';            //正在加载的时候 隐藏下拉刷新            if(option.pull_down)option.pull_down_element.style.display = 'none';        },        load_end : function(){            option.pull_up_element.innerText = '加载完成';            //加载完成了 显示下拉刷新            if(option.pull_down)option.pull_down_element.style.display = '';        }    };    //根据设置 隐藏上拉下拉标签    if(!option.pull_up)option.pull_up_element.style.display = 'none';    if(!option.pull_down)option.pull_down_element.style.display = 'none';    //实例化iscroll    myScroll = new IScroll('.wrapper', {probeType:2});    //滑动事件处理    myScroll.on('scroll',function(){        //计算拉动的距离 处理为正数是下拉 负数是上拉        var absY = this.maxScrollY-this.y;        this.moved_distance = this.y>0?this.y:(absY>0?-absY:0);        //回弹距离0 默认是到初始位置        this.minScrollY = 0;        switch (true){            //大于0 为下拉刷新 :0 - 刷新的临界值            case this.moved_distance>0&&this.moved_distance<option.pull_distance:                loading_style.refresh_before();                break;            //大于0 为下拉刷新 :刷新的临界值以上 出发刷新            case this.moved_distance>option.pull_distance:                loading_style.refresh_able();                //启用下拉刷新 并且不是上拉加载正在加载的情况下才控制回弹高度                if(option.pull_down && !option.is_loading)this.minScrollY=option.pull_element_height;                break;            //小于0 上拉加载: 0 - 负数 的刷新临界值            case this.moved_distance<0&&this.moved_distance>-option.pull_distance:                loading_style.load_before();                break;            //小于0 上拉加载: 负数 的刷新临界值以下 触发加载            case this.moved_distance<-option.pull_distance:                loading_style.load_able();                //启用的上拉加载 并且不是正在刷新 才控制回弹高度                if(option.pull_up && !option.is_refresh)this.minScrollY=option.pull_element_height;                break;        }    });    //滑动结束的处理    myScroll.on('scrollEnd',function(e){        //没有正则刷新且没有正在加载 才触发 刷新和加载的处理        if( !option.is_loading && !option.is_refresh){            //判断临界值            if(this.moved_distance > option.pull_distance){                loading_style.refresh_start();                option.is_refresh = true;                //用一个计时器模拟了加载数据时间                var t1 = setTimeout(function(){                    clearTimeout(t1);                    loading_style.refresh_end();                    t1 =  setTimeout(function(){                        clearTimeout(t1);                        myScroll.refresh();                        option.is_refresh = false;                    },500);                },20000);            }            if(this.moved_distance < -option.pull_distance){                loading_style.load_start();                option.is_loading = true;                //用一个计时器模拟了加载数据时间                var t2 = setTimeout(function(){                    clearTimeout(t2);                    loading_style.load_end();                    t2 = setTimeout(function(){                        clearTimeout(t2);                        option.is_loading = false;                        myScroll.refresh();                    },500);                },20000);            }        }    });}document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);</script>

  7. 6

    加载的效果可以根据自己需要变更

    基于iscroll5的下拉刷新和上拉加载的实现原理
    基于iscroll5的下拉刷新和上拉加载的实现原理
    END
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部
相关标签IWORK