JS懒加载 -- 适用于商城主页商品懒加载、图片懒加载,算法简单、易于理解、萌新福音

简介: JS懒加载 -- 适用于商城主页商品懒加载、图片懒加载,算法简单、易于理解、萌新福音

       懒加载?什么是懒加载?・ࡇ・ ?

       很多萌新刚见到这个词时一定一头雾水,懒加载也叫做延迟加载、按需加载,指的是在长网页中延迟加载图片数据,是一种较好的网页性能优化的方式。在比较长的网页或应用中,如果内容很多,所有的内容都被加载出来,而用户只能看到可视窗口的那一部分图片数据,这样就浪费了性能。

       通俗来讲就是优化网页,使其更高效 (♡ര‿ര)

所以今天就教大家如何使用JS代码来实现懒加载的效果

       | ू•ૅω•́)ᵎᵎᵎ 开始演示:

创建html文件(我用的HbuildX演示)

然后创建html结构:

<div id="box">
  <div id="content"></div>
</div>
<p class="hint">正在加载中。。。</p>

然后是CSS样式:

<style>
      *{
        margin: 0;
        padding: 0;
      }
      #content{
        width: 100%;
        height: 200px;
        background-color: #1ACFFC;
        margin: 10px 0;
      }
      #hint{
        width: 100%;
        height: 30px;
        text-align: center;
        background-color: #F9CFCD;
      }
    </style>

当前效果(这里加了移动端适配):

下面就开始JS部分了ԅ(≖‿≖ԅ)

       假设data为数据总数,num为每次显示条数,那么我们一步一步来,先获取元素,将基础的5条渲染出来

<script>
      // 数据总数
      let data = 23
      // 一次显示的数量
      let num = 5
      // 获取页面父元素
      let box = document.getElementById("box")
      renders()
      // 页面渲染函数
      function renders(){
        let str = ''
        for(let i = 0 ; i < num ; i++){
          str += `<div id="content"></div>`
        }
        box.innerHTML = str
      }
    </script>

效果:

接下来就是如何渲染剩余的数据,和如何限制数据渲染,实现懒加载效果

一步一步来:首先添加scroll事件

// 给window添加事件监听,监听scroll事件
window.addEventListener("scroll",lazyLoad)

       窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度,如果大于,num数量增加,也就是划到底渲染剩余的内容,每次数量增加都要清除事件监听,以防止滚动事件重复触发

// 事件内容
      function lazyLoad() {
        // 窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度
        if (window.scrollY + window.innerHeight > document.body.scrollHeight) {
          num += 5
          if (num >= data) {
            num = data;
          }
          window.removeEventListener("scroll", ;lazyload);
        }
      }

       清除后,设置定时器,一秒后再将新的div数量渲染出来,并且判断渲染的数量是否等于总和的数量,如果不等于,说明还有没渲染出来的div,所以重新给wiindow绑定事件监听的scroll事件。

       若相等,说明全部渲染完毕,将尾部提示信息改为“暂无更多商品”

// 事件内容
      function lazyLoad() {
        // 窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度
        if (window.scrollY + window.innerHeight > document.body.scrollHeight) {
          num += 5
          if (num >= data) {
            num = data;
          }
          window.removeEventListener("scroll", lazyLoad);
          // 添加定时器
          setTimeout(function() {
            renders();
            if (num != data) {
              window.addEventListener("scroll", lazyLoad);
            } else {
              document.getElementById("hint").innerHTML = "暂无更多商品"
            }
          }, 1000)
        }
      }

效果如下:

完整代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport"
      content="width=device-width,initial-scale=1.0,minimum-scale=1.0,
            maximum-scale=1.0,user-scalable=no">
    <title></title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      #content {
        width: 100%;
        height: 200px;
        background-color: #1ACFFC;
        margin: 10px 0;
      }
      #hint {
        width: 100%;
        height: 30px;
        text-align: center;
        background-color: #F9CFCD;
      }
    </style>
  </head>
  <body>
    <div id="box">
      <div id="content"></div>
    </div>
    <p id="hint">正在加载中。。。</p>
    <script>
      // 数据总数
      let data = 23
      // 一次显示的数量
      let num = 5
      // 获取页面父元素
      let box = document.getElementById("box")
      renders()
      // 页面渲染函数
      function renders() {
        let str = ''
        for (let i = 0; i < num; i++) {
          str += `<div id="content"></div>`
        }
        box.innerHTML = str
      }
      // 给window添加事件监听,监听scroll事件
      window.addEventListener("scroll", lazyLoad)
      // 事件内容
      function lazyLoad() {
        // 窗口可视区域的高+滚动条滚动的高度 是否大于或等于网页整体内容的高度
        if (window.scrollY + window.innerHeight > document.body.scrollHeight) {
          num += 5
          if (num >= data) {
            num = data;
          }
          window.removeEventListener("scroll", lazyLoad);
          // 添加定时器
          setTimeout(function() {
            renders();
            if (num != data) {
              window.addEventListener("scroll", lazyLoad);
            } else {
              document.getElementById("hint").innerHTML = "暂无更多商品"
            }
          }, 1000)
        }
      }
    </script>
  </body>
</html>

(Ps:作者纯新人,本文仅用来分享所学知识并加以运用,若有什么错误,还恳请路过的大佬多多批评(♡ര‿ര))

目录
相关文章
|
3月前
|
前端开发 JavaScript API
使用 JavaScript 实现图片上传
使用 JavaScript 实现图片上传
120 1
|
1月前
|
JavaScript
js学习--商品列表商品详情
js学习--商品列表商品详情
17 2
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
103 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
85 0
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
3月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
1月前
|
JavaScript 前端开发
JS懒加载
JS懒加载
25 0
|
2月前
|
JavaScript 前端开发
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
【原创】用JavaScript动态获取网页中缩放图片的长度、宽度和显示比例
|
3月前
|
SQL 算法 Serverless
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
26 1
|
3月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
67 1