如何在微信、支付寶小程序內實現骨架屏效果

首先了解下什么是骨架屏?

骨架屏就是在頁面數據尚未加載前先給用戶展示出頁面的大致結構,直到請求數據返回后再渲染頁面,補充進需要顯示的數據內容。常用于文章列表、動態列表頁等相對比較規則的列表頁面。 很多項目中都有應用餓了么h5版本,知乎,facebook等網站中都有應用。
以下圖舉例,常用餓了么的童鞋,應該看到過餓了么的這個首頁預加載圖的效果:
餓了么h5實現方案

網上查找的餓了么的圖,如侵權聯系刪除.png

咱們來聊聊小程序的實現方案:
1.最簡單最快捷的最暴力的,直接讓設計一張圖片蓋上去,當loading使用。

舉例:餓了么的訂單頁面,查看了下源碼,是使用的SVG的圖


image.png
2.前端使用view寫死一套數據(缺點很明顯,假如頁面布局有修改的話,那么除了修改業務代碼之外還需要額外修改骨架屏,增加了維護的成本)

舉例:簡單寫了個代碼片段:https://developers.weixin.qq.com/s/ZAuYzHmX7ObC

image.png

3.頁面Data里寫死一套默認數據,使用小程序的wx.createSelectorQuery().selectAll 選擇了所有要渲染的矩形和圓形節點,在頁面中,使用循環,遍歷出所有的節點,再加上樣式。
基本原理就是
  • 在組建初始化時,設置其絕對定位,大小為整個屏幕大小
  • 然后用節點查詢方法,找到類名等于skeleton的元素,并設置組件的背景的位置及大小和元素的一致,覆蓋這個元素。
  • 用節點查詢方法,找到所有的類名等于skeleton-radius 元素,并將它們的位置及大小信息加入到sklection-radius-Arr數組中,在wxml中用wx:for循環渲染出來(也是絕對定位)
  • 用節點查詢方法,找到所有的類名等于skeleton-rect 元素,并將它們的位置及大小信息加入到sklection-rect-Arr數組中,在wxml中用wx:for循環渲染出來(也是絕對定位)

當然啦,這里還有一些判斷,還可以設置屏幕上提示是旋轉小圈圈還是背景色漸變提醒等,都是一些比較細節的東西,就不細說。
具體代碼參考:jayZOU,這里有他具體源碼以及實現邏輯,使用后會發現有些許異常未處理。

那么到這就完了嗎?當然木有,現在說下最后一種方案(目前我們小程序正在使用的方案)。

4. 如何更好的把骨架屏代碼嵌入到業務里面,是否可以在接口請求成功后,先渲染出一套接口返回的數據匹配的骨架,再展示給用戶看呢,減少用戶查看白屏(loading)時間。

這是我們線上版本效果示例圖:

image.png

首先來看 如何操作:
整個前邊部分跟jayZOU的邏輯思路一樣,使用wx.createSelectorQuery 獲取到相關節點進行渲染操作,但是我們把默認數據這一欄更改為動態數據,并且兼容修復了一部分bug。
核心代碼就是自定義組件內拋出的isNodes和isComplete屬性

//wxml
<skeletons isNodes="{{isNodes}}" isComplete="{{isComplete}}"" />
//頁面節點上需要手動添加一個樣式類。
比如輪播圖 寬686rpx,高140rox,是長方形那么給他的樣式上加上‘skeletions-rect’,如果是圓形給他加上‘skeletons-circle’

業務內代碼如下:
<!-- 輪播圖組件 -->
  <block wx:if="{{swiperData.length > 0}}">
    <swiper class="swiperSlide" indicator-dots="{{indicatorDots}}" indicator-color="#ccc" indicator-active-color="#00CC88" autoplay circular>
      <block wx:for="{{swiperData}}" wx:key="{{index}}">
        <swiper-item>
          <view class="swiper-item">
            <image lazy-load src="{{item.image}}" data-index="{{index}}" bindtap="universalJump" class="skeletons-rect" />
          </view>
        </swiper-item>
      </block>
    </swiper>
    <!-- <qts-swiper resourseFrom="{{swiperData}}" indicatorDots="{{indicatorDots}}"></qts-swiper> -->
  </block>
相關JS如下:
  initData() {
    let postData = {
        townId: wx.getStorageSync('townId') || 87
    }
    // 初始化請求第一個接口
    app.postAjax('https://url.com', postData).then((res) => {
      if (res.success) {
        this.setData({
          bodyData: res.data,  //頁面展示數據的大對象
          isNodes: true //抓取節點繪制骨架屏
        }, () => {
          this.setData({
            isComplete: true  //節點繪制完成,隱藏骨架屏
          })
        })
      } else {
        util.toast(res.msg || '團團開小差啦,請稍后重試')
      }
    }, () => {
      util.toast('團團開小差啦,請稍后重試')
    })
  },
目前遇到的難點在于,把功能點抽成自定義組件。skeletons的class類無法傳遞進去,試過用外部樣式影響自定義組件樣式,還是無法達到效果。如果有解決這個問題的歡迎留言溝通優化~

最后完整組件代碼地址:https://gitee.com/minchangyong/skeletons

已新增支付寶版本

社區關注可以走一走哦~:

微信點我去關注
支付寶點我去關注

青團社招聘:

招聘崗位:資深前端開發工程師P6及以上
坐標杭州市余杭區文一西路1380號金之源大廈11層

簡歷投遞到:hr@qtshe.com

職位描述:

1、負責前端模塊(PC、移動、小程序)的重要方案設計與研發
2、研究和探索創新的開發思路和前端技術,優化前端框架、設計方案,提高前端的開發交付效率。
3、理解產品業務的基礎上,提升產品用戶體驗,技術驅動業務發展。
4、定期組織主題分享,活躍技術氛圍,帶動組員提升技術能力

任職資格與條件要求描述
1、對 MVC/MVMM 有一定的理解,至少熟練掌握一個或多個前端框架(React、Vue等)
2、代碼結構清晰,javascript基礎扎實,精通任意一門前端MV*框架,如Vue、React等
3、熟悉 HTTP 協議,熟悉 Web 應用的性能優化,監控,分析方法
4、溝通能力強,責任心強,思維邏輯性強

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373