一.传统的懒加载
有时一个页面中有多个图片或视频要展示,如果全部将资源加载显示,会导致页面暂时空白,用户体验很不好,要改变这种体验的一种思路是先用一个占位图片显示,然后在可视窗口展示的内容提前加载,保证用户看到的是已经加载好的图片等其他占用空间较大的资源.
例如:
//css代码:
div image[alt^='picture'] {
width: 100px;
height: 100px;
background: silver;
}
.img {
height: 200px;
width: 400px;
}
//html代码
<div id="div" style='width:400px;height:1024px'>
<image class="img" src="./time.gif" alt="picture1" data-src="./1.jpg" />
<image class="img" src="./time.gif" alt="picture2" data-src="./2.jpg" />
<image class="img" src="./time.gif" alt="picture3" data-src="./3.jpg" />
<image class="img" src="./time.gif" alt="picture4" data-src="./1.jpg" />
<image class="img" src="./time.gif" alt="picture5" data-src="./2.jpg" />
<image class="img" src="./time.gif" alt="picture6" data-src="./3.jpg" />
</div>
//js代码
var imgArr = document.getElementsByClassName('img');
var imgHeight = imgArr[0].style.height;
var clientHeight = document.documentElement.clientHeight;//获取网页可见区域高度
window.onscroll = function() {
var scrollTop = document.documentElement.scrollTop;//网页垂直方向滚动的高度
for (let i = 0; i < imgArr.length; i++) {
var offset = imgArr[i].offsetTop;//获取当前对象到其上级层顶部的距离
var topT = scrollTop - ('200' + offset);
var topB = scrollTop + clientHeight - offset;
if (topT < 0 && topB > 0) {
imgArr[i].src = imgArr[i].getAttribute('data-src');
} else {
imgArr[i].src = './time.gif';
}
}
}
页面刚开始如下图所示,
当滚动鼠标时,图片陆续显示
二.微信小程序中的懒加载
微信小程序是监听目标节点和参照区域相交的状态来实现懒加载
//wxml代码:
<view>
<view>懒加载示例</view>
<view class="img-contain" wx:for="{{imgArr}}" wx:key="*this" wx:for-item="item" wx:for-index="index">
<image class="img" src="{{item.src}}" data-src="{{item.realSrc}}">
</image>
<view class="img-title">{{item.title}}</view>
</view>
</view>
//js代码:
Page({
data: {
imgArr: [{
title: 'picture1',
src: '../../images/timg.gif',
realSrc: '../../images/1.jpg'
},
{
title: 'picture2',
src: '../../images/timg.gif',
realSrc: '../../images/2.jpg'
},
{
title: 'picture3',
src: '../../images/timg.gif',
realSrc: '../../images/3.jpg'
}, {
title: 'picture4',
src: '../../images/timg.gif',
realSrc: '../../images/4.jpg'
}
]
},
onLoad(options) {
var _self = this;
var obs = wx.createIntersectionObserver(this, { observeAll: true });
obs.relativeToViewport({ bottom: 100 }).observe('.img', function(res) {
_self.data.imgArr.forEach(function(item) {
if (res.dataset.src == item.realSrc) {
if (res.intersectionRatio > 0) {
item.src = res.dataset.src;
} else {
item.src = '../../images/timg.gif';
}
_self.setData({ imgArr: _self.data.imgArr });
}
})
})
},
})
如图所示:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。