2

一.传统的懒加载

有时一个页面中有多个图片或视频要展示,如果全部将资源加载显示,会导致页面暂时空白,用户体验很不好,要改变这种体验的一种思路是先用一个占位图片显示,然后在可视窗口展示的内容提前加载,保证用户看到的是已经加载好的图片等其他占用空间较大的资源.
例如:

//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';
      }
    }
  }

页面刚开始如下图所示,

clipboard.png
当滚动鼠标时,图片陆续显示

clipboard.png

clipboard.png

二.微信小程序中的懒加载

微信小程序是监听目标节点和参照区域相交的状态来实现懒加载

//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 });
        }
      })
    })
  },
})

如图所示:
clipboard.png

clipboard.png


Delia
75 声望3 粉丝

路漫漫其修远兮,吾将上下而求索。


« 上一篇
javascript事件