原生JS实现图片懒加载

简介: 笔记

原理与概述



概述:如网页中需要加载N张图片,为了提升用户体验,减少用户的等待时间,兼顾加载性能。只加载当前视口的图片(也称作一屏),其余图片等用户向下滑动的时候再进行加载(滚动条向下滚动的时候)。


原理:获取用户设备当前高度,循环图片,获取其距离顶部的距离,处在第一屏的图片先加载,当滚动条发生滚动,继续加载。20.pnghtml 实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <style>
    img {
      display: block;
      margin-bottom: 50px;
      width: 400px;
      height: 400px;
    }
  </style>
</head>
<body>
  <img src="./img2/timg.gif" data-src="./img2/time.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time2.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time3.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time4.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time5.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time6.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time7.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time8.jpg" />
  <img src="./img2/timg.gif" data-src="./img2/time9.jpg" />
</body>
</html>

data-src : 这里存放的是图片的真实地址,等用户滚动条发生滚动,用元素中的 data-src 里的值替换 默认值src 便可。


js 实现



<script>
  // 获取图片标签的长度
    let num = document.getElementsByTagName("img").length; 
    // 获取所有图片标签
    let img = document.getElementsByTagName("img"); 
    // 计数器,防止每次遍历都从第一张图片开始
    let n = 0;  
    // 调用一次
    lazyload();
    // 绑定window的滚动事件
    window.onscroll = lazyload;
    function lazyload(){  
       // 可见区域高度
      let seeHeight = document.documentElement.clientHeight; 
      // 滚动条距离顶部的高度
      let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;  
      for(let i = n; i < num; i++){
        // 当图片距离顶部的距离小于视口高度+ 滚动距离(页面发生了滚动)
        if(img[i].offsetTop < seeHeight + scrollTop){
          if(img[i].getAttribute("src") == "./img2/timg.gif"){
            // 替换src
            img[i].src = img[i].getAttribute("data-src");
          }
          // 计数器赋值
          n = i + 1;
        }
      }
    }
  </script>
目录
相关文章
|
29天前
|
移动开发 JavaScript 前端开发
【Html.js——图片折叠效果】折叠手风琴(蓝桥杯真题-1763)【合集】
本项目实现了一个图片折叠手风琴效果,使用jQuery完成。主要包括以下部分: - **介绍**:任务是通过点击图片实现折叠和展开的效果。 - **准备**:内置初始代码,包含 `css/style.css`、`images/` 文件夹、`js/` 文件夹及 `index.html` 等文件。启动 Web Server 服务可运行项目。 - **目标**:完善 `index.js` 文件,使页面达到预期的折叠效果。 - **规定**:严格按步骤操作,保持默认文件结构不变,并在完成后保持 Web 服务正常访问状态。 - **通关代码**:使用 jQuery 实现点击事件,为选中元素添加 `act
42 19
|
26天前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
35 3
|
2月前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
5月前
|
移动开发 前端开发 JavaScript
原生JavaScript+canvas实现五子棋游戏_值得一看
本文介绍了如何使用原生JavaScript和HTML5的Canvas API实现五子棋游戏,包括棋盘的绘制、棋子的生成和落子、以及判断胜负的逻辑,提供了详细的代码和注释。
75 0
原生JavaScript+canvas实现五子棋游戏_值得一看
|
4月前
|
JavaScript 前端开发
JS懒加载
JS懒加载
36 0
|
5月前
|
JavaScript 前端开发
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
|
6月前
|
Devops 持续交付 测试技术
JSF遇上DevOps:开发流程将迎巨变?一篇文章带你领略高效协同的魅力!
【8月更文挑战第31天】本文探讨了如何在JavaServer Faces(JSF)开发中融入DevOps文化,通过持续集成与部署、自动化测试、监控与日志记录及反馈机制,提升软件交付速度与质量。文中详细介绍了使用Jenkins进行自动化部署、JUnit与Selenium进行自动化测试、ELK Stack进行日志监控的具体方法,并强调了持续改进的重要性。
56 0
|
6月前
|
JavaScript 前端开发 API
从零开始学表单操作,jQuery 与原生 JavaScript 完全指南,带你轻松掌握网页交互关键!
【8月更文挑战第31天】在网页开发中,表单是实现用户互动的关键元素。无论是收集信息、提交数据还是验证输入,都需要对表单进行有效操作。本文档介绍了如何使用原生 JavaScript 和 jQuery 操作表单,包括获取表单元素、读写表单值、处理表单提交及验证等核心功能。jQuery 提供了更简洁的语法和更好的兼容性,但原生 JavaScript 在性能上有优势。选择合适的方法取决于项目需求和个人偏好。下面通过具体示例展示了两种方式的操作方法。
54 0
|
6月前
|
JavaScript 前端开发
js懒加载
js懒加载
20 0
|
6月前
|
JavaScript 前端开发

热门文章

最新文章