1. 程式人生 > >微信小程式-自定義下拉重新整理

微信小程式-自定義下拉重新整理

最近給別個公司做技術支援,要實現微信小程式上拉重新整理與下拉載入更多

微信給出的介面不怎麼友好,最終想實現效果類似QQ手機版 ,一共3種下拉重新整理狀態變化,文字+圖片+背景顏色

最終實現後的效果(這裡提示有個不同點就是,自定義了導航條,並且下拉的時候,自定義導航條必須固定)

小程式實現下拉載入2種方式:

1. 簡單粗暴,直接開啟enablePullDownRefresh,開啟全域性下拉重新整理

2.利用scroll-view元件

簡單分析下2種方式的利與弊

enablePullDownRefresh方式

  • 優點:簡單粗暴,相容性沒問題
  • 缺點1: 只能配置背景顏色,沒有圖片與狀態提示的變化。
  • 缺點2: 最重要的一點,如果自定義了導航條即使採用fixed定位,整個導航條還是會隨頁面一起往下拉動,整個佈局效果非常變扭。這才是我放棄的最終原因(參考最終效果圖,自定義了導航條)

scroll-view方式

  • 優點:可以自定義(參考最終效果圖)
  • 缺點:安卓與微信存在不同的相容問題,所以針對2套平臺要有2套處理方式,比較麻煩

實現原理:

enablePullDownRefresh的方式沒啥好說的,按照文件的來。

scroll-view方式的就比較麻煩了,首先說下引起問題的2個因素點

  • 自定義了導航條
  • IOS上有橡皮筋效果,安卓沒有

自定義了導航條,那麼頁面的佈局一定要減去這個導航條的佔位,所以scroll-view包裹的區域,一定會有一個定位處理,top的定位距離就是導航條的高度。

IOS上scroll-view的實現原理

IOS預設存在橡皮筋效果那麼意味著就會有反彈反饋,元素滾動一定會有scrollTop的變化,那麼利用scrollTop的變化就能很好的實現

為了滾動的效能最大優化,所以預設都是用系統自帶滾動,並不會做控制頁面內容本身的滑動

佈局的時候,原來的滾動內容部分用scroll-view包裝,並且在之前加上下拉重新整理的展示區域view,利用translateY把scroll-view的top設定為負值(展示區域的高度),這樣就把下拉的顯示區域拼接到了scroll-view之前,並且還看不到

在下拉scroll-view的時候,由於ios支援橡皮筋效果,所以scrollTop為負值的時候,展示區域自動會隨著scrollTop的遞減而出現。

狀態的與圖片的變化,可以通過監聽scroll事件,通過scrollTop值的變化,做出相應的改變。當然這裡還會有scrolltolower與touchend事件,要知道什麼時候鬆手後觸發重新整理,並且重新整理之後還要設定還原

安卓上scroll-view的實現原理

安卓就這樣,沒有反彈效果,所以scrollTop也不會有負數。這時候只能靠手動移動頁面模擬反彈了。

安卓上需要對scroll-view繫結 start,move,end,scroll,upper事件,要監聽使用者的頁面操作,當然如果是正常滾動內容的時候,不影響,也不做任何處理,一旦使用者是下拉重新整理操作,才介入

頁面的佈局也是由下拉重新整理的展示區域+包裹內容的scroll-view區域組成,不同於ios佈局的就是,下拉重新整理區域預設高度是0,scroll-view也不需要設定translateY負值了,需要下拉的時候調整展示區域的高度

通過lower事件判斷是邊界,如果下拉越界,那麼通過move控制scroll-view區域整體的往下滑動同時控制下拉重新整理區域的高度變化,這樣就實現了下拉的效果

最後在end中,判斷下移動的距離跟重新整理的高度對比,從而更改下拉的狀態與圖片,並且觸發重新整理請求,最後可以動畫復位

封裝

一般這種功能直接做成元件就好了,ios與安卓可以獨立2個元件,然後註冊到一箇中介的元件中,判斷呼叫哪個,這樣比較好維護。

元件內部可以分成3部分

123 view下拉重新整理區域slot內容的slot區域view上拉載入更多區域

不過注意一點,slot一定要加高度,加高度。因為ios預設是反彈,滾動的,如果沒有內容,或者內容高度不足,沒撐開全部,那麼就會觸發預設滾動,頁面的導航條會上下移動

123 <view style="min-height:100%;"><slot></slot></view>
結尾

由於自定義了導航條,引起了一堆的問題出來,說不上好與壞,反正遇到問題總是要想辦法解決的。

這裡簡單的記錄下,給初入小程式的當個借鑑吧。可能我也有處理不對的,或者有更好的方法,可以給下建議。

程式碼部分如果有需要,等有空了,我就分離出來發一份咯。

相關推薦

程式-定義重新整理

最近給別個公司做技術支援,要實現微信小程式上拉重新整理與下拉載入更多 微信給出的介面不怎麼友好,最終想實現效果類似QQ手機版 ,一共3種下拉重新整理狀態變化,文字+圖片+背景顏色 最終實現後的效果(這裡提示有個不同點就是,自定義了導航條,並且下拉的時候,自定義導航條必須固定) 小程式實現下拉載入2種方

