##1.什么是lazy-loading
图片“懒加载”

为img标签src设置统一的图片链接,而将真实链接地址装在自定义属性中。
所以开始时候图片是不会加载的,我们将满足条件的图片的src重置为自定义属性便可实现延迟加载功能

##2.实现方法

思想其实很简单,就是当图片相对于视口的距离小于视口高度的时候就置换图片的src!

而图片的相对于视口的距离用getBoundingClientRect()简直so easy。

##3.demo代码

<!DOCTYPE html>
<html> <head>
<title>lazy loading</title>
<style type="text/css">
img {
display: block;
margin: 600px 100px;
}
</style>
</head> <body>
<div class="zone">
<img width="612" height="612" data-src="http://farm8.staticflickr.com/7060/6969705425_0905bf6bba_o.jpg" src="img/loading.png" class="lazy">
<img width="612" height="612" data-src="http://farm8.staticflickr.com/7203/6969484613_0ee3af0144_o.jpg" src="img/loading.png" class="lazy">
<img width="612" height="612" data-src="http://farm8.staticflickr.com/7207/6821596428_cdae70e306_o.jpg" src="img/loading.png" class="lazy">
<img width="612" height="612" data-src="http://farm8.staticflickr.com/7037/6965140403_9fbb5e7f96_o.jpg" src="img/loading.png" class="lazy">
</div>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript">
$(function() {
function loadImage (el, fn) {
src = el.getAttribute('data-src');
el.src = src;
fn? fn() : null;
}
function elementInViewport(el) {
var rect = el.getBoundingClientRect() return (
rect.top >= 0 && rect.left >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight)
)
} var query = $('.lazy'),
images = new Array(),
processScroll = function() {
for (var i = 0; i < images.length; i++) {
if (elementInViewport(images[i])) {
loadImage(images[i], function() {
images.splice(i, 1);
console.log(images.length)
});
}
};
}; for (var i = 0; i < query.length; i++) {
images.push(query[i]);
};
window.addEventListener('scroll', processScroll); })
</script>
</body> </html>

##4.问题与优化

于是功能便实现了,但是其实也有很多问题,比如打开页面,然后又点去别的窗口,看了部av回来后本以为这个页面图片已经缓冲好了结果尼玛啊拉下去还是要重新加载....所以需要判断这种情况,今天没时间了以后再针对这个写一下吧。

##5.参考资料

CSS-tricks

另一个视角来看
##6.代码勘误
用for循环遍历的话,会有问题,因为数组也在动态的变化,

Javascript 在 for in 或 foreach 遍历中,会自动跳过 undefined 元素,而普通 for 遍历则不会。

processScroll = function() {
var len = images.length;
for (var i in images) {
if (elementInViewport(images[i])) {
loadImage(images[i], function() {
delete images[i];
console.log(i);
});
}
};
};

【前端优化】图片延迟加载Lazy-loading的原理与简单实现的更多相关文章

  1. Lazyr.js – 延迟加载图片(Lazy Loading)

    Lazyr.js 是一个小的.快速的.现代的.相互间无依赖的图片延迟加载库.通过延迟加载图片,让图片出现在(或接近))视窗才加载来提高页面打开速度.这个库通过保持最少选项并最大化速度. 在线演示    ...

  2. Entity Framework加载相关实体——延迟加载Lazy Loading、贪婪加载Eager Loading、显示加载Explicit Loading

    Entity Framework提供了三种加载相关实体的方法:Lazy Loading,Eager Loading和Explicit Loading.首先我们先来看一下MSDN对三种加载实体方法的定义 ...

  3. 前端页面优化:javascript图片延迟加载

    自己写了个简单的图片延迟加载小插件. 功能如下: 页面刷新,当前屏幕图片直接加载真实地址,body被卷去的部分和下方未显示的部分的img均加载通用图片如:loding.gif 随着屏幕上下滚动加载相应 ...

  4. 前端优化之图片延迟加载(lazyload.js)

    要想缩短首屏加载时间,思路一般是减少http请求次数和降低每次的请求量.本文中使用现成的lazyload.js插件,文末会放出下载地址. lazyload.js可以实现图片分批次加载,不是一次性加载完 ...

  5. 图片延时加载原理 和 使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)

    图片加载技术分为:图片预加载和图片延时加载. javascript图片预加载和延时加载的区别主要体现在图片传输到客户端的时机上,都是为了提升用户体验的,延时加载又叫懒加载.两种技术的本质:两者的行为是 ...

  6. 利用图片延迟加载来优化页面性能(jQuery)

    图片延迟加载也称懒加载,常用于页面很长,图片很多的页面,以电子商务网站居多,比如大家常上的京东,淘宝,页面以图居多,整个页面少说几百K,多则上兆,如果想一次性加载完成,不仅用户要哭了,服务器也得哭了. ...

  7. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  8. Lazy Load 图片延迟加载(转)

    jQuery Lazy Load 图片延迟加载来源 基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. ...

  9. jQuery Lazy Load 图片延迟加载

    基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. 版本: jQuery v1.4.4+ jQuery ...

随机推荐

  1. win10定时任务

    1.设置everything开机启动 电脑--管理

  2. openssl部分解读

    前言 openssl是个开源的加密库.可以对文件进行加密解密. 小知识 术语: 单词:   Encryption  加密   Decryption   解密   ssl 安全socket层 tsl 最 ...

  3. 三、JPA增删改查常用方法

    前言:创建EntityManager对象,需要先创建创建EntityManagerFactory对象 方式一:直接通过persistenceUnitName创建 String persistenceU ...

  4. 如何通过命令行编写调试第一个C++程序(UNIX)

    1.文件保存以.cc,.cpp等结尾: 2.bash窗口调试命令:cc prog1.cc,编译器生成可执行问价,Unix系统中为a.out,windows中一般以filename.exe; 3.(1) ...

  5. iview table的render()函数的用法

    语法:render:(h,params)=>{} render:(h,params) => { return h(" 定义的元素 ",{ 元素的性质 }," ...

  6. 记一下await用法

    async函数会返回一个Promise对象,可以使用then方法添加回调函数, 当async函数有return时,会作为success的参数 当async函数有抛错时,会作为fail的参数. 当函数执 ...

  7. Es学习第五课, 分词器介绍和中文分词器配置

    上课我们介绍了倒排索引,在里面提到了分词的概念,分词器就是用来分词的. 分词器是ES中专门处理分词的组件,英文为Analyzer,定义为:从一串文本中切分出一个一个的词条,并对每个词条进行标准化.它由 ...

  8. 解决分布式事务基本思想Base和CPA理论、最终一致性|刚性事务、柔性事务

    在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词比如:CAP与Base理论.柔性事务与刚性事务.理解最终一致性思想,JTA+XA.两阶段与三阶段提交等. 如何保证强一致性呢? ...

  9. 关于云计算三大服务模式LAAS,PAAS,SAAS的含义及区别

    根据NIST的权威定义,云计算有SPI,即SAAS,PAAS和LAAS三大服务模式,上层是SAAS,中间层是PAAS,底层是LAAS,一层支撑一层. LAAS(Infrastucture-as-a-S ...

  10. 【Java架构:基础技术】一篇文章搞掂:MyBatis-Plus

    前言 Mybatis:一个流行的半自动ORM框架. Mybatis-Plus:一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发.提高效率而生. 本文使用的版本:myb ...