摘要:也可以采用其他的方式,如方式使用定时器的方式,的实现滑动界面刷新的效果。
1.界面上,只分成简单的两块,一块是上方的刷新文字,一块是下方的内容,然后将上方提示内容隐藏在屏幕之外,一般由两种方式,一种是上面遮一层,另一种是marginTop:负值将其弄出屏幕外,这里我采用的是第一种,代码也很简单,就随便贴一下
.header{ width: 100%; height: 1rem;这里的高度应该与刷新文字一样高 position: fixed; z-index: 100; }
2.功能实现的重头戏是在逻辑上,主要分成下面几个部分
监听事件
位置计算
控制界面变化
数据更新包
我一个一个进行分析,然后带你们入坑。
//el为下拉的整个节点//这里为添加监听 this.el.addEventListener("touchstart", this.refreshTouchStart); this.el.addEventListener("touchmove", this.refreshTouchMove); this.el.addEventListener("touchend", this.refreshTouchEnd);//记住在不用的时候要移除监听哦 this.el.removeEventListener("touchstart", this.refreshTouchStart); this.el.removeEventListener("touchmove", this.refreshTouchMovee); this.el.removeEventListener("touchend", this.refreshTouchEnd);//具体的函数,我们直接在位置计算中看
下拉刷新的逻辑 = 当前页面的首项在屏幕中且容器向下滑动的距离大于一定值
上拉加载的逻辑 = 当前页面已滑动到底部
好,我们直接看具体的实现逻辑代码
//代码中包含界面变化和数据更新,仔细看哦 refreshTouchStart(e) { let touch = e.changedTouches[0]; this.tipText = "下拉刷新";//下拉提示文字 this.startY = touch.clientY;//获得当前按下点的纵坐标 } refreshTouchMove(e) { this.$store.commit("bottomShowFalse");//与本逻辑无关,滑动时隐藏底部作用 let touch = e.changedTouches[0]; let _move = touch.clientY - this.startY;//获得滑动的距离 this.bottomFlag = $(".present-box").offset().top + $(".present-box").height() - document.body.clientHeight <= 40;//滑动到底部标识 if ($(".present-box").offset().top >= this.headerHeight) {//内容主体超出了一个头部的距离 if (_move > 0 && _move < 1000) {//滑动距离>0代表下拉//<1000是为了防止神人无限拉阿拉 this.el.style.marginTop = _move + "px";//根据拉的距离,实现界面上的变化(界面变化) this.moveDistance = touch.clientY - this.startY;//记录滑动的距离,在松手后让他滑啊滑滑回去 if (_move > 50) {//拉到一定程度再下拉刷新,防止误操作 this.tipText = "松开即可刷新"//上面有了 } } } } refreshTouchEnd() { this.$store.commit("bottomShowTrue");//松开后底部就biu的出现啦 if (this.bottomFlag) {//若符合上拉加载的条件,则直接进行数据更新 this.$emit("loadBottom"); } let that = this; if (this.moveDistance > 50) {//拉了一定距离才触发加载动作 this.tipText = "数据加载中..."; let timer = setInterval(function () { that.el.style.marginTop = that.el.style.marginTop.split("px")[0] - 5 + "px";//如果拉的很长,一次性弹回去影响用户体验,所以先让他弹到50的高度,然后再进行数据更新 if (Number(that.el.style.marginTop.split("px")[0]) <= 50) {//小于50后就不进行界面变化了,先进行数据更新再变化 clearInterval(timer); new Promise((resolve, reject) => { that.$emit("loadTop", resolve, reject);//通知父控件,下拉刷新条件满足了,你更新吧 }).then(() => { that.resetBox(); }).catch(() => { that.resetBox();//界面恢复(也就是弹回去啦) }); } }, 1);//通过一个promise,让数据更新结束后再进行界面变化。也可以采用其他的方式,如async await方式 } else { this.resetBox(); } } resetBox() { let that = this; //使用定时器的方式,biubiubiu的实现滑动界面刷新的效果。 if (this.moveDistance > 0) { let timer = setInterval(function () { that.el.style.marginTop = that.el.style.marginTop.split("px")[0] - 1 + "px"; if (Number(that.el.style.marginTop.split("px")[0]) <= 0) clearInterval(timer);//这里很重要,不删除,可能看到奇奇怪怪的东西哦 }, 1) } this.moveDistance = 0; }核心代码就这些了,撒花完结,优化什么的,你们自己看着来咯,大佬别打我,效果图来了嘛 我就是效果图
这是我的github,欢迎大佬们猛戳,不定时更新
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/97565.html
摘要:前言现在网上下拉刷新,上拉加载插件一搜一大堆,如果你想用在生产环境,那你可以直接网上搜一个靠谱的,我所做的就是不依赖任何插件,一步一步把这个插件的过程写一下,各位同学可以在此基础上定制,没有写过插件的,可以了解下插件怎么写的,整个过程定位入 前言 现在网上 下拉刷新,上拉加载 插件一搜一大堆,如果你想用在生产环境,那你可以直接网上搜一个靠谱的,我所做的就是不依赖任何插件,一步一步把这个...
摘要:前言现在网上下拉刷新,上拉加载插件一搜一大堆,如果你想用在生产环境,那你可以直接网上搜一个靠谱的,我所做的就是不依赖任何插件,一步一步把这个插件的过程写一下,各位同学可以在此基础上定制,没有写过插件的,可以了解下插件怎么写的,整个过程定位入 前言 现在网上 下拉刷新,上拉加载 插件一搜一大堆,如果你想用在生产环境,那你可以直接网上搜一个靠谱的,我所做的就是不依赖任何插件,一步一步把这个...
摘要:最近项目要求增加一个下拉刷新的功能,自己也试着写了一个,单总是有点卡顿。 最近项目要求增加一个下拉刷新的功能,自己也试着写了一个,单总是有点卡顿。 于是学习了下别人的插件(ps : 既然写不出好插件,就要会学习别人的): 官网github地址:https://github.com/mescroll/m... 1.整体预发结构 ;(function(name, definition) {...
摘要:最近项目要求增加一个下拉刷新的功能,自己也试着写了一个,单总是有点卡顿。 最近项目要求增加一个下拉刷新的功能,自己也试着写了一个,单总是有点卡顿。 于是学习了下别人的插件(ps : 既然写不出好插件,就要会学习别人的): 官网github地址:https://github.com/mescroll/m... 1.整体预发结构 ;(function(name, definition) {...
阅读 1308·2021-11-15 11:37
阅读 2564·2021-09-22 10:56
阅读 3390·2021-09-06 15:11
阅读 801·2021-08-31 09:45
阅读 2896·2021-07-28 11:16
阅读 1805·2019-08-30 15:44
阅读 476·2019-08-30 13:22
阅读 3343·2019-08-30 13:18