前端性能优化之Lazyload

@(Mob前端-冬晨)[JavaScript|技术分享|懒加载]


[TOC]

Lazyload 简介

前端工作中,界面和效果正在变得越来越狂拽炫酷,与此同时性能也是不得不提的问题。有些项目,页面长,图片多,内容丰富。像商城页面。如果同步加载时一次性加载完毕,那肯定是要等到花都谢了,loading转的人都崩溃~。今天分享的是Lazyload技术 是一种延迟加载技术。让页面加载速度快到飞起、减轻服务器压力、节约流量、提升用户体验。

一、实现思路

页面较长,屏幕的可视区域有限。
不设置页面中img标签src属性值或者将其指向同一个占位图。
图片的实际地址存在img标签自定义的一个属性中,如:“data-url”。
监听scroll,滚动到某个位置时,动态的将url替换成实际的“data-url”。

二、上代码

  • html部分(简单示意下结构)
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>Lazyload</title><style type="text/css">.mob-wrap li{list-style: none;width: 100%;height: 345px;}</style></head><body><ul class="mob-wrap"><li"><img class="tamp-img" alt="loading" data-src="http://mob.com/public/images/index/sharesdk-logo.jpg"><p>ShareSDK轻松实现社会化功能</p></li><li"><img class="tamp-img" alt="loading" data-src="http://mob.com/public/images/index/sms-logo.jpg"><p>短信验证码SDK</p></li><li"><img class="tamp-img" alt="loading" data-src="http://mob.com/public/images/index/rec-logo.jpg"><p>MobLink实现Web与App的无缝链接</p></li></ul></body>
</html>

简要流程

st=>start: Start
e=>end
op=>operation: 监听滚动事件
cond=>condition: 距顶部高度<scrollTop么?
io=>inputoutput: 将url替换成data-url
st->op->cond
cond(yes)->io->e
cond(no)->op
  • js部分
var aImg = [{"src":"http://mob.com/public/images/index/sharesdk-logo.jpg","txt":"ShareSDK轻松实现社会化功能"},{"src":"http://mob.com/public/images/index/sms-logo.jpg","txt":"短信验证码SDK"},{"src":"http://mob.com/public/images/index/rec-logo.jpg","txt":"MobLink实现Web与App的无缝链接"}
];
var sLi = '';
document.getElementsByClassName("mob-wrap")[0].innerHTML="";
for(let i = 0;i<10;i++){sLi = document.createElement("li");sLi.innerHTML = `<img class="tamp-img" alt="loading" src="./zwt.gif" data-src="${aImg[i%3].src}"><p>${aImg[i%3].txt}</p>`;document.getElementsByClassName("mob-wrap")[0].appendChild(sLi);
};window.onscroll = function () {var bodyScrollHeight =  document.documentElement.scrollTop;// body滚动高度var windowHeight = window.innerHeight;// 视窗高度var imgs = document.getElementsByClassName('tamp-img');for (var i =0; i < imgs.length; i++) {var imgHeight = imgs[i].offsetTop;// 图片距离顶部高度 if (imgHeight  < windowHeight  + bodyScrollHeight - 340) {imgs[i].src = imgs[i].getAttribute('data-src');imgs[i].className = imgs[i].className.replace('tamp-img','');}}
};

.
.
.
谢谢观看,搞定收工0.0~~~这样草草了事总是不好的

三、再优化

不做任何处理直接监听scroll必然导致在滚动鼠标滚轮的时候,过于频繁的触发处理函数。
如果刚巧在处理函数中有大量的操作dom等消耗性能的行为,引发大量操作,导致页面变卡变慢,
甚至浏览器崩溃无响应。
处理这种问题的思路是节流和防抖。
节流函数的概念有一个很形象的比喻:在接咖啡的时候,按了一次按钮会出咖啡,
紧跟着再按几次按钮接到的还是那一杯咖啡,相当于后面几次按的没有起作用。

常规的节流在这里就不多说了,下面介绍的是一种每隔least时间内至少执行一次的节流函数。

//节流函数
_throttle = (fn, delay, least) => {var timeout = null,startTime = new Date();fn();return function() {var curTime = new Date();clearTimeout(timeout);if(curTime - startTime >= least) {fn();startTime = curTime;}else {timeout = setTimeout(fn, delay);}}
}

使用节流函数

function compare () {var bodyScrollHeight =  document.documentElement.scrollTop;// body滚动高度console.log(bodyScrollHeight+"替换src方法")var windowHeight = window.innerHeight;// 视窗高度var imgs = document.getElementsByClassName('tamp-img');for (var i =0; i < imgs.length; i++) {var imgHeight = imgs[i].offsetTop;// 图片距离顶部高度 if (imgHeight < windowHeight + bodyScrollHeight - 340) {imgs[i].src = imgs[i].getAttribute('data-src');imgs[i].className = imgs[i].className.replace('tamp-img','');}}
}
window.onscroll = _throttle(compare, 350,600);

滚动时间least长于600,调用compare,否则延迟350ms执行。
这样相对于直接onscroll性能得到更进一步提升,在功能上也没有什么问题。
不同的业务场景调整一下delay和least就可以。

