博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5实现全兼容的下拉刷新功能
阅读量:5305 次
发布时间:2019-06-14

本文共 3832 字,大约阅读时间需要 12 分钟。

前端一直有个技术有很少框架能够完美兼容,下拉刷新。自从ios提出这个功能后,很多设备上都在效仿,但是在h5上,有不少都是通过iscroll实现的,不过在低端安卓上略显卡顿。同时,iscroll体积的大小和button按钮的双点击bug也是让人苦不堪言。现在,我们就用最简单的方式来实现手机上全兼容的下拉刷新。

 

我们来看一个demo实例:

 

我们再来看下这个源码 : 

 

下拉刷新最重要的点是window的touchmove和你下拉节点的touchmove之间的关系。

首先我们这么设定:

window.addEventListener('touchmove', function(e){    if ( window.cantouch ){        e.preventDefault();    }});

只要我们改变window.cantouch的值,那么我们就能让window默认滚动事件禁止。

同时我们通过对节点的touch事件监听来控制整个下拉过程。

源码中我们能看到这样的touchstart代码

LazyScrollRefresh.prototype.touchEventStart = function(){    var that = this;    return function(e){        if ( that.isRefreshing || that.getting ) {            that.canMove = false;        }else{            that.Vue.util.isAndroid && e.preventDefault();            that.canMove = true;            that._y = e.targetTouches[0].pageY;            that.y = 0;        }    }}

在手指触碰到屏幕的时候,我们canmove设定为true。

LazyScrollRefresh.prototype.touchEventMove = function(){    var that = this;    return function(e){        if ( that.canMove && !that.getting ){            that.y = e.targetTouches[0].pageY;            var moveY = that.y - that._y;            if ( moveY > 0 && document.body.scrollTop <= 0 ){                that.soyie.windowTouchMoveDisabled = true;                if ( moveY >= that.$options.refreshOffsetHeight ){                    that.isRefreshing = true;                    moveto.call(this, that.slowSpeed(moveY));                    that.$icon.classList.add('lazyscroll-rotate');                    that.$title.innerHTML = that.$options.refresh.title;                    that.$value.innerHTML = that.$options.refresh.text;                }else{                    that.isRefreshing = false;                    moveto.call(this, moveY);                    that.$icon.classList.remove('lazyscroll-rotate');                    that.$title.innerHTML = that.$options.defaults.title;                    that.$value.innerHTML = that.$options.defaults.text;                }            }else{                that.soyie.windowTouchMoveDisabled = false;                that.isRefreshing = false;                moveto.call(this, moveY);                that.$icon.classList.remove('lazyscroll-rotate');                that.$title.innerHTML = that.$options.defaults.title;                that.$value.innerHTML = that.$options.defaults.text;            }        }    }}

在touchmove的时候,我们禁止掉window的touchmove。不过需要注意的是,下拉刷新的条件是,你的_x于x的距离moveY必须>0,并且body的scrolltop必须<=0。这里你可以做你自己的事情。我么使用

function moveto(height){    this.style.webkitTransform = 'translate3d(0,' + height + 'px,0)';}

来跟随moveY的距离通过css3来移动整个节点。

LazyScrollRefresh.prototype.touchEventEnd = function(){    var that = this;    return function(e){        if ( that.getting ) return;        that.canMove = false;        that._y = that.y = 0;        that.soyie.windowTouchMoveDisabled = false;        that.soyie.animationend(that.$root).then(function(){            if ( that.isRefreshing ){                if ( that.getting ) return;                that.getting = true;                that.$icon.innerHTML = that.$options.release.icon;                that.$title.innerHTML = that.$options.release.title;                that.$value.innerHTML = that.$options.release.text;                that.emit('refreshing', that.next(that.$root));            }else{                (that.next())();            }        });        that.$root.classList.add('layscroll-animate');        if ( that.isRefreshing ){            moveto.call(this, that.$options.refreshOffsetHeight);        }else{            moveto.call(this, 0);        }    }}

在touchend的时候释放window的touchmove事件,同时将canmove设置为false,将所有用到的数据变量设置为初始状态。

 

基本逻辑就是这样实现,你也可以通过这个逻辑来实现一套更加完美的下拉刷新功能,不过这里我推荐大家使用simplize来开发手机端的h5页面。git项目地址是:

这套框架优势在于路由中间件在前端页面的使用上。我么可以想express一样操作前端的路由,很方便。页面切换都几乎接近来原生。不过底层的数据驱动是用vuejs来写的。你们可以尝试下,效果体验一定能让你满意。

转载于:https://www.cnblogs.com/shenevio/p/5145266.html

你可能感兴趣的文章
python tkinter GUI绘制,以及点击更新显示图片
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
Spark的启动进程详解
查看>>
使用命令创建数据库和表
查看>>