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 可以实现懒加载的功能,即在元素进入视窗之前不加载其内容,只有当元素可见时才加载相应的资源(如图片、视频等)


参考资料


初心

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


相关文章
|
2月前
|
前端开发 JavaScript API
使用 JavaScript 实现图片上传
使用 JavaScript 实现图片上传
86 1
|
8天前
|
JavaScript 前端开发
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
|
2月前
|
JavaScript 前端开发
js懒加载
js懒加载
8 0
|
2月前
|
JavaScript 前端开发
|
2月前
|
JavaScript 前端开发
JS - 如何上传 Base64 编码的图片
本文展示了如何将Base64编码的图片在前端转换为Blob对象,并使用`FormData`上传到服务器端的方法。
139 0
|
2月前
|
JavaScript
js之图片上传
js之图片上传
64 0
|
3月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的图片推荐系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的图片推荐系统附带文章源码部署视频讲解等
34 0
|
3月前
|
JavaScript
js 滚动鼠标滑轮放大缩小图片
js 滚动鼠标滑轮放大缩小图片
22 0
|
3月前
|
前端开发 JavaScript
js 打开资源管理器(经典范例:纯前端选择并预览图片)
js 打开资源管理器(经典范例:纯前端选择并预览图片)
90 0