原生JS实现图片懒加载(lazyload)实例

下面就来详细讲解原生JS实现图片懒加载(lazyload)实例的完整攻略。

什么是懒加载(lazyload)

懒加载(也称为延迟加载)是一种在网页上优化图片加载的技术,它可以减少网页的初次加载时间,提高用户体验。懒加载的原理是在页面初始加载时,只加载可视区域内的图片,当用户滑动页面时,再加载其他区域的图片,这样可以避免一次性请求大量的图片资源,减少页面的下载量。

实现懒加载的步骤

实现懒加载的主要步骤如下:

  1. 在页面中标记需要懒加载的图片元素,例如使用 data 属性存储图片的真实地址。
  2. 监听窗口滚动事件,在滚动时计算出当前可视区域的范围。
  3. 遍历所有需要懒加载的图片元素,判断它们是否在可视区域内,如果在则将真实的图片地址替换成 src 属性,实现图片的加载。

接下来我们将通过两个示例来详细讲解如何实现懒加载。

示例一:基本的懒加载实现

首先,我们在页面中添加需要懒加载的图片元素,如下所示:

<!-- 在 img 元素中使用 data-src 存储真实的图片地址 -->
<img data-src="image1.jpg" alt="image1">
<img data-src="image2.jpg" alt="image2">
<img data-src="image3.jpg" alt="image3">
<!-- ... -->

然后,我们在页面底部添加如下的 JavaScript 代码:

window.addEventListener('scroll', function() {
  const images = document.querySelectorAll('img[data-src]');  // 找到所有需要懒加载的图片
  for (let i = 0; i < images.length; i++) {
    if (isInViewport(images[i])) {  // 判断图片是否在可视区域内
      images[i].src = images[i].dataset.src;  // 将 data-src 属性替换为 src 属性,实现图片的加载
      images[i].removeAttribute('data-src');  // 移除 data-src 属性
    }
  }
});

function isInViewport(element) {
  const rect = element.getBoundingClientRect();  // 获取元素在视口中的位置信息
  return (
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.right <= (window.innerWidth || document.documentElement.clientWidth)
  );
}

代码中,我们首先通过 document.querySelectorAll 方法找到所有需要懒加载的图片元素,然后遍历这些元素,利用 isInViewport 函数判断图片是否在可视区域内,如果在则将 data-src 属性替换为 src 属性,实现图片的加载。

示例二:使用 IntersectionObserver API

除了通过监听窗口滚动事件实现懒加载外,我们还可以使用 IntersectionObserver API 来更简单、高效地实现懒加载,这是一个浏览器原生支持的 API。

首先,我们定义一个 LazyLoad 类:

class LazyLoad {
  constructor(selector) {
    this.images = document.querySelectorAll(selector);  // 找到所有需要懒加载的图片
    this.intersectionObserver = new IntersectionObserver(this.onIntersection.bind(this), {
      rootMargin: '100px 0px',  // 额外的区域,用于提前加载图片
      threshold: 0.01  // 监听元素可见度的阈值
    });
    this.init();
  }

  init() {
    this.images.forEach(img => this.intersectionObserver.observe(img));  // 将所有图片元素添加到观察者对象中进行监听
  }

  onIntersection(entries) {
    entries.forEach(entry => {
      if (entry.intersectionRatio > 0) {  // 判断元素是否在可见区域
        const image = entry.target;
        this.loadImage(image);  // 加载图片
        this.intersectionObserver.unobserve(image);  // 取消对元素的监听,提高性能
      }
    });
  }

  loadImage(image) {
    const src = image.dataset.src;
    if (!src) {  // 检查是否已加载
      return;
    }
    image.src = src;  // 将 data-src 替换为 src,实现图片的加载
    image.removeAttribute('data-src');
  }
}

然后,我们可以在页面中创建一个 LazyLoad 对象来进行图片懒加载:

const lazyLoad = new LazyLoad('img[data-src]');

代码中,我们通过先找到所有需要懒加载的图片元素,然后利用 IntersectionObserver 对象来监听这些元素是否在可视区域内,如果是则触发 onIntersection 回调进行图片的加载。在加载图片时,我们将 data-src 属性替换为 src 属性,实现图片的懒加载。

