原生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日

相关文章

  • vue项目中使用axios上传图片等文件操作

    在Vue项目中使用axios上传图片等文件操作,可以按照以下步骤进行: 安装axios和form-data 首先,需要安装axios和form-data两个依赖项。可以使用以下命令进行安装: npm install axios form-data 创建上传文件的表单 在Vue组件中,需要创建一个表单来上传文件。可以按照以下示例代码创建表单: <temp…

    other 2023年5月7日
    00
  • Thinkphp5.0框架视图view的模板布局用法分析

    ThinkPHP 5.0框架视图(View)的模板布局用法分析攻略 1. 简介 ThinkPHP 5.0是一款流行的PHP开发框架,提供了强大的视图(View)功能,用于实现Web应用程序的模板布局。本攻略将详细介绍ThinkPHP 5.0框架视图的模板布局用法。 2. 模板布局的基本概念 模板布局是指在Web应用程序中,通过定义一个公共的模板文件,然后在该…

    other 2023年9月5日
    00
  • springboot配置文件的加载顺序解析

    下面给出完整的“springboot配置文件的加载顺序解析”攻略。 配置文件加载规则 在Spring Boot应用启动时,会加载一组规则,来确定加载哪些属性、哪些配置文件。按照如下的加载规则: 所有指定的配置文件会按照以下顺序读取: file:./config/ 目录下的全部配置文件 file:./ 目录下的全部配置文件 classpath:/config/…

    other 2023年6月25日
    00
  • Redis通用命令介绍以及key的层级结构讲解

    Redis通用命令介绍 什么是Redis Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统。它提供了一个键值对存储的数据库,支持多种数据结构,包括字符串,列表,集合,散列,有序集合等。Redis主要特点是性能高,数据存储在内存中,是一个NoSQL数据库。 Redis通用命令介绍 1. 设置键值对 set …

    other 2023年6月27日
    00
  • ios13没有开发者预览版怎么更新 iOS13测试版升级教程防止变砖

    下面我来为你详细讲解“iOS 13没有开发者预览版怎么更新 iOS 13测试版升级教程防止变砖”的完整攻略。 1. 确认设备越狱状态 在升级 iOS 13 测试版之前,首先要确认设备是否处于越狱状态。如果设备已经越狱,则不建议升级测试版,因为这可能会导致设备变砖。可以通过以下步骤来检查设备是否越狱: 打开 Cydia 应用 如果看到 Cydia 首页上显示了…

    other 2023年6月26日
    00
  • android自定义AlertDialog对话框

    下面将介绍 Android 自定义 AlertDialog 对话框的完整攻略,并提供两个示例说明。 一、概述 Android 自带的 AlertDialog 对话框虽然功能齐全,但是界面风格比较单一,无法满足某些特定需求。因此,开发者可以通过自定义 View 来实现个性化的 AlertDialog 对话框。 二、步骤 创建布局文件 首先根据个性化需求创建自定…

    other 2023年6月25日
    00
  • 谈谈我对Spring Bean 生命周期的理解

    下面是关于Spring Bean生命周期的详细讲解。 Spring Bean 生命周期 Spring Bean生命周期指的是从Bean实例化开始,到销毁的整个过程。下面列出了Spring Bean生命周期的主要步骤: 实例化Bean:使用Java实例化Spring Bean。 设置Bean的属性值:调用setter方法或通过构造函数传递Spring Bean…

    other 2023年6月20日
    00
  • Eclipse中安装反编译工具Fernflower的方法(Enhanced Class Decompiler)

    下面是Eclipse中安装反编译工具Fernflower的方法(Enhanced Class Decompiler)的详细攻略。 概述 我们需要在Eclipse中安装Fernflower(Enhanced Class Decompiler)。Fernflower是一个开源的、独立的、Java字节码反编译器,它可以将Java字节码反编译为等效的Java源代码。…

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