程式定義重新整理

自定義元件: js: // components/test/test.js Component({ /** * 元件的屬性列表 */ properties: { }, /** * 元件的初始資料 */ data: { scrollHeight

程式實戰篇-重新整理與載入更多

下拉重新整理 實現下拉重新整理目前能想到的有兩種方式 呼叫系統的API,系統有提供下拉重新整理的API介面   下拉重新整理API.png 監聽scroll-view,自定義下拉重新整理,還記得scroll-view裡面有一個bindscrollto

程式-定義固定

開發十年,就只剩下這套架構體系了! >>>   

程式定義分享彈窗

效果圖: 多種觸發條件使用同一個彈窗: *.js觸發處: this.setData({ isWrong:true, wrongtap:1, dialogWord:"wrong", wrongDec:"答案錯誤,是否向好友求助?" })  

程式定義導航欄 navigation bar 返回鍵 首頁

微信小程式自定義導航欄(wx_custom_navigation_bar) 自定義返回鍵、首頁鍵,動態設定標題,響應式元件 版本號:1.0.0 作者:chen-yt github: https://github.com/chen-yt/wx_custom_navigation

程式 定義 swiper 樣式

本文出自: http://blog.csdn.net/wyk304443164 實現功能如下: 僅重寫了swiper的樣式,so fucking easy! wx-swiper-item { width: 90% !important; mar

解決程式定義彈窗,滑動定義彈窗底部的頁面也一起跟著滑動的問題

解決方案,我總結了以下幾種 1、控制底部根目錄scroll-view 的scroll-y屬性的true/false,控制底部滾動以及不滾動 2、在自定義彈框最外層元素加上catchtouchmove=’true’ ;或者catchtouchmove="preventTouchMove"

程式 定義元件之《轉盤》

微信小程式支援簡潔的元件化程式設計 開發者可以將頁面內的功能模組抽象成自定義元件,以便在不同的頁面中重複使用;也可以將複雜的頁面拆分成多個低耦合的模組,有助於程式碼維護。自定義元件在使用時與基礎元件非常相似。 這篇博文主要就是分享個自己實際專案中用到的 轉盤自定義元件 專案

程式定義欄位實現選項的動態新增和刪除

問題描述: 在自定義選項中,點選新增選項按鈕,會出現一個選項的輸入框,輸入的選項可以通過點選左側的減號刪除 效果如圖: 解決過程: 1.首先寫出大體的框架。在pages下,建立了一個selfdefine的資料夾,在wxml中寫出靜態結構 selfdefine.wxml 說明

程式定義全屏遮罩

效果如下: 1、wxml <view class='' bindtap='showMask'>顯示遮罩</view> <view class="mask" hidden="{{flag}}"> <view class="maskConten

程式 定義三列城市彈窗

1.WXML <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}"

程式----定義元件

微信小程式充分借鑑了vue的程式碼風格,但是卻沒有像vue那樣的高效的元件特性。但是這一備受詬病的地方在小程式1.6.3版本得到了解決。 從小程式基礎庫版本 1.6.3 開始,小程式支援簡潔的元件化程式設計。所有自定義元件相關特性都需要基礎庫版本 1.6.3 或更高。 接下來,

程式定義屬性設定和獲取(data-)

自定義屬性語法以data-開頭: <block wx:for='{{post_key}}' wx:key="key" wx:for-item='item'> <view catchtap='onPostTap' data-postid="{{item.postId}}

程式——定義元件時,編譯報`Component is not found in path '...'`

問題描述: 在微信小程式中自定義元件時,編譯報Component is not found in path '...' VM4941:1 jsEnginScriptError Component is not found in path "components/watermark

程式-定義彈出層

效果圖 WXML <view class='popup' wx:if="{{popShow}}"> <view class='mask' catchtouchmove="preventTouchMove" catchtap='closePop'&g

程式--定義元件之搜尋框

元件:搜尋框 功能:根據輸入框輸入值進行模糊查詢並在下方滑動框中顯示 功能圖:     component.wxml <!--自定義元件--> <!---搜尋框 start--> <view class='main'&

程式如何實現框效果?(程式碼示例)

wxml程式碼: <view class='top-text'> 選擇接收班級</view> <!-- 下拉框 --> <view class='top-selected' bindtap='bindShowMsg'> <

程式 定義單選複選按鈕組的實現(用於實現購物車產品列表功能)

  (一)單選按鈕組 模型圖如下:  index.js Page({ data: { parameter: [{ id: 1, name: '銀色' }, { id: 2, name: '白色' },{ id: 3, name: '黑色' }],//模擬商

程式定義元件(一)

好吧,突然發現學不完了,一下子,那就分開吧,由於時間太久,直接重新大致複習了一下 微信小程式自定義元件微信小程式支援自定義元件下方的目錄其中,components為元件目錄,nodemodules為模組目錄,pages為小程式的頁面目錄,utils為一些基礎功能的封