总结:通过以上两种方式实现图片的懒加载为我们提供了更好的用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JS实现图片懒加载(lazyload)实例 - Python技术站

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

相关文章

  • 开机系统准备工具如何关闭

    当然,我很乐意为您提供有关“开机系统准备工具如何关闭”的完整攻略。以下是详细的步骤和两个示例: 1 关闭开机系统准备工具 开机系统准备工具是操作系统的一个功能,它可以帮助您在计算机启动时进行故障排除和修复。如果您不需要使用此功能,可以通过步骤关闭它: 1.1 使用系统配置工具 可以使用系统配置工具来关闭开机系统准备工具。以下是步骤: 打开“运行”对话框,方法…

    other 2023年5月6日
    00
  • 利用opencv实现图片的配准/对齐

    以下是关于“利用opencv实现图片的配准/对齐”的完整攻略,包含两个示例。 背景 图像配准/对齐是指将多图像中的相同场景进行对齐,使得它们在像素级别上对应。在计算机视觉领域,图像配准/对齐是一个重要的问题。OpenCV是一个流行的计算机视觉库,它提供了许多图像配准/对齐的算法和工具。 安装 在使用OpenCV之前,我们需要先安装它。具体步骤如下: 安装Op…

    other 2023年5月9日
    00
  • 一款Jquery 分页插件的改造方法(服务器端分页)

    一款Jquery 分页插件的改造方法(服务器端分页)是指将Jquery分页插件通过与服务器进行交互,从服务器请求数据并进行分页展示的过程。下面是一些步骤和示例说明: 步骤 在客户端初始化分页插件时,要添加一些额外的参数,如: var options = { totalPages: 10, visiblePages: 3, onPageClick: funct…

    other 2023年6月27日
    00
  • 【技术博客】使用iview的tree组件写一棵文件树

    【技术博客】使用iview的tree组件写一棵文件树 随着前端技术不断的发展,越来越多的Web应用开始大量使用React、Angular、Vue等主流的前端框架。iview是一个采用Vue.js开发的UI组件库,提供了丰富的UI组件,对于前端开发来说非常有用。其中的tree组件可以轻松地实现一棵文件树的展示。本篇技术博客将介绍如何使用iview的tree组件…

    其他 2023年3月28日
    00
  • 关于python:为什么不能安装cpickle

    在Python 3.x版本中,cpickle是一个用于序列化和反序列化Python对象的模块。但在某些情况下,我们可能会遇到不能安装cpickle的问题。本文详细介绍为什么会出现这个问题以及如何解决它。 为什么不能安装cpickle 在Python 3.x版本中,cpickle已经被弃用,取而代之是pickle模块。因此,在Python 3.x版本中,我们不…

    other 2023年5月7日
    00
  • Python issubclass和isinstance函数的具体使用

    Python isinstance和issubclass函数的具体使用 isinstance和issubclass 是Python两个非常实用的内置函数。虽然它们都可以用来判断变量类型,但是两者骨子里还是有一定的差别。 isinstance函数 isinstance(object,classinfo)用来判断 object 是否是 classinfo 类型的…

    other 2023年6月26日
    00
  • Linux系统中Squid代理服务器配置全过程解析

    Linux系统中Squid代理服务器配置全过程解析 Squid是一款基于UNIX和Linux系统下的高性能、高可靠性和完全免费的代理服务器软件。它能够通过缓存静态和动态网络内容改善网络性能,加快用户网络访问速度,提高网络流量的带宽利用率,还可以过滤网络流量、保护网络安全。本文将逐步详细讲解如何在Linux系统下配置Squid代理服务器。 安装Squid代理服…

    other 2023年6月27日
    00
  • 如何使用WPS文字中的窗体控件使填写表格更规范化

    下面是详细的攻略: 1. 准备工作 首先,需要确保你已经安装了WPS Office,并且正在使用WPS文字。在WPS文字中,打开一个新文档,准备进行表格编辑。 2. 插入窗体控件 在WPS文字中,插入窗体控件的方法如下: 点击“插入”选项卡,在下拉菜单中选择“窗体控件”; 在弹出的窗口中,选择需要的控件类型,比如文本框、下拉菜单等; 点击“确定”按钮,将控件…

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