前端性能优化之Lazyload

前端性能优化之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这门语言的理解。
温故知新,回顾旧的内容,学习新的内容和特性,更好的适应工作中的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA使用FTPClient类读写FTP

见&#xff1a;http://blog.csdn.net/kardelpeng/article/details/6588284 1.首先先导入相关jar包 2.创建一个连接FTP的工具类FTPUtil.Java [java] view plaincopy package com.metarnet.ftp.util; import java.io.IOException; import java.io.InputStream; import j…

Java IO类库之ObjectInputStream和ObjectOutPutStream

2019独角兽企业重金招聘Python工程师标准>>> 一、ObjectOutputStream 1 - ObjectOuputStream介绍 ObjectOutputStream(对象字节输出流)&#xff0c;用于将一个序列化对象写入到创建ObjectOutputStream时传入的底层字节输入流中&#xff0c;通过源码可知该类继承Outp…

什么是覆盖索引?如何利用覆盖索引进行SQL语句优化?

如果你不知道什么是覆盖索引&#xff0c;那么SQL性能优化便无从谈起&#xff01; 什么是覆盖索引?如何利用索引进行SQL语句优化&#xff1f; 表结构 150多万的数据&#xff0c;这么一个简单的语句&#xff1a; 慢查询日志里居然很多用了1秒的&#xff0c;Explain的结果是&am…

ARM的商业模式是如何炼成的?

导读&#xff1a;保守、严谨&#xff0c;又有一些皇族气质&#xff0c;作为一家拥有纯正英国血统的公司&#xff0c;ARM看似呆板的作风却让其在移动互联网大潮中势如破竹&#xff0c;没有对手。也许过于看重产业链伙伴的声音&#xff0c;导致ARM的决策有些迟缓&#xff0c;比如…

java 中 FtpClient 实现 FTP 文件上传、下载

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 源代码大部分是网上找的&#xff0c;查来查去&#xff0c;找到几个可以用的例子&#xff0c;改来改去&#xff0c;揉合成现在这个样子。…

Web Service 简单实例(java 版本) ,IDE自动生成客户端代码方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、客户端工程 jar 包 &#xff1a; 二、1. 服务端&#xff1a;( new 一个web service project ) package com;import javax.jws.…

最佳Linux服务器发行版

一款Linux发行版就如同一件衣服一样&#xff0c;适合自己的才是最好的选择。 对大型企业而言&#xff0c;当然首选Red Hat Enterprise Linux&#xff08;RHEL&#xff09;。Red Hat有完善的技术支持服务&#xff0c;而且在我们周围&#xff0c;非常容易找到持有Red Hat认证的技…

「机械」4大传动方式优劣对比:机械、电气、气压、液压

传动方式有很多种。目前应用比较多的四大类传动方式&#xff08;机械、电气、液压和气压&#xff09;中&#xff0c;没有一种动力传动是十全十美的。今天跟大家分享4种传动方式的优劣对比。 一. 机械传动 1. 齿轮传动 齿轮传动是机械传动中应用最广的一种传动形式。它的传动比较…

AMQP 协议介绍

RabbitMQ 是遵从AMQP 协议的&#xff0c; 换句话说&#xff0c; RabbitMQ 就是AMQP 协议的Erlang 的实现(当然RabbitMQ 还支持STOMP2 、MQTT3 等协议) 0 AMQP 的模型架构和RabbitMQ 的模型架构是一样的&#xff0c;生产者将消息发送给交换器&#xff0c;交换器和队列绑定。当生…

Java已死?九百万程序员说不

Java没死&#xff0c;事实上它拥有足够的能量让你的应用跑起来。那些对Java吹毛求疵人频繁地聚焦在一些小众问题上&#xff0c;总是和其他技术或者语言做些不公平的对比&#xff0c;这些语言并没有像Java一样得到广泛应用及长远的历史。 现在的小孩都能学Java&#xff0c;它在…

CSS中position的absolute和relative用法

static: HTML元素的默认定位方式absolute: 将对象从文档流中拖出&#xff0c;使用left&#xff0c;right&#xff0c;top&#xff0c;bottom等属性进行绝对定位。而其层叠通过z-index属性定义。绝对定位的元素的位置相对于最近的已定位父元素&#xff0c;如果元素没有已定位的父…

避免流量高峰期CDN问题的10个方法

在视频流媒体中&#xff0c;因平台火爆而出现问题是件好事。至少&#xff0c;这比根本没有观众要好。\\也许你正在使用世界级的CDN&#xff0c;但是&#xff0c;在大型赛事期间&#xff0c;当CDN的服务器和对等点流量变得饱和的时候&#xff0c;一些用户还是无法享受到流畅的体…

Android应用进入爆发期 手机游戏仍是市场重心

近日&#xff0c;91无线发布了《91无线移动应用发展趋势报告&#xff08;Android版&#xff09;》。报告显示&#xff0c;2012年&#xff0c;无论Android移动应用用户下载还是开发者研发均呈爆发态势&#xff0c;手机游戏仍是市场重心所在。同时&#xff0c;Android移动应用下载…

WebService中文件传输

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 WebService处理传递普通的信息&#xff0c;还可以传输文件&#xff0c;下面介绍WebService是怎么完成文件传输的。 1、 首先编写服务器端…

Django框架-Form组件

一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时&#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验&#xff0c;比如验证用户是否输入&#xff0c;输入的长度和格式等是否正…

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

取板粗 好东西来的 1.&#xff08;HDOJ2665&#xff09;http://acm.hdu.edu.cn/showproblem.php?pid2665 &#xff08;POJ2104&#xff09;http://poj.org/problem?id2104 &#xff08;POJ2761&#xff09;http://poj.org/problem?id2761 题意&#xff1a;求区间第K大&…

分享Spring Cloud分布式微服务架构图

分布式、微服务、云架构JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从现在开始&#xff0c;我这边会将近期研发的springcloud微服务云架构的搭建过程和精髓记录下来&#xff0c;帮助更多有兴趣研发spring cloud框架的朋友&#xff0…

Lyft Level 5 Challenge 2018 - Elimination Round翻车记

打猝死场感觉非常作死。 A&#xff1a;判一下起点和终点是否在其两侧即可。 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x0,…

mysql用户的权限分配

2019独角兽企业重金招聘Python工程师标准>>> 因今天在分配数据库权限的时候&#xff0c;同事反映账户不能使用函数&#xff0c;遂搜集资料总结了一番关于mysql用户的权限分配。 MySQL 赋予用户权限命令的简单格式可概括为&#xff1a; grant 权限 on 数据库对象 to …