实现图片懒加载

Web 图片的懒加载就是通过读取img元素,然后获得img元素的data-src(也可以约定为其他属性名)属性的值,并赋予img的src,从而实现动态加载图片的机制。

这里需要注意的是: img在初始化的时候不要设置src属性,因为即使设置 src=‘‘ 浏览器也会尝试加载图片。

一个简单的图片懒加载共涉及两个方面,

1. HTML 约定

我们首先需要给准备实施懒加载的img元素添加指定的class 这里为m-lazyload ,同时将img src赋值给 data-src属性。
具体示例为:

  1. <img class="m-lazyload" data-src="imgUrl">

2. JavaScript 实现

动态加载总共分为以下几个步骤,这里每个步骤都将被拆分为独立的函数

1. 添加页面滚动监听事件
  1. window.addEventListener(‘scroll‘, _delay, false);
  2. function _delay() {
  3. clearTimeout(delay);
  4. delay = setTimeout(function () {
  5. _loadImage();
  6. }, time);
  7. }
2. 当触发监听事件时会执行 _loadImage 函数,该函数负责加载图片
  1. function _loadImage() {
  2. for (var i = imgList.length; i--;) {
  3. var el = imgList[i];
  4. if (_isShow(el)) {
  5. el.src = el.getAttribute(‘data-src‘);
  6. el.className = el.className.replace(new RegExp("(\\s|^)" + _selector.substring(1, _selector.length) + "(\\s|$)"), " ");
  7. imgList.splice(i, 1);
  8. }
  9. }
  10. }

虽然执行了_loadImage函数,但是我们得知道哪些图片需要被加载,这里的判断依据是什么呢?

依据就是判断该图片是否在当前窗口的可视区域内,在这里我们封装一个_isShow函数来实现

  1. function _isShow(el) {
  2. var coords = el.getBoundingClientRect();
  3. return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset));
  4. }

自此一个图片加载的闭环就形成了

当网页滚动的事件被触发 -> 执行加载图片操作 -> 判断图片是否在可视区域内 -> 在,则动态将data-src的值赋予该图片。

太简单了?

事实就是如此!!!

如此简单,不妨扩展一下

  1. 添加一些自定义参数,谁都喜欢自定义,不是吗?
  2. 支持iScroll, iScroll是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件。
这里我们做了些优化
  1. 图片加载后移除选择器,避免重复判断。
  2. 缓存img元素结合,减少dom元素查询性能损耗
  3. 扩展prototype添加getNode方法,支持分页数据懒加载(由于我们之前缓存了dom元素)

OK!说了这么多,show me the code 吧!

  1. (function () {
  2. var imgList = [], // 页面所有img元素集合
  3. delay, // setTimeout 对象
  4. offset, //偏移量,用于指定图片距离可视区域多少距离,进行加载
  5. time, // 延迟载入时间
  6. _selector; // 选择器 默认为 .m-lazyload
  7. function _isShow(el) {
  8. var coords = el.getBoundingClientRect();
  9. return ( (coords.top >= 0 && coords.left >= 0 && coords.top) <= (window.innerHeight || document.documentElement.clientHeight) + parseInt(offset));
  10. }
  11. function _loadImage() {
  12. for (var i = imgList.length; i--;) {
  13. var el = imgList[i];
  14. if (_isShow(el)) {
  15. el.src = el.getAttribute(‘data-src‘);
  16. el.className = el.className.replace(new RegExp("(\\s|^)" + _selector.substring(1, _selector.length) + "(\\s|$)"), " ");
  17. imgList.splice(i, 1);
  18. }
  19. }
  20. }
  21. function _delay() {
  22. clearTimeout(delay);
  23. delay = setTimeout(function () {
  24. _loadImage();
  25. }, time);
  26. }
  27. function ImageLazyload(selector, options) {
  28. var defaults = options || {};
  29. offset = defaults.offset || 0;
  30. time = defaults.time || 250;
  31. _selector = selector || ‘.m-lazyload‘;
  32. this.getNode();
  33. _delay();//避免首次加载未触发touch事件,主动触发一次加载函数
  34. if (defaults.iScroll) {
  35. defaults.iScroll.on(‘scroll‘, _delay);
  36. defaults.iScroll.on(‘scrollEnd‘, _delay);
  37. } else {
  38. window.addEventListener(‘scroll‘, _delay, false);
  39. }
  40. }
  41. ImageLazyload.prototype.getNode = function () {
  42. imgList = [];
  43. var nodes = document.querySelectorAll(_selector);
  44. for (var i = 0, l = nodes.length; i < l; i++) {
  45. imgList.push(nodes[i]);
  46. }
  47. };
  48. })();
 

