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


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 TO HTML 转换
Jun 26 Javascript
封装了一个js图片轮换效果的函数
Sep 28 Javascript
有关于JS辅助函数inherit()的问题
Apr 07 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
Aug 01 Javascript
jQuery获取file控件中图片的宽高与大小
Aug 04 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
Sep 08 Javascript
详解获取jq ul第一个li定位的四种解决方案
Nov 23 Javascript
使用jquery datatable和bootsrap创建表格实例代码
Mar 17 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
JavaScript键盘事件常见用法实例分析
Jan 03 Javascript
详解Vue中watch对象内属性的方法
Feb 01 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无限分类的深入理解
2013/06/02 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
Element Input组件分析小结
2018/10/11 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
Python中正则表达式的详细教程
2015/04/30 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
造价工程师个人求职信
2013/09/21 职场文书
建筑班组长岗位职责
2014/01/02 职场文书
给分销商的致歉信
2014/01/14 职场文书
我爱我校演讲稿
2014/05/21 职场文书
民主生活会发言材料
2014/10/20 职场文书
工程技术员岗位职责
2015/04/11 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers