原生Js页面滚动延迟加载图片实现原理及过程

原生Js页面滚动延迟加载图片实现原理及过程,可以通过下面的攻略来详细讲解:

一、原理

页面滚动时,对视窗中的图片进行懒加载。当图片进入可视区域时,再加载该图片。这样可以减轻页面一次性加载所有图片的负担,提高网站的响应速度和性能。

具体实现原理如下:

  1. 检测网页中的所有图片
  2. 获取页面可视范围内的图片
  3. 预先将可视范围内的图片的 src 属性设为 loading 动画等待加载
  4. 监听页面滚动事件,若滚动至图片的位置,则将该图片的 src 属性替换为原始 url,实现图片的延迟加载

二、过程

根据以上原理,实现页面滚动延迟加载图片的步骤如下:

  1. 找到网页中所有需要进行延迟加载的图片
const images = document.querySelectorAll('[data-src]');
  1. 判断图片是否进入可视区域
// 判断是否在可视区域内
function isInViewport(element) {
    const rect = element.getBoundingClientRect();
    const html = document.documentElement;
    return (
        rect.top >= 0 &&
        rect.left >= 0 &&
        rect.bottom <= (window.innerHeight || html.clientHeight) &&
        rect.right <= (window.innerWidth || html.clientWidth)
    );
}
  1. 加载图片
function loadImage(image) {
    const src = image.getAttribute('data-src');
    if (!src) {
        return;
    }
    image.src = src;
    image.removeAttribute('data-src');
}
  1. 监听页面滚动事件
function onScroll() {
    for (let i = 0; i < images.length; i++) {
        const image = images[i];
        if (isInViewport(image)) {
            loadImage(image);
        }
    }
}
document.addEventListener('scroll', onScroll);

具体实现过程可以参考下面两个示例:

示例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">
</div>

javascript代码:

const images = document.querySelectorAll('[data-src]');

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

function loadImage(image) {
    const src = image.getAttribute('data-src');
    if (!src) {
        return;
    }
    image.src = src;
    image.removeAttribute('data-src');
}

function onScroll() {
    for (let i = 0; i < images.length; i++) {
        const image = images[i];
        if (isInViewport(image)) {
            loadImage(image);
        }
    }
}

document.addEventListener('scroll', onScroll);

示例1的效果是在页面滚动时,图片会逐个出现,并逐渐加载。

示例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">
</div>

javascript代码:

const images = document.querySelectorAll('[data-src]');

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

function loadImage(image) {
    const src = image.getAttribute('data-src');
    if (!src) {
        return;
    }
    image.src = src;
    image.removeAttribute('data-src');
}

function onScroll() {
    for (let i = 0; i < images.length; i++) {
        const image = images[i];
        if (isInViewport(image)) {
            loadImage(image);
            // 解除事件监听
            images[i].removeEventListener('load', onScroll);
        }
    }
}

for (let i = 0; i < images.length; i++) {
    // 添加load事件监听
    images[i].addEventListener('load', onScroll);
}

document.addEventListener('scroll', onScroll);

示例2的效果是图片会在进入可视范围后立即加载,不会逐渐出现。同时,每个图片只会加载一次,避免重复加载。

三、总结

以上就是原生Js页面滚动延迟加载图片实现原理及过程的详细攻略。该方法可以有效提高网站响应速度和性能,值得 Web 开发人员掌握。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生Js页面滚动延迟加载图片实现原理及过程 - Python技术站

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

相关文章

  • 详解JAVA的封装

    详解JAVA的封装 JAVA的封装是OOP编程的三大特征之一,指的是将一个对象的属性和方法作为一个不可分割的整体进行保护,避免外界直接访问和修改对象的属性和方法,只提供一些公共的方法接口来使得外部代码可以间接地操作对象。封装可用于保护数据,隐藏实现细节并提高代码的可重用性和安全性。 JAVA封装的实现方式 JAVA封装的主要实现是通过一下两种方式: 访问控制…

    other 2023年6月25日
    00
  • 批处理ren重命名的方式

    批处理文件可以用于许多重复性的任务中,其中一个任务就是批量重命名文件。Windows提供了一个内置的命令行工具–Ren,它可以帮助我们快速地修改文件名。 以下是批处理ren重命名的方式的完整攻略: 创建批处理文件 在电脑的任意位置右键新建一个txt文件,然后将其文件名改为“批处理文件名.bat”。这里的批处理文件名可以自定义,但后缀必须为.bat。 编写批…

    other 2023年6月26日
    00
  • goget代理设置

    以下是详细讲解“go get代理设置的完整攻略”,过程中至少包含两条示例说明的标准Markdown格式文本: go get代理设置的完整攻略 在某些情况下,由于网络限制或其他原因,go get可能无法正常工作。为了解决这些问题,可以设置go代理。本文将介绍如何设置go get代理,包括使用环境变量和命令行参数两种方法。 使用环境变量设置go get代理 以下…

    other 2023年5月10日
    00
  • 深入解读Java代码组织中的package包结构

    深入解读Java代码组织中的package包结构攻略 在Java中,package(包)是一种用于组织和管理代码的机制。它可以帮助我们将相关的类和接口组织在一起,提供更好的代码可读性和可维护性。本攻略将详细讲解Java代码组织中的package包结构,并提供两个示例说明。 1. 包的定义和命名规范 包是一种逻辑上的组织方式,它将相关的类和接口放在一起。包的定…

    other 2023年9月7日
    00
  • Android入门教程之Fragment的具体使用详解

    Android入门教程之Fragment的具体使用详解 什么是Fragment? Fragment是Android系统中的一个重要组建,它可以理解为Activity的模块化实现,可以通过将UI分割成多个模块来提高代码复用性和灵活性,同时能够更好地适应不同屏幕的尺寸和方向。 Fragment有自己的生命周期,并且可以被嵌套在其他Fragment或Activit…

    other 2023年6月27日
    00
  • vue中动态添加class类名的方法

    当我们需要根据不同的状态或条件为某个元素动态添加class类名时,Vue提供了多种实现方式。以下是其中的两种常见方法: 1.使用动态Class绑定 1.1 基本语法 Vue提供了动态Class绑定的语法,可以很方便地实现为元素动态添加class类名。 语法::class=”{class1:class1Condition, class2:class2Condi…

    other 2023年6月27日
    00
  • Linux中利用grep命令如何检索文件内容详解

    Linux中利用grep命令如何检索文件内容详解 grep是Linux系统中非常常用的命令行工具,常用于在文件或者输出流中查找指定的字符串。grep的基本语法如下: grep [OPTIONS] PATTERN [FILE…] 其中,OPTIONS是可选参数,可以用来控制grep的行为。PATTERN是需要查找的字符串,FILE是需要查找的文件名。如果省…

    other 2023年6月26日
    00
  • Win11 21h2更新补丁 KB5027223(22000.2057)六月累积更新推送(附完整更新日志)

    Win11 21h2更新补丁 KB5027223(22000.2057)六月累积更新推送攻略 1. 简介 Win11 21h2更新补丁 KB5027223(22000.2057)是微软在六月份发布的累积更新补丁,旨在提供系统的稳定性和安全性改进。本攻略将详细介绍如何安装和应用该更新补丁,并附上完整的更新日志。 2. 安装更新补丁 按照以下步骤安装Win11 …

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