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


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 相关文章推荐
JavaScript的变量作用域深入理解
Oct 25 Javascript
jquery固定底网站底部菜单效果
Aug 13 Javascript
ActiveX控件与Javascript之间的交互示例
Jun 04 Javascript
Javascript数组操作函数总结
Feb 05 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
May 12 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
微信小程序 参数传递详解
Oct 24 Javascript
微信小程序 二维码canvas绘制实例详解
Jan 06 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
js中的 || 与 &amp;&amp; 运算符详解
May 24 Javascript
Vue注册组件命名时不能用大写的原因浅析
Apr 25 Javascript
详解JS实现系统登录页的登录和验证
Apr 29 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
把77A收信机改造成收音机
2021/03/02 无线电
PHP防CC攻击实现代码
2011/12/29 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
PHP实现的json类实例
2015/07/28 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
2016/11/12 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
微信小程序开发(一):服务器获取数据列表渲染操作示例
2020/06/01 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
python中正则表达式的使用详解
2014/10/17 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
django 单表操作实例详解
2019/07/30 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
"引用"与指针的区别是什么
2016/09/07 面试题
建筑学推荐信
2013/11/03 职场文书
数控机械专业个人的自我评价
2014/01/02 职场文书
社区活动总结报告
2014/05/05 职场文书
父亲节活动策划方案
2014/08/24 职场文书
Android studio 简单计算器的编写
2022/05/20 Java/Android
Golang gRPC HTTP协议转换示例
2022/06/16 Golang