详解性能更优越的小程序图片懒加载方式


Posted in Javascript onJuly 18, 2018

意义

懒加载或者可以说是延迟加载,针对非首屏或者用户"看不到"的地方延迟加载,有利于页面首屏加载速度快、节约了流量,用户体验好

实现方式

传统H5的懒加载方式都是通过监听页面的scroll事件来实现的,结合viewport的高度来判断。

小程序也类似,通过监听页面onPageScroll事件获取当前滚动的数据,结合getSystemInfo获取设备信息来判断。由于scroll事件密集发生,计算量很大,经常会造成FPS降低、页面卡顿等问题。

这里说的是通过另外一种方式来实现

createIntersectionObserver

小程序基础库 1.9.3 开始支持,了解下

节点布局交叉状态API可用于监听两个或多个组件节点在布局位置上的相交状态。这一组API常常可以用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见。

API涉及到的概念总共有5个

  • 参照节点:监听的参照节点,取它的布局区域作为参照区域。如果有多个参照节点,则会取它们布局区域的 交集 作为参照区域。页面显示区域也可作为参照区域之一。
  • 目标节点:监听的目标,默认只能是一个节点(使用 selectAll 选项时,可以同时监听多个节点)。
  • 相交区域:目标节点的布局区域与参照区域的相交区域。
  • 相交比例:相交区域占参照区域的比例。
  • 阈值:相交比例如果达到阈值,则会触发监听器的回调函数。阈值可以有多个。

通过以上API和概念的了解,可以获取到图片是否可以被用户看见或者即将被看见,通过回调将图片加载显示出来,然后监听下一组即将被显示的图片,这样就可以达到懒加载图片的方式,以下是代码展示

//index.js
//获取应用实例
const app = getApp()

let lazyload;

Page({
  data: {
    classNote: 'item-',          //循环节点前缀
    count: 0,               //总共加载到多少张
    img: []                //图片列表
  },
  onReady: function () {
    //可以先初始化首屏需要展示的图片
    that.setData({
      count: 5
    })
    //开始监听节点,注意需要在onReady才能监听,此时节点才渲染
    lazyload.observe();
  },
  viewPort: function () {
    const that = this;
    var intersectionObserver = wx.createIntersectionObserver();
    //这里bottom:100,是指显示区域以下 100px 时,就会触发回调函数。
    intersectionObserver.relativeToViewport({bottom: 100}).observe(this.data.classNote + this.data.count, (res) => {
      if(res.boundingClientRect.top > 0){
        intersectionObserver.disconnect()
        that.setData({
          count: that.data.count + 5
        })
        that.viewPort();
      }
    })
  }

})
//page.wxml

<view>
  <view wx:for="{{img}}" class="item-{{index}}">
    <image style="display: {{index < count ? 'block' : 'none'}}" src="{{item}}"></image>
  </view>
</view>

这里有2点需要注意的

  • 监听的节点需要先渲染,也就是说监听这个动作需要在onReady的时候
  • 上述示例监听是依赖循环节点的class,最少需要先渲染一个节点才能监听
  • 每次监听完一个循环节点后,结束监听,然后继续监听下一个节点结果

详解性能更优越的小程序图片懒加载方式

无论怎么快速滚动,FPS都能保持在60

总结

H5其实也有一个类似的API,小程序的使用方式跟H5也是很类似,有很多东西都可以参考。针对上述监听的方式,我这边简单封装了一个库来调用,欢迎star。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
跨域表单提交状态的变相判断代码
Nov 12 Javascript
js 返回时间戳所对应的具体时间
Jul 20 Javascript
javascript数组去掉重复
May 12 Javascript
如何获取select下拉框的值(option没有及有value属性)
Nov 08 Javascript
javascript正则匹配汉字、数字、字母、下划线
Apr 10 Javascript
JavaScript不使用prototype和new实现继承机制
Dec 29 Javascript
jQuery实现精美的多级下拉菜单特效
Mar 14 Javascript
JS+CSS实现下拉刷新/上拉加载插件
Mar 31 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
Jun 24 Javascript
React项目动态设置title标题的方法示例
Sep 26 Javascript
对angularJs中自定义指令replace的属性详解
Oct 09 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
Nov 10 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 #Javascript
微信小程序日期选择器实例代码
Jul 18 #Javascript
JavaScript实现的反序列化json字符串操作示例
Jul 18 #Javascript
Angularjs实现多图片上传预览功能
Jul 18 #Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
Jul 18 #Javascript
微信小程序scroll-x失效的完美解决方法
Jul 18 #Javascript
详解easyui基于 layui.laydate日期扩展组件
Jul 18 #Javascript
You might like
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
基于PHP的简单采集数据入库程序
2014/07/30 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
低版本中Python除法运算小技巧
2015/04/05 Python
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
python 下载文件的多种方法汇总
2020/11/17 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
岗位职责怎么写
2014/03/14 职场文书
教师辞职书范文
2015/02/26 职场文书
2015年宣传思想工作总结
2015/05/22 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
python对文档中元素删除,替换操作
2022/04/02 Python