• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

        什么是懶加載?小程序中圖片懶加載的2種完成方法

        什么是懶加載?小程序中圖片懶加載的2種完成方法

        更新時間:2025-09-20 文章作者:未知 信息來源:網絡 閱讀次數:

        微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
        微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
        本篇文章給大家帶來的內容是關于什么是懶加載?小程序中圖片懶加載的兩種實現方法 ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

        定義

        懶加載,前端人都知道的一種性能優化方式,簡單的來說,只有當圖片出現在瀏覽器的可視區域內時,才設置圖片正真的路徑,讓圖片顯示出來。這就是圖片懶加載。

        實現原理

        監聽頁面的scroll事件,判讀元素距離頁面的top值是否是小于等于頁面的可視高度

        判斷邏輯代碼如下

        element.getBoundingClientRect().top <= document.documentElement.clientHeight ? 顯示 : 默認

        我們知道小程序頁面的腳本邏輯是在JsCore中運行,JsCore是一個沒有窗口對象的環境,所以不能在腳本中使用window,也無法在腳本中操作組件。

        所以關于圖片懶加載就需要在數據上面做文章了。

        頁面

        頁面上面只需要根據數據的某一個字段來判斷是否顯示圖片就可以了,字段為Boolean類型,當為false的時候顯示默認圖片就行了。

        代碼大概長成這樣

        <view wx:for="{{list}}" class='item item-{{index}}'
         wx:key="{{index}}">
            <image class="{{item.show ? 'active': ''}}" src="{{item.show ? item.src : item.def}}"></image>
        </view>

        布局跟簡單,view組件里面有個圖片,并循環list,有多少就展示多少

        image組件的src字段通過每一項的show來進行綁定,active是加了個透明的過渡

        樣式

        image{
            transition: all .3s ease;
            opacity: 0;
        }
        .active{
            opacity: 1;
        }

        邏輯

        本位主要講解懶加載,所以把數據寫死在頁面上了

        數據結構如下:

        428961300-5b94c62aa3c9e_articlex.jpg

        我們使用兩種方式來實現懶加載,準備好沒有,一起來快樂的擼碼吧。

        WXML節點信息

        小程序支持調用createSelectQuery創建一個SelectorQuery實例,并使用select方法來選擇節點,并通過boundingClientRect來獲取節點信息。

        wx.createSelectorQuery().select('.item').boundingClientRect((ret)=>{
            console.log(ret)
        }).exec()

        顯示結果如下

        2959195174-5b94c62a9e79c_articlex.jpg悄悄告訴你,小程序里面有個onPageScroll函數,是用來監聽頁面的滾動的。
        還有個getSystemInfo函數,可以獲取獲取系統信息,里面包含屏幕的高度。

        接下來,思路就透徹了吧。還是上面的邏輯, 扒拉扒拉直接寫代碼就行了,這里只寫下主要的邏輯

        showImg(){
            let group = this.data.group
            let height = this.data.height  // 頁面的可視高度
            
            wx.createSelectorQuery().selectAll('.item').boundingClientRect((ret) => {
             ret.forEach((item, index) => {
               if (item.top <= height) { 判斷是否在顯示范圍內
                 group[index].show = true // 根據下標改變狀態
               }
             })
             this.setData({
               group
             })
            }).exec()
        
        }
        onPageScroll(){ // 滾動事件
            this.showImg()
        }

        至此,我們完成了一個小程序版的圖片懶加載,只是思維轉變了下,其實并沒有改變實現方式。我們來學些新的東西吧。

        節點布局相交狀態

        節點相交狀態是啥?它是一個新的API,叫做IntersectionObserver, 本文只講解簡單的使用,了解更多請猛戳沒錯,就是點我

        小程序里面給它的定義是節點布局交叉狀態API可用于監聽兩個或多個組件節點在布局位置上的相交狀態。這一組API常常可以用于推斷某些節點是否可以被用戶看見、有多大比例可以被用戶看見。

        里面設計的概念主要有五個,分別為

        參照節點:以某參照節點的布局區域作為參照區域,參照節點可以有多個,多個話參照區域取它們的布局區域的交集

        目標節點:監聽的目標,只能是一個節點

        相交區域:目標節點與參照節點的相交區域

        相交比例:目標節點與參照節點的相交比例

        閾值:可以有多個,默認為[0], 可以理解為交叉比例,例如[0.2, 0.5]

        關于它的API有五個,依次如下

        1、createIntersectionObserver([this], [options]),見名知意,創建一個IntersectionObserver實例

        2、intersectionObserver.relativeTo(selector, [margins]), 指定節點作為參照區域,margins參數可以放大縮小參照區域,可以包含top、left、bottom、right四項

        3、intersectionObserver.relativeToViewport([margin]),指定頁面顯示區域為參照區域

        4、intersectionObserver.observer(targetSelector, callback),參數為指定監聽的節點和一個回調函數,目標元素的相交狀態發生變化時就會觸發此函數,callback函數包含一個result,下面再講

        5、intersectionObserver.disconnect() 停止監聽,回調函數不會再觸發

        然后說下callback函數中的result,它包含的字段為

        字段名類型說明
        intersectionRatioNumber相交比例
        intersectionRectObject相交區域的邊界,包含 left 、 right 、 top 、 bottom 四項
        boundingClientRectObject目標節點布局區域的邊界,包含 left 、 right 、 top 、 bottom 四項
        relativeRectObject參照區域的邊界,包含 left 、 right 、 top 、 bottom 四項
        timeNumber相交檢測時的時間戳

        我們主要使用intersectionRatio進行判斷,當它大于0時說明是相交的也就是可見的。

        先來波測試題,請說出下面的函數做了什么,并且log函數會執行幾次

        1、
        wx.createIntersectionObserver().relativeToViewport().observer('.box', (result) => {
             console.log('監聽box組件觸發的函數')   
         })
         
        2、
        wx.createIntersectionObserver().relativeTo('.box').observer('.item', (result) => {
             console.log('監聽item組件觸發的函數') 
        })
        
        3、
        wx.createIntersectionObserver().relativeToViewport().observer('.box', (result) => {
            if(result.intersectionRatio > 0){
                console.log('.box組件是可見的') 
            }
        })

        duang,揭曉答案。

        第一個以當前頁面的視窗監聽了.box組件,log會觸發兩次,一次是進入頁面一次是離開頁面

        第二個以.box節點的布局區域監聽了.item組件,log會觸發兩次,一次是進入頁面一次是離開頁面

        第三個以當前頁面的視窗監聽了.box組件,log只會在節點可見的時候觸發

        好了,題也做了,API你也掌握了,相信你已經可以使用IntersectionObserver來實現圖片懶加載了吧,主要邏輯如下

        let group = this.data.group // 獲取圖片數組數據
        for (let i in this.data.group){   wx.createIntersectionObserver().relativeToViewport().observe('.item-'+ i, (ret) => {
               if (ret.intersectionRatio > 0){
                 group[i].show = true 
               }
               this.setData({
                 group
               })
             })
        }

        最后

        至此,我們使用兩種方式實現了小程序版本的圖片懶加載,可以發現,使用IntersectionObserver來實現不要太酸爽。

        相關推薦:

        Javascript實現圖片懶加載插件的方法

        用Js實現懶加載和跨域的實現步驟

        以上就是什么是懶加載?小程序中圖片懶加載的兩種實現方法的詳細內容,更多請關注php中文網其它相關文章!


        小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 精品四虎免费观看国产高清午夜| 亚洲视频一区二区三区四区| 免费国产a国产片高清| 久久99九九国产免费看小说| 在线看片免费不卡人成视频| 亚洲熟妇无码AV| 亚洲人成色777777精品| 日韩在线视精品在亚洲| 无码精品人妻一区二区三区免费| 日本永久免费a∨在线视频| 亚洲综合色婷婷七月丁香| 国内精品免费在线观看| 91国内免费在线视频| AV免费网址在线观看| 亚洲av女电影网| 国产免费久久精品丫丫| 亚洲AV日韩AV鸥美在线观看| 亚洲人成在线中文字幕| 亚洲精品无码中文久久字幕| 美景之屋4在线未删减免费| 免费无码午夜福利片69| 免费在线中文日本| 毛片免费vip会员在线看| 亚洲国产高清精品线久久| 亚洲人成77777在线播放网站| 亚洲另类春色国产精品| 美女视频黄a视频全免费网站色| 中国黄色免费网站| 国产精品视_精品国产免费| 亚洲黄网在线观看| 久久久久久久国产免费看| 成年性午夜免费视频网站不卡| 久久精品亚洲中文字幕无码网站| 精品韩国亚洲av无码不卡区| 成年男女男精品免费视频网站| 亚洲大尺度无码专区尤物| 欧美激情综合亚洲一二区| 亚洲精品免费网站| 亚洲热线99精品视频| 猫咪免费观看人成网站在线| 97视频热人人精品免费|