前端JS图片懒加载原理方案详解

yizhihongxing

前端JS图片懒加载原理方案详解

什么是图片懒加载?

图片懒加载指的是在网页的滚动过程中,将未出现在视窗内的图片延迟加载,等到图片即将进入到可视区域时再将其加载。相对于一开始就加载所有图片的方式,图片懒加载能很大程度地减少页面渲染时的负担,节省带宽资源。

为什么需要图片懒加载?

随着富媒体网站的发展,页面上的图片数量越来越多,而把所有图片一开始就加载出来很容易造成页面加载缓慢,用户体验很差。因此,实现图片懒加载不仅可以提升用户体验,也可以提高页面的性能。

实现方式

图片懒加载的实现方式有多种,其中最常用的方式是利用 Javascript 编写实现。

1. 使用懒加载库

目前市面上常用的 js 懒加载库有 Lazyload.jslayzr.js 等。这些库已经考虑了各种情况,使用这些库能够很快速地实现图片懒加载。

Lazyload.js 库中只需要加入以下代码,即可轻松完成图片懒加载:

var lazyload = new LazyLoad({
    elements_selector: ".lazy"
});

2. 自行编写懒加载脚本

自行编写懒加载脚本需要考虑到以下几个问题:

  • 如何获取需要加载的图片
  • 如何判断图片是否进入可视区域
  • 加载成功以后的处理

下面给出一个基于 Intersection Observer API 的懒加载脚本实现。

// 获取所有需要懒加载的img标签
let images = document.querySelectorAll("img[data-src]");

let observer = new IntersectionObserver(function(entries) {
  entries.forEach(function(entry) {
    if (entry.intersectionRatio > 0) {
      // 进入可视区域,进行加载
      entry.target.setAttribute("src", entry.target.getAttribute("data-src"));
      observer.unobserve(entry.target);
    }
  });
});

// 逐个监控每个需要懒加载的img标签
for (let i = 0; i < images.length; i++) {
  observer.observe(images[i]);
}

示例说明

示例1

为了展示示例1,我们先准备一个大量图片的页面,然后编写下面的 HTML 代码:

<div class="gallery">
  <img data-src="image1.jpg" />
  <img data-src="image2.jpg" />
  <img data-src="image3.jpg" />
  <img data-src="image4.jpg" />
  <img data-src="image5.jpg" />
  <img data-src="image6.jpg" />
  <img data-src="image7.jpg" />
  <img data-src="image8.jpg" />
  <img data-src="image9.jpg" />
  <img data-src="image10.jpg" />
</div>

然后引入 Lazyload.js 库,并解析所有的延迟加载图片。

<script src="path/to/Lazyload.js"></script>
<script>
  var lazyload = new LazyLoad({
      elements_selector: ".gallery img"
  });
</script>

示例2

为了展示示例2,我们还是先准备一个大量图片的页面,然后编写下面的 HTML 代码:

<div class="gallery">
  <img data-src="image1.jpg" />
  <img data-src="image2.jpg" />
  <img data-src="image3.jpg" />
  <img data-src="image4.jpg" />
  <img data-src="image5.jpg" />
  <img data-src="image6.jpg" />
  <img data-src="image7.jpg" />
  <img data-src="image8.jpg" />
  <img data-src="image9.jpg" />
  <img data-src="image10.jpg" />
</div>

然后我们编写下面的 JavaScript 代码:

let images = document.querySelectorAll(".gallery img");
let observer = new IntersectionObserver(function(entries) {
  entries.forEach(function(entry) {
    if (entry.intersectionRatio > 0) {
      // 进入可视区域,进行加载
      entry.target.setAttribute("src", entry.target.getAttribute("data-src"));
      observer.unobserve(entry.target);
    }
  });
});

images.forEach(function(image) {
  // 判断并监控每个img元素
  if (image.offsetTop < window.innerHeight) {
    image.setAttribute("src", image.getAttribute("data-src"));
  } else {
    observer.observe(image);
  }
});

我们首先找到所有需要懒加载的img元素,然后通过 Intersection Observer API 来监控每个img元素。对于已经进入可视区域的img元素,直接加载他的src属性;对于那些尚未进入可视区域的img元素,等待浏览器触发相应的scroll事件后再进行加载操作,从而实现图片懒加载功能。