来源: 实现一个图片懒加载插件有多难? – 前端有多难? – SegmentFault

时间: 2024-08-05 11:18:20

实现图片懒加载的相关文章

页面图片懒加载

一.页面滚动加载图片的理解 当一个网页含有大量的图片的时候,往往在打开页面的加载的很慢,如现在的大型电商.新闻.微博等,如果一下加载整个网页的所有图片,那会是一个缓慢的过程,要想快速的浏览网页,我们这时候就需要用到了在滚动或滑动页面的时候加载图片的方法.即图片懒加载!!! 二.实现懒加载的思路 当打开页面的时候,刚开始不给显示图片的位置放图片,等滚动或滑动到哪里的时候在获取图片.当然如果我们不给图片src中放图片,就会出现先找不到图片的提示,这样肯定是不行的. 所以我们在放图片的位置刚开始让一张

图片懒加载

一.什么是图片滚动加载? 通俗的将就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有在图片出现在浏览器的可视区域内时,才设置图片真正的路径,让图片显示出来.这就是图片懒加载. 二.为什么要使用这个技术? 比如一个页面中有很多图片,如淘宝.京东首页等等,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档的底部,恰巧页面的头部又依赖这个js文件,那就不好办了.更为要命的是:一上来就发送百八十个请求

图片预加载与图片懒加载的区别与实现

预加载与懒加载,我们经常经常用到,这些技术不仅仅限于图片加载,我们今天讨论的是图片加载: 一.什么是图片预加载与懒加载: 图片预加载:顾名思义,图片预加载就是在网页全部加载之前,提前加载图片.当用户需要查看时可直接从本地缓存中渲染,以提供给用户更好的体验,减少等待的时间.否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,这样浏览者可能以为图片预览慢而没兴趣浏览,把网页关掉,这时,就需要图片预加载.当然这种做法实际上牺牲了服务器的性能换取了更好的用户体验. 图

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

jQuery.imgLazyLoad图片懒加载组件

一.前言 当一个页面中请求的图片过多,而且图片太大,页面访问的速度是非常慢的,对用户的体验非常不友好:使用图片懒加载,可以减轻服务器的压力,增加页面的访问量,这里主要是总结一下我自己写的图片懒加载组件jQuery.imgLazyLoad:使用该组件应在img标签中设置一个imglazyload-src属性,存放图片地址. 二.应用实例demo /** * component: imgLazyLoad 2013/12/12 华子yjh * invoking: jQuery.imgLazyLoad(

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

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

js图片懒加载

<script type="text/javascript"> var lazyLoad = { // 获取元素到页面顶部的距离 getoffsetTop: function(elem){ var offTop = 0; while(elem != null){ offTop += elem.offsetTop; // 获取元素到其上一级元素顶部的距离 elem = elem.offsetParent; // 元素的上一级元素 } return offTop; }, //

前端性能优化技术(一):图片懒加载

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>lazyload</title> </head> <body> <div> <a href="#"><img class="lazy" src="imag

图片懒加载(仿SDWebImage)

1.图片缓存 #import "UIImageView+WebCache.h" #import "ImageDownloader.h" @implementation UIImageView (WebCache) - (void)setImageWithUrl:(NSString *)urlStr andPlaceHolderImage:(UIImage *)image andIsScrolling:(BOOL)isScroll { self.image = ima

前端优化-图片懒加载

一.什么是懒加载 懒加载技术(简称lazyload)是对网页性能优化的一种方案.lazyload的核心是按需加载,避免网页打开时加载过多资源,让用户等待太久,在适当的时候加载用户需要的资源(这里用户需要的资源指该资源呈现在浏览器可视区域).这里我们主要是对img标签使用懒加载技术,使用jquery的query.lazyload.js库实现. 通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览