LazyLoad 延迟加载(按需加载)

yizhihongxing

LazyLoad 延迟加载(按需加载)是一种在页面加载时,只加载当前视窗内所需要的部分内容,避免不必要的资源浪费和页面加载时间过长的现象。这种技术在网站中的应用非常常见。

实现方式

实现LazyLoad延迟加载的方式有多种,其中最常见的是使用JavaScript库。以下是一些常见的JavaScript库:
- Layzr.js:轻量级、易扩展和可定制,可用于图片和文本的延迟加载
- lozad.js:极简而快速的JavaScript库,可以延迟加载图像、视频、音频或iframe元素
- LazyLoad:使用内建可扩展API的高性能、小型JavaScript库,适用于多种元素的延迟加载。

实现流程

在使用现有库之前,应该了解延迟加载的基本原理和实现流程。下面以图片延迟加载为例,进行解释:

  1. 为需要延迟加载的图片添加占位符(例如一个占位符图形)。不要忘记将原始图片的URL保存在html标记中的一个特定属性中,通常是 data-src
<img src="https://via.placeholder.com/300x300" data-src="image.jpg">
  1. 加载完整页面后,使用JavaScript检测视窗内所有应该被延迟加载的图片。通常的方法是获取图片的位置和页面滚动位置,如果当前位置在可视窗口内,就将占位符替换为实际图片。否则,不需要进行图片加载
const images = document.querySelectorAll("img[data-src]");

const inViewport = (image) => {
    const rect = image.getBoundingClientRect();
    return (
        rect.top >= 0
        && rect.left >= 0
        && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)
        && rect.right <= (window.innerWidth || document.documentElement.clientWidth)
    );
};

const loadImage = (image) => {
    image.setAttribute("src", image.getAttribute("data-src"));
    image.onload = () => {
        image.removeAttribute("data-src");
        image.style.opacity = 1;
    };
};

const handleScroll = () => {
    images.forEach((image) => {
        if (inViewport(image)) {
            loadImage(image);
        }
    });
};

window.addEventListener("load", handleScroll);
window.addEventListener("scroll", handleScroll);

在上述JavaScript示例中,我们
- 首先获取页面中所有含有 data-src 属性的图片
- 接着实现了 inViewport() 方法,以检测图片是否在页面视窗内
- loadImage() 方法用于替换占位符
- 最后使用事件监听器来获取页面的滚动,以重新检查需要延迟加载的图片并加载图像

示例说明

接下来示例说明如何使用Layzr.js库实现延迟加载原图并预加载已缩放版本的图像。

<img src="placeholder/300x300.png" 
     data-src="original-image.jpg" 
     data-src-small="300x300-image.jpg"  
     class="lazyload">

上述示例中,我们使用一个 lazyload 类来标记图片,并使用 data-src 属性来存储原始图像的URL,使用 data-src-small 存储25%的缩放版本的URL。我们还添加了一个占位符,这里使用了一个矩形的PNG。

在使用Layzr.js时,我们只需要如下简单代码:

const layzr = new layzr();

//延迟加载待替换的所有占位符中的原图像
layzr.on("load", (image) => {
    //加载图片
    const src = image.getAttribute("data-src");
    image.setAttribute("src", src);
});

//预加载所有缩略图
document.addEventListener("DOMContentLoaded", () => {
    const images = document.querySelectorAll("[data-src-small]");
    images.forEach((img) => new Image().src = img.getAttribute("data-src-small"));
});

在上述JavaScript代码中,我们首先实例化了Layzr.js库,然后使用 on() 方法来监听 load 事件。在事件回调中,我们使用 setAttribute() 将实际图像的URL设置为图片的 src 属性。 load事件在图片加载完成后立即触发。

最后,我们在页面加载时使用 document.addEventListener() 方法预加载所有缩略图。这样可以更好地保证延迟加载原图像时用户不会看到闪烁的问题。

