微信小程序优化:如何实现图片懒加载?

本文介绍了如何在微信小程序中实现图片懒加载,以提升用户体验和减少流量消耗。懒加载能优化长列表中图片的加载速度,只在图片进入可视区域时才加载。文章提供了两种实现方式:手动实现和使用mina-lazy-image插件,并详细阐述了各自的代码实现过程。通过这种方式,可以显著改善页面性能并节省用户流量。

前言

当我们在使用微信小程序浏览图片时,不可避免地会遇到加载缓慢的情况。这不仅会影响用户体验,还会耗费用户的流量。那么,有没有一种方法可以让图片在用户需要时再进行加载,从而提升用户体验和减少流量消耗呢?答案是肯定的,这就是图片懒加载技术。在本文中,我将介绍如何使用微信小程序实现图片懒加载,为用户带来更好体验和更高的效率。


为什么要使用图片懒加载?

试想一下,在比较长的网页或应用中,如果图片很多,所有的图片都被加载出来,而用户只能看到可视窗口的那一部分图片数据,这样就浪费了性能。

图片的懒加载就是为了解决以上问题。在滚动屏幕之前,可视化区域之外的图片不会进行加载,在滚动屏幕时才加载。这样使得网页的加载速度更快,减少了服务器的负载。懒加载适用于图片较多,页面列表较长的场景中。


使用图片懒加载的优点

减少无用资源的加载,提升用户体验,如果同时加载较多图片,可能需要等待的时间较长,这样影响了用户体验,而使用懒加载就能大大的提高用户体验。防止加载过多图片而影响其他资源文件的加载。


第一种实现方式(手动实现)

wxml页面代码

<view class='item-{{index}}' wx:for="{{lazyList}}" wx:key="*this.imgUrl">
  <!-- imgBox:图片类名 loadingImgBox:懒加载图片类名 -->
  <image src='{{item.show? item.imgUrl : loading}}' class='{{item.show? "imgBox" : "loadingImgBox"}}'></image>
</view>

js页面代码

Page({
    data: {
        lazyList: [{
                imgUrl: "https://img0.baidu.com/it/u=2566646385,2213824192&fm=253&fmt=auto&app=138&f=JPEG?w=893&h=500"
            },
            {
                imgUrl: "https://img2.baidu.com/it/u=791640261,44080610&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800"
            },
            {
                imgUrl: "https://img0.baidu.com/it/u=1732772480,1050889914&fm=253&fmt=auto&app=138&f=JPEG?w=778&h=500"
            },
            {
                imgUrl: "https://img1.baidu.com/it/u=4001530358,139416054&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"
            },
            {
                imgUrl: "https://img1.baidu.com/it/u=3006525416,739516061&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800"
            },
            {
                imgUrl: "https://img1.baidu.com/it/u=961451472,675417960&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"
            },
            {
                imgUrl: "https://img0.baidu.com/it/u=4085930884,4214873769&fm=253&fmt=auto&app=120&f=JPEG?w=667&h=500"
            },
        ], //模拟数据
    },
    onLoad: function () {
        // 传入参数
        lazyImg(this, this.data.lazyList, 'lazyList', '../../assets/loading.gif')
    }
})

const lazyImg = (_that, data, name, loadingImage) => {
    for (let i = 0, len = data.length; i < len; i++) {
        wx.createIntersectionObserver().relativeToViewport({
            bottom: 20
        }).observe('.item-' + i, (ret) => {
            ret.intersectionRatio > 0 ? data[i].show = true : '';
            _that.setData({
                [name]: data,
                loading: loadingImage
            })
        })
    }
}

wxss页面代码

image {
    width: 100%;
}
/* 懒加载图片样式 */
.loadingImgBox {
    transition: opacity 0.4s linear 0.4s;
}

第二种实现方式(安装插件)

mina-lazy-image 插件

图片在视口中出现才进行加载显示,优化页面性能。

属性类型是否必填描述
srcString图片链接
placeholderString占位图片链接
modeString与 image 组件的 mode 属性一致
webpNumber与 image 组件的 webp 属性一致
showMenuByLongpressBoolean与 image 组件的 show-menu-by-longpress属性一致
stylesString设置图片样式
viewportObject默认为 {bottom: 0},配置图片显示区域

mina-lazy-image 外部样式类

image-class, image-container-class

使用

1. 微信开发工具左上角找到 “工具” 选择 “构建 npm

在这里插入图片描述


2. 微信开发工具右上角中找到详情,选择本地设置,将使用 npm 模块勾选。

在这里插入图片描述


3. 打开终端安装插件

npm install --save mina-lazy-image

代码实现

wxml页面代码

<view wx:for="{{list}}">
  <mina-lazy-image placeholder="../../assets/loading.gif" src="{{item.url}}" mode="widthFIx" image-class="custom-class-name" />
</view>

js页面代码

Page({
    data: {
        // 模拟数据
        list: [{
                url: "https://img0.baidu.com/it/u=2566646385,2213824192&fm=253&fmt=auto&app=138&f=JPEG?w=893&h=500"
            },
            {
                url: "https://img2.baidu.com/it/u=791640261,44080610&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800"
            },
            {
                url: "https://img0.baidu.com/it/u=1732772480,1050889914&fm=253&fmt=auto&app=138&f=JPEG?w=778&h=500"
            },
            {
                url: "https://img1.baidu.com/it/u=4001530358,139416054&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"
            },
            {
                url: "https://img1.baidu.com/it/u=3006525416,739516061&fm=253&fmt=auto&app=120&f=JPEG?w=1280&h=800"
            },
            {
                url: "https://img1.baidu.com/it/u=961451472,675417960&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"
            },
            {
                url: "https://img0.baidu.com/it/u=4085930884,4214873769&fm=253&fmt=auto&app=120&f=JPEG?w=667&h=500"
            },
        ],
    },
})

使用插件的 JSON 页面代码

{
  "usingComponents": {
    "mina-lazy-image": "mina-lazy-image/index"
  }
}

实现效果

在这里插入图片描述

数据接口:https://api.getweapp.com/vendor/lightstao/searchkeyhttps://api.getweapp.com/vendor/lightstao/product/search微信小程序中,懒加载特效让人头疼不已,因为小程序完全没法操作dom,所以位置的操作在小程序中,变得极其的难~~先看特效:我们将其拆分为如下几个步骤进行讲解~~1)如何获取图片的位置高度先看一张图:通过上图可以知道,图片位置高度其实可以通过img.height margin值算出。js代码:arrHight[i] = Math.floor(i/2)*(img.height   margin-bottom);为何是Math.floor(i/2)呢,因为同一排两张图片高度一样,比如i=0和i=1,通过Math.floor得出值都为0,所以可以保证同一排的两张图片位置高度是同一个值。2)替换默认图片先看效果图片:wxml代码:<image src="{{arr[index] ? productArr[index].Image : 'default.jpg'}}"></image>思路很明显,一开始arr[index]中都是false,所以默认都是default图片但是随着往下移动,有些arr[index]的值变为true,所以替换默认图片js代码:for (var i = 0; i < this.data.productArr.length; i ) {   if (arrHight[i] < scrollTop) {       if (arr[i] == false) {           arr[i] = true;       }   } }思路相当清晰,无需多言~~3)懒加载中渐显特效先看效果:wxss代码:.product_image{   opacity: 0;   width: 100%;   height: 70%;   transition: opacity 1s linear 2s; } .loaded{     opacity: 1; }其实就是opacity的一个过渡动画而已,so easy~~作者:小小小是我
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水星记_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值