js 图片懒加载

简介: js 图片懒加载

1. 前言

  1. 之前写了react 图片懒加载的简单实现 ,vue的没找到
  2. 最近看了些博客又有新的理解 记录下

2. 是什么 what

  1. 懒加载是一种网页性能优化的方式,它能极大的提升用户体验。
  2. 因为现在都是5G网络普及了 图片,视频都已经在网站 是非常常见的了,但是呢他们也一直是影响网页性能的主要元凶,现在一张图片,视频超过几M已经是很经常的事了。
    如果每次进入页面就请求所有的图片,视频资源,那么可能等图片,视频加载出来用户也早就走了。
    所以,我们需要懒加载,进入页面的时候,只请求可视区域的图片资源

3. 最简单的实现方式是 html

  1. 哈哈给 img加个 loading 属性 ,现在大多数浏览器也都支持
  2. image.png
    loading支持情况.png

<img src="./yzs.png" loading="lazy">

4. js 实现

  1. react 图片懒加载的简单实现  这里的大体思路
  2. 设置占位图
  3. 监听window 的 scroll 事件
  4. 遍历每个图片判断当前图片是否到了可视区范围内
  5. 如果到了就设置图片的 src 属性
  • 优化

scroll 事件会在很短的时间内触发很多次,严重影响页面性能,为了提高网页性能,我们需要一个节流函数来控制函数的多次触发,在一段时间内(如 200ms)只执行一次回调


         

5. IntersectionObserver

  1. IntersectionObserver -MDN 定义
  2. 简单来说就是可以自动"观察"元素是否可见
  3. 由于可见(visible)的本质是,目标元素与视口产生一个交叉区,所以这个 API 叫做"交叉观察器"

构造函数

  1. IntersectionObserver()
  2. 创建一个新的 IntersectionObserver 对象,当其监听到目标元素的可见部分(的比例)超过了一个或多个阈值(threshold)时,会执行指定的回调函数。

let io = new IntersectionObserver(callback, option)
// 开始观察
io.observe(document.getElementById('example'))
// 停止观察
io.unobserve(element)
// 关闭观察器
io.disconnect()

懒加载的实现

核心代码

  1. data-src占位图属性

<!DOCTYPE html>
<html>
<head>
  <style>
    /* 假设图片的占位符具有固定的高度 */
    .placeholder {
      height: 200px;
      background-color: #eee;
    }
  </style>
</head>
<body>
  <div id="container">
    <div class="placeholder"></div>
    <img class="lazy-image" data-src="image.jpg" alt="Lazy Image">
    <div class="placeholder"></div>
    <img class="lazy-image" data-src="image2.jpg" alt="Lazy Image 2">
  </div>
  <script>
    // 获取所有的懒加载图片元素
    const lazyImages = document.querySelectorAll('.lazy-image');
    // 创建 IntersectionObserver 实例
    const observer = new IntersectionObserver((entries, observer) => {
      entries.forEach(entry => {
        // 当元素进入视窗时加载图片
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = img.dataset.src;
          img.classList.remove('lazy-image');
          observer.unobserve(img); // 停止观察已加载的图片
        }
      });
    });
    // 遍历每个懒加载图片元素,并开始观察
    lazyImages.forEach(image => {
      observer.observe(image);
    });
  </script>
</body>
</html>

使用 IntersectionObserver 可以实现懒加载的功能,即在元素进入视窗之前不加载其内容,只有当元素可见时才加载相应的资源(如图片、视频等)


参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉


相关文章
|
4天前
|
存储 开发框架 JavaScript
uniapp、vue、小程序、js图片转base64 示例代码
uniapp、vue、小程序、js图片转base64 示例代码
45 0
|
4天前
|
JavaScript 前端开发 安全
使用 Node.js 插件给指定目录下的所有图片添加上文字水印
使用 Node.js 插件给指定目录下的所有图片添加上文字水印
68 0
|
4天前
|
移动开发 JavaScript 定位技术
分享118个JS图片代码,总有一款适合您
分享118个JS图片代码,总有一款适合您
23 0
|
4天前
|
JavaScript 前端开发 API
js截取图片地址后面的参数和在路径中截取文件名或后缀名
在处理网页上的图片资源或者其他类型的文件资源时,你可能会遇到需要使用这些技巧的情况。以下是一些具体的使用场景:
24 0
|
2天前
|
JavaScript 索引
jQuery 实现 图片框切换【与原生 JS 对比】
jQuery 实现 图片框切换【与原生 JS 对比】
|
2天前
|
JavaScript 前端开发 流计算
使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理
使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理
|
4天前
|
JavaScript
js判断图片是否加载完成
js判断图片是否加载完成
28 0
|
4天前
|
Web App开发 前端开发 iOS开发
编程笔记 html5&css&js 008 HTML图片
编程笔记 html5&css&js 008 HTML图片
|
4天前
|
开发框架 JavaScript 小程序
uniapp、vue、小程序、js图片转base64 示例代码
uniapp、vue、小程序、js图片转base64 示例代码
|
4天前
|
JavaScript 前端开发 安全
分享117个JS图片代码,总有一款适合您
分享117个JS图片代码,总有一款适合您
14 0