一、原始方法实现
wxml代码
<view class='item-{{index}}' wx:for="{{lazyList}}" wx:key="*this.imgUrl">
<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', 'https://img0.baidu.com/it/u=307567652,4252156023&fm=253&fmt=auto&app=138&f=JPEG?w=501&h=334')
}
})
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 插件

mina-lazy-image 外部样式类
image-class, image-container-class
使用流程
-
- 微信开发工具左上角找到 “
工具” 选择 “构建npm”

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

npm install --save mina-lazy-image
页面代码
<view wx:for="{{list}}">
<mina-lazy-image placeholder="https://img0.baidu.com/it/u=307567652,4252156023&fm=253&fmt=auto&app=138&f=JPEG?w=501&h=334" src="{{item.url}}" mode="widthFIx" image-class="custom-class-name" />
</view>
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"
},
],
},
})
{
"usingComponents": {
"mina-lazy-image": "mina-lazy-image/index"
}
}
三、 文档属性实现
特别注意:图片懒加载只针对 page 与 scroll-view 下的 image 有效。
| 属性名 | 类型 | 默认值 | 说明 |
|---|
| lazy-load | Boolean | false | 图片懒加载,在即将进入一定范围(上下三屏)时才开始加载 |
- 因此,我们只需在
image 属性中增加该属性就可以了
隐藏属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|
| lazy-load-margin | Number | — | 图片懒加载屏数阈值,在即将进入设置的屏数才开始加载 |
特别注意:图片懒加载只针对 page 与 scroll-view 下的 image 有效。