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

yizhihongxing

原生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 Spring读取和存储详细操作

    Java Spring读取和存储详细操作 1. 读取数据 1.1. 从数据库读取数据 在Java Spring中,可以使用Spring Data JPA来简化数据库的读取操作。下面是读取数据的操作步骤: 步骤1: 创建实体类 首先,创建一个实体类,该实体类对应数据库中的表。可以使用@Entity注解来标识该类为实体类,并使用@Table注解指定对应的数据库表…

    other 2023年6月28日
    00
  • WebStorm(Amaze开发工具)–JavaScript 开发工具

    WebStorm(Amaze开发工具)–JavaScript 开发工具的完整攻略 WebStorm是一款由JetBrains开发的JavaScript开发工具,提供了丰富的功能和工具,包括代码自动补全、调试、版本控制等。本文将详细讲解WebStorm的使用方法和功能,包括两个示例说明。 WebStorm的安装和配置 WebStorm的安装和配置非常简单,只…

    other 2023年5月5日
    00
  • 非常精妙的PHP递归调用与静态变量使用

    PHP递归调用是指函数可以自己调用自己,并通过不断调用自己实现递归过程,这种调用方式可以很好的解决某些问题,避免使用循环带来的不必要的复杂性。 在使用递归时,静态变量的使用可以把递归函数中需要保留的变量(如累加器、计数器等)保存下来。静态变量不会在函数调用结束时销毁,而是在程序结束时才被销毁,这就保证了递归函数的正常运行。 以下是两个示例: 示例一:递归求和…

    other 2023年6月27日
    00
  • 哔哩哔哩如何清理缓存?哔哩哔哩清理存储空间方法

    哔哩哔哩如何清理缓存? 哔哩哔哩是一个非常受欢迎的在线视频平台,它在使用过程中可能会占用大量的存储空间。为了释放存储空间并提高设备的性能,清理哔哩哔哩的缓存是一个不错的选择。下面是清理缓存的详细攻略: 步骤一:打开哔哩哔哩应用 首先,找到并打开你的哔哩哔哩应用。你可以在手机的应用列表中找到它,通常是一个带有蓝色背景和“哔哩哔哩”字样的图标。 步骤二:进入设置…

    other 2023年8月1日
    00
  • MyBatis 如何配置多个别名 typeAliasesPackage

    MyBatis 如何配置多个别名 typeAliasesPackage 在 MyBatis 中,我们可以使用 typeAliasesPackage 属性来配置别名,以便在 SQL 映射文件中使用简化的类名来引用实体类。下面是配置多个别名包的步骤: 在 MyBatis 的配置文件(通常是 mybatis-config.xml)中,添加 typeAliasesP…

    other 2023年10月13日
    00
  • iOS13.1.1正式版固件下载地址 iOS13.1.1下载

    iOS13.1.1正式版固件下载地址 iOS13.1.1下载攻略 简介 iOS13.1.1是苹果公司发布的最新版本的iOS操作系统。本攻略将详细介绍如何下载iOS13.1.1正式版固件,并提供两个示例说明。 步骤 步骤一:备份设备 在开始下载iOS13.1.1之前,建议您先备份您的设备以防止数据丢失。您可以通过iCloud或iTunes进行备份。 步骤二:检…

    other 2023年8月5日
    00
  • 深入AndroidManifest.xml文件解析详解

    以下是使用标准的Markdown格式文本,详细讲解深入AndroidManifest.xml文件解析的完整攻略: 深入AndroidManifest.xml文件解析 AndroidManifest.xml是Android应用的清单文件,它包含了应用的基本信息、组件声明、权限要求等重要信息。深入理解和解析AndroidManifest.xml文件可以帮助我们更…

    other 2023年10月14日
    00
  • python的endswith()的使用方法及实例

    Python的endswith()方法 endswith()是Python字符串对象的一个内置方法,用于检查字符串是否以指定的后缀结尾。它返回一个布尔值,如果字符串以指定的后缀结尾,则返回True,否则返回False。 语法 endswith(suffix[, start[, end]]) suffix:必需,指定要检查的后缀。可以是一个字符串或一个元组,如…

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