有时一个页面中有多个图片或视频要展现,若是所有将资源加载显示,会致使页面暂时空白,用户体验很很差,要改变这种体验的一种思路是先用一个占位图片显示,而后在可视窗口展现的内容提早加载,保证用户看到的是已经加载好的图片等其余占用空间较大的资源.
例如:css
//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'; } } }
页面刚开始以下图所示,html
当滚动鼠标时,图片陆续显示 小程序
微信小程序是监听目标节点和参照区域相交的状态来实现懒加载微信小程序
//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 }); } }) }) }, })
如图所示:微信