IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 图片懒加载方案 -> 正文阅读

[JavaScript知识库]图片懒加载方案


一、概述

  • 图片懒加载其实就是延迟加载,我们知道浏览器的可视范围是有限的,现在网页的内容越来越丰富了,一般网页的内容都是需要进行滚动才能完成浏览,如果网页有很多图片,然而图片是非常吃流量的,如果用户还没有看到网页下面的内容,在某种程度上我们就没必要这么快加载这些看不到的图片。

二、监听scroll事件方案

  • 既然要滚动到网页下面才能预览到看不见的图片,因此一个要介绍的方法就是事件监听,监听scroll这个事件,鼠标滚动就触发,那么这里我们需要知道两个高度:
  • 第一个高度是窗口显示区的高度,可以用window.innerHeight来获取。
  • 第二个高度是图片到视窗上边的距离高度,可以用元素的getBoundingClientRect().top()来获取。
  • 如果图片还未能看见,也就是说图片距离视窗顶部的距离大于窗口显示区的高度。
  • 如果图片可以看见,也就是说图片距离视窗顶部的距离小于窗口显示区的高度。
  • 这就是比较简易的一种实现方式。
<div>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  ...
  <img data-src="test1.png" alt="">
  <img data-src="test2.png" alt="">
  <img data-src="test3.png" alt="">
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
  <p>这是一个P标签</p>
</div>

const images = document.querySelectorAll('img');

window.addEventListener('scroll', (e)=>{
 images.forEach(image=>{
   const imageTop = image.getBoundingClientRect().top();

   if (imageTop < window.innerHeight) {
     const data_src = image.getAttribute('data-src');

     image.setAttribute('src', data_src);
   }
   console.log('scroll触发')
 })
})

  • 图片懒加载是实现了,但是可以看到滚动事件被触发了相当多次,如果执行一些简单的动作还好,但是页面需要加载很多内容就会导致任务的堆积,而且即使图片已经加载了还是会不断触发事件,非常的消耗资源,因此需要使用节流来控制。
  • 但是下面介绍一个更好的方法-IntersectionObserver

三、IntersectionObserver方案

  • IntersectionObserver是浏览器提供的构造函数,也就是我们可以直接拿来使用,当然前提是要浏览器能够支持。
  • 浏览器支持情况如下,基本除了IE浏览器都支持的。

在这里插入图片描述

  • IntersectionObserver的字面意思就是交叉观察,也就是目标元素和可视窗口会产生交叉区域,观察交叉区域发生了什么事情,然后我们需要执行什么程序。

const images = document.querySelectorAll('img');
const observer = new IntersectionObserver(callback)

const callback = (entries) => {
  entries.forEach(entry=>{
    // 当图片元素进入窗口显示区entry.isIntersecting为true,否则为false
    if (entry.isIntersecting) {
      // 获取到进入窗口显示区的元素
      const image = entry.target;
      const data_src = image.getAttribute('data-src');
      image.setAttribute('src', data_src);

      // 图片加载后,就直接取消observer实例这个观察动作
      observer.unobserve(image)

      console.log('触发')
    }
  })
}

images.forEach(image => {
  observer.observe(image)
})
    
  • 使用这种方案后发现只触发了3次,因为只有三张图片。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-24 10:44:41  更:2022-01-24 10:46:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:32:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码