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


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 相关文章推荐
更正确的asp冒泡排序
May 24 Javascript
有一段有意思的代码-javascript现实多行信息
Aug 26 Javascript
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
jQuery中:eq()选择器用法实例
Dec 29 Javascript
原生js实现移动开发轮播图、相册滑动特效
Apr 17 Javascript
jquery插件hiAlert实现网页对话框美化
May 03 Javascript
node.js中格式化数字增加千位符的几种方法
Jul 03 Javascript
JavaScript中String对象的方法介绍
Jan 04 Javascript
JS中图片压缩的方法小结
Nov 14 Javascript
JS实现DOM删除节点操作示例
Apr 04 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
Apr 28 Javascript
Vue项目开发常见问题和解决方案总结
Sep 11 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
用PHP实现文件上传二法
2006/10/09 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python实现统计代码行的方法分析
2017/07/12 Python
基于Python的文件类型和字符串详解
2017/12/21 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
pycharm新建一个python工程步骤
2019/07/16 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Python简易版图书管理系统
2019/08/12 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
经典广告词大全
2014/03/14 职场文书
环境保护标语
2014/06/20 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
教研活动主持词
2015/07/03 职场文书
礼仪培训心得体会
2016/01/22 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python