懒加载原理分析

最近添加了相册功能到网站上,一旦打开浏览器就会加载大量图片,从而造成页面的卡顿和跳动,同时对服务器也造成一定的压力。所以很显然需要用到懒加载功能。

懒加载的概念,就是等到让图片出现在浏览器中的窗口的时候再去加载该图片资源。这样避免网页在同一时间加载过多资源出现的页面卡死。

牛刀小试

现有插件很多,我也直接拿来用了,推荐使用 jQuery 的 lazyload.js ,大致阐述一下它的用法。

<!-- css -->
<style>
    img.lazy { /* 设置宽高 */ }
</style>
<!-- html -->
<div>
  <img class="lazy" src="1px*1px的图片" data-original="要加载的图片" />
  <img class="lazy" src="1px*1px的图片" data-original="要加载的图片" />
  <img class="lazy" src="1px*1px的图片" data-original="要加载的图片" />
  <img class="lazy" src="1px*1px的图片" data-original="要加载的图片" />
</div>
<!-- js -->
<script src="//apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="//apps.bdimg.com/libs/jquery-lazyload/1.9.5/jquery.lazyload.js"></script>
<script>
  $(‘img.lazy‘).lazyload({
    // 可设置加载时的动画等属性
    effect: ‘fadeIn‘
  });
</script>

引入这个插件后短短两三行代码就能启用页面上所有 class 为 lazy 的 img 标签进行懒加载了,同时可配置加载效果。加载时会把 data-original 的资源替换掉 src 的 资源,为了避免页面跳动和更好的用户体验,一般会设置一个默认的 1px × 1px 的图片 (若服务器压力大则可不设置) 并且给Img设置高度。就以上代码而言,对开发者还是非常透明的。

原理剖析

从上面的代码看,可得当加载该图片时,src 会读取 data-original 的数据,这只是该插件的一个规定,在后面我们可以取任何的 data- 作为加载资源。

懒加载的关键还是判断图片何时开始加载,本质就是图片何时‘露头‘ ,来看看浏览器与整个页面的位置关系图。

以从上往下滑动的来加载为例(左右滑动同理)。判断它是否已经加载到滑到了浏览器的视区可以通过三个高度决定。

视窗上方高度document.body.scrollTop
视窗高度window.innerHeight
图片相对于文档的高度图片DOM.offsetTop

由于 scrollTop 是个变值,所以需要监听它的数值变化,简单整理后如下:

<!-- html -->
<body>
  <div style="width:100%;height:900px;"></div>
  <div style="width:100%;height:300px;margin-top:50px;padding-top:50px">
    <img id="lazy" src="" data-src="资源路径" />
  </div>
</body>
<!-- js -->
<script>
window.onmousewheel = function() {
  // 可设置 xWill 确定图片在离视区多少高度时就加载
  var lazyPic = document.getElementById(‘lazy‘);
  if (lazyPic.offsetTop <= (window.innerHeight + document.body.scrollTop + xWill)) {
    lazyPic.setAttribute(‘src‘, lazyPic.getAttribute(‘data-src‘));
  }
};
</script>

这样就实现了一个简单的懒加载功能。

总结

对页面上元素的宽高和相对距离有一定认识后,基本的懒加载实现起来其实也很简单,从而解决了资源加载和用户体验上的一些痛点。

时间: 2024-10-24 23:33:15

懒加载原理分析的相关文章

功能列表字段懒加载原理——JEPLUS快速开发平台

JEPLUS之功能列表字段懒加载原理 当我们在点击进入一个列表或者是列表是总会遇到这样的情况---加载缓慢.在我们配置列表或者表单中默认会员很多的加载项,我们并不是都需要每次点开时都要加载.在今天我给大家介绍下遇到这种情况怎么解决. 一.效果展示 二.准备工作 1.JEPLUS平台5.0.0.2 2.数据库MySql 5.7 三,实现步骤 1.我们在有些场景下需要配置很多列表字段,还有很多的表单字段,那么它在加载的过程中就会逐步加载很缓慢,我们这里给他设置懒加载的目的就是提高列表的展示速度来展示

原生js实现图片懒加载原理