以上是前端JS图片懒加载的原理方案详解,希望对你有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:前端JS图片懒加载原理方案详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • matlab-octave/matlab中的deal()函数有什么意义?

    以下是关于“matlab-octave/matlab中的deal()函数有什么意义?”的完整攻略,包括基本概念、用法、示例和注意事项。 基本概念 deal()函数是Matlab/Octave中的一个内置函数,用于将输入参数分配给输出变量。它可以将多个输入参数分配给多个输出变量,也可以将一个输入参数分配给多个输出变量。 用法 deal()函数的基本语法如下: …

    other 2023年5月7日
    00
  • linux下代理服务器(proxy)配置

    Linux下代理服务器(proxy)配置 在网络访问时,有时需要使用代理服务器来实现特定的网络请求转发等功能。Linux系统提供了多种代理服务器配置方法,本文将介绍其中一种较为常见的配置方法。 1. 安装代理服务器软件 在Linux中,使用较为广泛的代理服务器软件通常有Squid、Privoxy、Tinyproxy等。这里以Squid为例进行介绍。 Squi…

    其他 2023年3月29日
    00
  • Spring中的bean概念介绍

    当谈到Spring框架时,“bean”一定是其中最重要的概念之一。Bean是指一个由Spring容器中管理的对象,可以是任何类的实例,通常表示应用程序的业务逻辑或实现。在Spring中,Bean是通过IoC(Inversion of Control)技术实现的。 什么是Bean? Bean是Spring中的一个组件,是管理对象以及自动装配的基本单元。Bean…

    other 2023年6月27日
    00
  • 实用的portraiture滤镜磨皮教程

    实用的 Portraiture 滤镜磨皮教程 概述 在肖像摄影中,皮肤质感和肤色是至关重要的元素。为了达到一张完美的肖像照片,很多摄影爱好者会使用磨皮技术。这种技术可以让照片中的皮肤更加光滑,减少皱纹和瑕疵,但如果使用不当,也容易让人物显得不真实。Portraiture 滤镜将为您的肖像照片提供最佳磨皮效果,同时保持自然的外观。 这篇教程将介绍使用Portr…

    其他 2023年3月28日
    00
  • iOS开发UI之弧形文字

    下面是关于“iOS开发UI之弧形文字”的完整攻略,包含以下几个方面: 1. 确定控件和方法 首先我们需要明确的是,实现弧形文字的方法,一般是通过创建一个包含文字的控件,然后将控件放置在一个环形的UIBezierPath路径上,最后将路径作为mask应用到控件上。因此,需要选用一个可以通过路径生成mask的控件,这里可以选择UILabel、UITextFiel…

    other 2023年6月20日
    00
  • 变量延迟详解 call setlocal

    变量延迟详解 call setlocal 完整攻略 在批处理脚本中,call setlocal 是一个非常有用的命令,它可以创建一个局部作用域,使得在该作用域内定义的变量仅在该作用域内有效。这种变量延迟的机制可以帮助我们更好地控制变量的作用范围,避免变量冲突和混淆。下面是关于 call setlocal 的详细讲解和示例说明。 1. call setloca…

    other 2023年8月17日
    00
  • java中array/list/map/object与json互相转换详解(转载)

    Java中Array/List/Map/Object与JSON互相转换详解(转载) 在Java中,我们常常需要进行各种类型之间的相互转换,最常见的就是把Java中的数据结构与JSON格式进行相互转换。为此,我们需要借助一些工具类库来完成,这篇文章就将详细讲解如何使用这些工具类库进行相应的转换操作。 使用Jackson库进行转换 在Java中,最常用的处理JS…

    其他 2023年3月28日
    00
  • vue报错”vue-cli-service‘不是内部或外部命令,也不是…”的解决办法

    当我们使用Vue CLI 4.x版本创建项目时,有时候会出现“vue-cli-service‘不是内部或外部命令,也不是可运行的程序”这个错误提示。这个问题通常是因为npm或yarn没有正确安装Vue CLI的命令行工具导致的。 以下是详细的解决步骤: 第一步:检查Vue CLI的版本 为了解决这个问题,我们首先需要检查我们安装的Vue CLI版本是否正确。…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部