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


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 相关文章推荐
文字幻灯片
Jun 26 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
jQuery中DOM树操作之复制元素的方法
Jan 23 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
Jul 28 Javascript
js自调用匿名函数的三种写法(推荐)
Aug 19 Javascript
layer实现弹窗提交信息
Dec 12 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
jQuery实现炫丽的3d旋转星空效果
Jul 04 jQuery
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
Apr 10 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
May 10 Javascript
JS+DIV实现拖动效果
Feb 11 Javascript
js与jquery获取input输入框中的值实例讲解
Feb 27 jQuery
微信小程序项目实践之验证码倒计时功能
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入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
php学习笔记之基础知识
2014/11/08 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
jQuery自动或手动图片切换效果
2017/10/11 jQuery
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
Python中编写ORM框架的入门指引
2015/04/29 Python
Python编写Windows Service服务程序
2018/01/04 Python
python实现点对点聊天程序
2018/07/28 Python
python程序变成软件的实操方法
2019/06/24 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
使用python模拟高斯分布例子
2019/12/09 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
中秋手机店促销方案
2014/06/16 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python
Redis全局ID生成器的实现
2022/06/05 Redis