参考文献:
- Lazy Loading Images Using Intersection Observer API in JavaScript
- Lozad.js - A performant, lazy loading and multi-serving image observer
- CallMeCavs/Layzr.js

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:LazyLoad 延迟加载(按需加载) - Python技术站

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

相关文章

  • JavaScript基础之运算符

    JavaScript基础之运算符 在 JavaScript 中,我们可以使用不同的运算符对各种数据类型进行各种操作。下面介绍几种常用的运算符。 算术运算符 算术运算符用于操作数字类型的数据。 加号(+) 加号用于加法运算。 let a = 1, b = 2; let c = a + b; // c = 3 减号(-) 减号用于减法运算。 let a = 2,…

    JavaScript 2023年5月18日
    00
  • Javascript Array join 方法

    以下是关于JavaScript Array join方法的完整攻略。 JavaScript Array join方法 JavaScript Array join方法用于将数组中的所有元素转换为一个字符串。该方法将数组中的每个元素转换为字符串,并使用指定的分隔符将它们连接起来。如果没有指定分隔符,则默认使用逗号作为分隔符。 下面是一个使用join方法的示例: …

    JavaScript 2023年5月11日
    00
  • Android中WebView无法后退和js注入漏洞的解决方案

    一、Android中WebView无法后退的解决方案 问题描述:在Android中使用WebView时,通过back键无法返回上一个网页,点击后退按钮也没有用。 解决方案:Android中WebView默认是不支持返回上一个网页的,需要在WebView中重写onKeyDown方法,当按下back键时,让WebView返回上一个网页。 示例代码: @Overr…

    JavaScript 2023年6月11日
    00
  • JS FormData对象使用方法实例详解

    JS FormData对象使用方法实例详解 什么是FormData对象 FormData对象是JavaScript提供的一种数据处理对象,主要用来实现表单数据的序列化操作、数据的自动编码以及数据传输等功能。 FormData对象常用方法 FormData对象常用的方法有以下几种: append(name, value[, filename]): 在一个for…

    JavaScript 2023年5月27日
    00
  • JS中作用域和变量提升(hoisting)的深入理解

    作用域和变量提升是JavaScript中非常重要的概念。作用域指的是程序中变量的可访问范围,而变量提升意味着变量和函数声明可以在实际声明之前使用。理解这些概念可以帮助开发人员编写更好的JavaScript代码,并帮助他们避免错误。 作用域 JavaScript中有两种作用域:全局作用域和局部作用域。全局作用域的变量在整个程序中都是可访问的,而局部作用域的变量…

    JavaScript 2023年5月28日
    00
  • 基于JavaScript定位当前的地理位置

    下面是“基于JavaScript定位当前的地理位置”的完整攻略。 一、前提准备 在开始定位当前的地理位置之前,需要完成以下几个前提准备: 获取用户的位置需要用户授权,所以需要在web应用程序中使用HTML5的Geolocation API,而Geolocation只支持在HTTPS或者本地host环境下使用,所以需要对应用进行HTTPS协议的开发或者本地开发…

    JavaScript 2023年6月11日
    00
  • Dom 结点创建 基础知识

    DOM(Document Object Model)是一种用来访问和操作 HTML 或 XML 文档的标准 API。在 JavaScript 中,通过 DOM API 可以在文档中创建新的节点,也可以对现有的节点进行操作。 创建 DOM 结点 在页面中创建 DOM 节点有两种方式:通过 HTML 代码创建,或者通过 JavaScript 代码动态创建。 通过…

    JavaScript 2023年6月10日
    00
  • ECMAScript6快速入手攻略

    下面是“ECMAScript6快速入手攻略”的完整攻略: 什么是ECMAScript6? ECMAScript6是JavaScript的一种新版本,也称为ECMAScript2015。它是一种相对于ES5更先进且功能更强大的脚本语言,它改进了很多的语法。它不是一种新的语言,而是JavaScript的下一代标准。 如何使用ECMAScript6? 要开始使用E…

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