摘要:也可以采用其他的方式,如方式使用定時器的方式,的實現(xiàn)滑動界面刷新的效果。
1.界面上,只分成簡單的兩塊,一塊是上方的刷新文字,一塊是下方的內(nèi)容,然后將上方提示內(nèi)容隱藏在屏幕之外,一般由兩種方式,一種是上面遮一層,另一種是marginTop:負(fù)值將其弄出屏幕外,這里我采用的是第一種,代碼也很簡單,就隨便貼一下
.header{???? width:?100%;???? height:?1rem;這里的高度應(yīng)該與刷新文字一樣高???? position:?fixed;???? z-index:?100; }
2.功能實現(xiàn)的重頭戲是在邏輯上,主要分成下面幾個部分
監(jiān)聽事件
位置計算
控制界面變化
數(shù)據(jù)更新包
我一個一個進行分析,然后帶你們?nèi)肟印?/p>
//el為下拉的整個節(jié)點//這里為添加監(jiān)聽 this.el.addEventListener("touchstart",?this.refreshTouchStart); this.el.addEventListener("touchmove",?this.refreshTouchMove); this.el.addEventListener("touchend",?this.refreshTouchEnd);//記住在不用的時候要移除監(jiān)聽哦 this.el.removeEventListener("touchstart",?this.refreshTouchStart); this.el.removeEventListener("touchmove",?this.refreshTouchMovee); this.el.removeEventListener("touchend",?this.refreshTouchEnd);//具體的函數(shù),我們直接在位置計算中看
下拉刷新的邏輯 = 當(dāng)前頁面的首項在屏幕中且容器向下滑動的距離大于一定值
上拉加載的邏輯 = 當(dāng)前頁面已滑動到底部
好,我們直接看具體的實現(xiàn)邏輯代碼
//代碼中包含界面變化和數(shù)據(jù)更新,仔細看哦 refreshTouchStart(e)?{???? let?touch?=?e.changedTouches[0];???? this.tipText?=?"下拉刷新";//下拉提示文字???? this.startY?=?touch.clientY;//獲得當(dāng)前按下點的縱坐標(biāo) } refreshTouchMove(e)?{???? this.$store.commit("bottomShowFalse");//與本邏輯無關(guān),滑動時隱藏底部作用???? let?touch?=?e.changedTouches[0];???? let?_move?=?touch.clientY?-?this.startY;//獲得滑動的距離???? this.bottomFlag?=?$(".present-box").offset().top?+ $(".present-box").height()?-?document.body.clientHeight?<=?40;//滑動到底部標(biāo)識???? if?($(".present-box").offset().top?>=?this.headerHeight)?{//內(nèi)容主體超出了一個頭部的距離???????? if?(_move?>?0?&&?_move?1000)?{//滑動距離>0代表下拉//<1000是為了防止神人無限拉阿拉???????????? this.el.style.marginTop?=?_move?+?"px";//根據(jù)拉的距離,實現(xiàn)界面上的變化(界面變化)???????????? this.moveDistance?=?touch.clientY?-?this.startY;//記錄滑動的距離,在松手后讓他滑啊滑滑回去???????????? if?(_move?>?50)?{//拉到一定程度再下拉刷新,防止誤操作???????????????? this.tipText?=?"松開即可刷新"http://上面有了???????????? }???????? } } } refreshTouchEnd()?{???? this.$store.commit("bottomShowTrue");//松開后底部就biu的出現(xiàn)啦???? if?(this.bottomFlag)?{//若符合上拉加載的條件,則直接進行數(shù)據(jù)更新???????? this.$emit("loadBottom");???? }???? let?that?=?this;???? if?(this.moveDistance?>?50)?{//拉了一定距離才觸發(fā)加載動作???????? this.tipText?=?"數(shù)據(jù)加載中...";???????? let?timer?=?setInterval(function?()?{???????????? that.el.style.marginTop?=?that.el.style.marginTop.split("px")[0]?-?5?+?"px";//如果拉的很長,一次性彈回去影響用戶體驗,所以先讓他彈到50的高度,然后再進行數(shù)據(jù)更新???????????? if?(Number(that.el.style.marginTop.split("px")[0])?<=?50)?{//小于50后就不進行界面變化了,先進行數(shù)據(jù)更新再變化???????????????? clearInterval(timer);???????????????? new?Promise((resolve,?reject)?=>?{???????????????????? that.$emit("loadTop",?resolve,?reject);//通知父控件,下拉刷新條件滿足了,你更新吧???????????????? }).then(()?=>?{ that.resetBox();???????????????? }).catch(()?=>?{ ?????????????????? that.resetBox();//界面恢復(fù)(也就是彈回去啦)???????????????? });??????????? }??????? },?1);//通過一個promise,讓數(shù)據(jù)更新結(jié)束后再進行界面變化。也可以采用其他的方式,如async?await方式??? ? }?else?{ this.resetBox();???? } } resetBox()?{ ????let?that?=?this;????//使用定時器的方式,biubiubiu的實現(xiàn)滑動界面刷新的效果。???? 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;???? }核心代碼就這些了,撒花完結(jié),優(yōu)化什么的,你們自己看著來咯,大佬別打我,效果圖來了嘛 我就是效果圖
這是我的github,歡迎大佬們猛戳,不定時更新
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97565.html
摘要:前言現(xiàn)在網(wǎng)上下拉刷新,上拉加載插件一搜一大堆,如果你想用在生產(chǎn)環(huán)境,那你可以直接網(wǎng)上搜一個靠譜的,我所做的就是不依賴任何插件,一步一步把這個插件的過程寫一下,各位同學(xué)可以在此基礎(chǔ)上定制,沒有寫過插件的,可以了解下插件怎么寫的,整個過程定位入 前言 現(xiàn)在網(wǎng)上 下拉刷新,上拉加載 插件一搜一大堆,如果你想用在生產(chǎn)環(huán)境,那你可以直接網(wǎng)上搜一個靠譜的,我所做的就是不依賴任何插件,一步一步把這個...
摘要:前言現(xiàn)在網(wǎng)上下拉刷新,上拉加載插件一搜一大堆,如果你想用在生產(chǎn)環(huán)境,那你可以直接網(wǎng)上搜一個靠譜的,我所做的就是不依賴任何插件,一步一步把這個插件的過程寫一下,各位同學(xué)可以在此基礎(chǔ)上定制,沒有寫過插件的,可以了解下插件怎么寫的,整個過程定位入 前言 現(xiàn)在網(wǎng)上 下拉刷新,上拉加載 插件一搜一大堆,如果你想用在生產(chǎn)環(huán)境,那你可以直接網(wǎng)上搜一個靠譜的,我所做的就是不依賴任何插件,一步一步把這個...
摘要:最近項目要求增加一個下拉刷新的功能,自己也試著寫了一個,單總是有點卡頓。 最近項目要求增加一個下拉刷新的功能,自己也試著寫了一個,單總是有點卡頓。 于是學(xué)習(xí)了下別人的插件(ps : 既然寫不出好插件,就要會學(xué)習(xí)別人的): 官網(wǎng)github地址:https://github.com/mescroll/m... 1.整體預(yù)發(fā)結(jié)構(gòu) ;(function(name, definition) {...
摘要:最近項目要求增加一個下拉刷新的功能,自己也試著寫了一個,單總是有點卡頓。 最近項目要求增加一個下拉刷新的功能,自己也試著寫了一個,單總是有點卡頓。 于是學(xué)習(xí)了下別人的插件(ps : 既然寫不出好插件,就要會學(xué)習(xí)別人的): 官網(wǎng)github地址:https://github.com/mescroll/m... 1.整體預(yù)發(fā)結(jié)構(gòu) ;(function(name, definition) {...
閱讀 1322·2021-11-15 11:37
閱讀 2580·2021-09-22 10:56
閱讀 3401·2021-09-06 15:11
閱讀 814·2021-08-31 09:45
閱讀 2914·2021-07-28 11:16
閱讀 1816·2019-08-30 15:44
閱讀 487·2019-08-30 13:22
閱讀 3354·2019-08-30 13:18