背景:页面图片多,加载的图片就多.服务器压力就会很大.不仅影响渲染速度还会浪费带宽.比如一个1M大小的图片,并发情况下,达到1000并发,即同时有1000个人访问,就会产生1个G的带宽.为了解决以上问题,提高用户体验,就出现了懒加载方式来减轻服务器的压力,优先加载可视区域的内容,其他部分等进入了可视区域再加载,从而提高性能. 1.懒加载原理一张图片就是一个<img>标签,浏览器是否发起请求图片是根据<img>的src属性,所以实现懒加载的关键就是: 在图片没有进入可视区域时,先不给

【SSH三大框架】Hibernate基础第十二篇:load()懒加载分析以及一对一、一对多、多对一、多对多懒加载的分析

一.懒加载的定义: 懒加载:在WEB应用程序中,经常会需要查询数据库,系统的响应速度在很大程度上是与数据库交互的响应.因此,如果能够优化与数据库的交互速度,则能够大大提高WEB应用的响应速度. 例如:当有一个Student类和一个Teacher类.当我们加载一个学生的所有信息,包括:学号,姓名等属性后,此时Student类中的Teacher类型的属性为null,当我们需要知道这个Student对应的Teacher属性的时候,我们才去加载这个Teacher对象. 如果,我们只需要知道学生信息,我们

图片懒加载原理及实现

1.为什么要使用懒加载? 对于图片过多的页面,为了加速页面加载速度, 所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载. 这样子对于页面加载性能上会有很大的提升,也提高了用户体验. 2.如何实现? 其实从原理上看很简单,在页面载入的时候将页面上的img标签的src指向一个小图片, 把真实地址存放在一个自定义属性中,这里我用data-src来存放,如下. <img src="loading.gif" data-src="htt

使用jQuery实现图片懒加载原理

原文:https://www.liaoxuefeng.com/article/00151045553343934ba3bb4ed684623b1bf00488231d88d000 在网页中,常常需要用到图片,而图片需要消耗较大的流量.正常情况下,浏览器会解析整个HTML代码,然后从上到下依次加载<img src="xxx">的图片标签.如果页面很长,隐藏在页面下方的图片其实已经被浏览器加载了.如果用户不向下滚动页面,就没有看到这些图片,相当于白白浪费了图片的流量. 所以,淘

PHP-自动加载原理分析

说起PHP的自动加载,很多同学可能都会想到各种框架的自动加载功能,PHP规范中的PSR0和PSR4原则,Composer的自动加载功能等等,这些都为我们的开发提供了很大的方便. 那么PHP自动加载的前因后果到底是什么?PHP的内部原理又是怎么样的呢?接下来我就根据自己的理解进行一下分析总结: 为什么会有自动加载? 在PHP面向对象(OO)编程中,为了方便管理,我们都会把一个类写在一个单独的文件中,那么如果想在A类中使用B类的功能,就需要把B类加载到A类.对于这样的需求在最原始的时候,我们是通过r

hibernate懒加载(转载)

http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Load()方法的懒加载原理 在Hibernate中,查询方法有两个,分别是get()和load(),这两种方法的不同就是load()拥有懒加载的特性.Load()方法就是在查询某一条数据的时候并不会直接将这条数据以指定对象的形式来返回,而是在你真正需要使用该对象里面的一些属

前端性能优化--图片懒加载(lazyload image)

图片懒加载(当然不仅限于图片,还可以有视频,flash)也是一种优化前端性能的方式.使用懒加载可以想要看图片时才加载图片,而不是一次性加载所有的图片,从而在一定程度从减少服务端的请求 什么是懒加载 懒加载怎么个懒法,就是你不想看就不给你看,我也懒得加载出来,懒得去请求.通俗的说就是你不要就不给你,怎么地.举个栗子,比如在进入某个页面的时候,它会有许多的图片,有些图片可能在下面,当我们点进页面但没有滑动下去或没看完整个页面,那么下面的图片就会"没用",加载了也白加载,而且还降低了网页的加

tableview加载图片的时候的优化之lazy(懒加载)模式and异步加载模式

iOS---tableview加载图片的时候的优化之lazy(懒加载)模式and异步加载模式举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动经过了,图片就开始加载了,这样用户体验就不太好,而且浪费内存.这个时候,我们就可以利用lazy加载技术,当界面滑动或者滑动减速的时候,都不进行图片加载,只有当用户不再滑动并且减速效果停止的时候,才进行加载.刚开始我异步加载图片利用SDWebImage来做