结语:历史潮流浩浩荡荡,前端技术的发展也是日新月异。
不断通过一个个小的技术点深入探究,以加深自己对js这门语言的理解。
温故知新,回顾旧的内容,学习新的内容和特性,更好的适应工作中的需求。

前端性能优化之Lazyload相关推荐

  1. 前端性能优化之Lazyload 1

    一.Lazyload的理解分析 Lazyload技术是一种延迟加载技术,让页面加载速度快到飞起.减轻服务器压力.节约流量.提升用户体验 实现思路 1)页面较长,屏幕的可视区域有限 2)不设置页面中im ...

  2. 深度讲解:web前端性能优化

    一.课程简介: 1.课程大纲 涉及到的分类 网络层面 构建层面 浏览器渲染层面 服务端层面 涉及到的功能点 资源的合并与压缩 图片编解码原理和类型选择 浏览器渲染机制 懒加载预加载 浏览器存储 缓存机 ...

  3. 前端性能优化——从 10 多秒到 1.05 秒

    https://lishaoy.net 关于 性能优化 是个大的面,这篇文章主要涉及到 前端 的几个点,如 前端性能优化 的流程.常见技术手段.工具等. 提及 前端性能优化 ,大家应该都会想到 雅虎军 ...

  4. 移动H5前端性能优化指南[转]

    移动H5前端性能优化指南 米随随2015.01.23 移动H5前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用 2. 在Mobile侧我们提出三秒种渲染完成首屏指标 3. 基于第二点 ...

  5. WEB前端性能优化小结

    1. 请减少HTTP请求 基本原理: 在浏览器(客户端)和服务器发生通信时,就已经消耗了大量的时间,尤其是在网络情况比较糟糕的时候,这个问题尤其的突出. 一个正常HTTP请求的流程简述:如在浏览器中输 ...

  6. 前端性能优化 -- 从 10 多秒到 1.05 秒

    关于 性能优化 是个大的面,这篇文章主要涉及到 前端 的几个点,如 前端性能优化 的流程.常见技术手段.工具等. 提及 前端性能优化 ,大家应该都会想到 雅虎军规,本文会结合 雅虎军规 融入自己的了解 ...

  7. 前端性能优化的重要方案:图片懒加载

    大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的前端性能优化的重要方案:图片懒加载,主要包括其原理,我们常用的一些插件,及编写源码实现图片懒加载功能等,图片懒加载是项目比较常见的 ...

  8. 移动HTML5前端性能优化指南

     http://www.cocoachina.com/webapp/20150126/11020.html (点击看大图) 移动H5前端性能优化指南[托尼托尼研究所] 概述 1. PC优化手段在M ...

  9. WEB前端性能优化基本套路

    前言 前端性能优化这是一个老生常谈的话题,但是还是有很多人没有真正的重视起来,或者说还没有产生这种意识. 当用户打开页面,首屏加载速度越慢,流失用户的概率就越大,在体验产品的时候性能和交互对用户的影响 ...

最新文章

  1. RTT设备与驱动之PWM
  2. 如何使用CNN进行物体识别和分类_CNN原理与实践指南
  3. java面试笔试大汇总(一)
  4. 薪资那么高的Web前端的工作者,想要提高薪资就必须看的书单
  5. Exception in thread “main“ java.lang.NoClassDefFoundError: javax/script/Compilable
  6. 递归javascript_使用freeCodeCamp挑战解释了JavaScript中的递归
  7. Vue2.0王者荣耀助手
  8. 论文浅尝 | DRUM:一种端到端的可微的知识图谱上的规则学习方法
  9. ORA-28001: the password has expired (DBD ERROR: OCISessionBegin)解决办法
  10. Salesforce 中获取数据表字段的 picklist 的值
  11. select、bash函数初识及rpm命令详解
  12. 使用 esxtop 识别存储性能问题
  13. Html中文字过多,单行超出和多行超出显示省略号
  14. ps 抠图 色彩范围
  15. 用Java 语言实现正整数的质因数分解
  16. 2021-03-29
  17. java——记录一次条形码、二维码、订单自动生成的制作
  18. 用EFS加密文件的方法
  19. tunnel和channel区别
  20. ERP : 物料控制--相关需求

热门文章

  1. 计算当前时间到指定日期之间距离多久(494天11866小时711960分钟42717625秒)
  2. html bootstrap复选框全选,javascript+bootstrap+html实现层级多选框全层全选和多选功能代码实例...
  3. leetcode1721. 交换链表中的节点
  4. (八)nodejs循序渐进-事件驱动(进阶篇)
  5. C++ STL list添加(插入)元素方法详解
  6. 云计算技术背后的天才程序员:Open VSwitch鼻祖Martin Casado
  7. 集合拷贝通用方法、list<A> 转换成 list<B> (属性相同)
  8. 如何在 CentOS 7上安装和使用 Docker Compose
  9. maven的web工程打包为war并部署到服务器
  10. FreeSql (一)入门