jQuery滚动加载图片实现原理

一、 jQuery滚动加载图片的原理

jQuery滚动加载图片是一种前端优化方式,它的原理是在页面向下滚动的过程中异步加载图片,避免一次性加载过多的图片造成网页速度过慢的问题。其实现过程分为以下几个步骤:

  1. 绑定滚动事件:绑定滚动事件,当滚动条到达页面底部时触发特定函数。

  2. 判断滚动条高度:判断当前滚动条的高度是否超过了页面的高度,如果超过了,就表示已经到达页面底部。

  3. 异步加载图片:在滚动到页面底部时,使用Ajax异步加载图片。由于页面只会加载可视范围内的图片,因此可以大大减少页面图片加载量。

  4. 使用动画效果:为了增加用户体验度,可以使用动画效果,在图片加载完成后进行展示。

二、 jQuery滚动加载图片的实现方法

1.基础版

首先,我们需要先在页面中引入 jQuery 库,然后遍历所有带有 lazy 类的图片元素。代码如下:

$('img.lazy').each(function() {
  var self = $(this), 
      src = self.attr('data-original');
  self.attr('src', src);
}); 

接着,我们需要给文档注册滚动事件,在滚动到底部时加载你的图片。代码如下:

var page = 1;
$(window).scroll(function() {
  if ($(document).scrollTop() >= $(document).height() - $(window).height()) {
      page++;
      $.ajax({
        type: 'POST',
        url: '/ajax/lazyload/',
        data: {'page': page},
        dataType: 'html',
        success: function(data) {
          if (data.trim() !== '') {
            $('.mol-post-list').append(data);
            $('img.lazy').each(function() {
              var self = $(this), 
                  src = self.attr('data-original');
              self.attr('src', src);
            });
          }
        }
      });
  }
});

这里我们使用了 document 对象的 scrollTop() 方法来获取滚动的高度, 然后使用 document 对象的 height() 方法获取页面高度,最后结合 $(window).height() 获取页面可见范围高度,用三者之和来判断页面是否已经滚动到底部。

  1. 进阶版

如果页面上的图片非常多,一次性全部加载,并不是很好,这个时候我们可以使用类似于分页的方式,即先加载一页的图片,当滚动条接近底部时,再加载下一页的图片,但是这种加载方式如果用户非常快速地滑动屏幕的话,就会先显示默认的无数据提示,让用户感觉不是很友好,这里我们可以增加一个 loading 效果,增强用户体验。

代码如下:

var page = 1,
    forEnd = true;
$(window).scroll(function() {
  if (forEnd) { // 加上流程控制,防止未加载完成又触发
      if ($(document).scrollTop() >= $(document).height() - $(window).height() - 50) {
      forEnd = false;
          page++;
          $('.loading').show(); // 显示loading效果
          $.ajax({
            type: 'POST',
            url: '/ajax/lazyload/',
            data: {'page': page},
            dataType: 'html',
            success: function(data) {
              if (data.trim() !== '') {
                $('.mol-post-list').append(data);
                $('img.lazy').each(function() {
                  var self = $(this), 
                      src = self.attr('data-original');
                  self.attr('src', src);
                });
                // 隐藏loading效果,页面元素解锁,可以再次滚动加载
                $('.loading').hide();
                forEnd = true;
              }
            }
          });
      }
  }
});

在这个案例中,我们可以看到,在滚动到底部时,页面将会显示 loading 效果,当实际异步加载完数据后,才会展示所有的图片和内容,同时隐藏 loading 效果。

三、样例

  1. 基础版

在页面上存在图片列表的情况下,HTML 代码如下

<ul class="img-list">  
  <li><img src="loading.gif" data-original="1.jpg" class="lazy"/></li>  
  <li><img src="loading.gif" data-original="2.jpg" class="lazy"/></li>  
  <li><img src="loading.gif" data-original="3.jpg" class="lazy"/></li>  
  <li><img src="loading.gif" data-original="4.jpg" class="lazy"/></li>  
  <li><img src="loading.gif" data-original="5.jpg" class="lazy"/></li>  
</ul>

然后在页面底部添加一个 loading.png 图片,用来做异步加载数据的 loading 效果。

<div class="loading">
  <img src="loading.png">
  <span>数据加载中,请稍后...</span>
</div>

为了减少代码冗余,我们可以将 lazyload.js 复制到自己项目中,修改其中的请求 URL 等参数,绑定懒加载事件:

$('img.lazy').lazyload({
   effect : "fadeIn"
});

var page = 1;
$(window).scroll(function() {
    if ($(document).scrollTop() >= $(document).height() - $(window).height()) {
        page++;
        $.ajax({
            type: 'POST',
            url: '/ajax/lazyload/',
            data: {'page': page},
            dataType: 'html',
            success: function(data) {
                if (data.trim() !== '') { $('.img-list').append(data);
                    $('img.lazy').lazyload({
                        effect : "fadeIn"
                    });
                }
            }
        });
    }
});

上述代码当页面滚动到底部时,就会异步加载数据,加载时间取决于服务器响应速度以及数据量大小。如果数据加载成功,就添加到当前页面中。

  1. 进阶版

上文中实现了基础懒加载功能的代码,如果想让懒加载更能体现其优势,可以利用封装好的 jQuery 插件 infinite-scroll,它可以实现滚动到底部时自动加载下一页内容的功能。

首先,我们需要引入 infinite-scroll.js 文件:

<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.lazyload.min.js"></script>
<script type="text/javascript" src="infinite-scroll.pkgd.min.js"></script>

然后,我们需要在页面中创建数据源。这里使用了 faker.js 插件,随机生成一些文章数据。

<div id="post-container">
  <!-- 此处留作后续数据注入 -->
</div>

<!-- 具有 loading 效果的容器 -->
<div id="loading-container">
  <p>正在加载中...</p>
</div>

接着,我们需要在 JavaScript 中编写代码实现。

var baseUrl = "https://fakerapi.it/api/v1/posts?page="; // 数据源地址
var $postContainer = $("#post-container"); // 设定容器(可能是 ul、div 等)
var $loadingContainer = $("#loading-container"); // 设定 loading 效果的容器
var pageIndex = 1; // 页码
function loadData() {
  var requestUrl = baseUrl + pageIndex; // 拼接数据源地址
  $.get(requestUrl).done(function(response) {
    var data = response.data; // 直接获取 arrays 结构中的数据
    var list = "";
    if (data.length > 0) {
      for (var i = 0; i < data.length; i++) {
        var postData = data[i];
        list += '<div class="post-item">';
        list += '<h2>' + postData.title + '</h2>';
        list += '<div class="post-info">' + postData.created_at + '<span>' + postData.category.name + '</span>' + '</div>';
        list += '<p>' + postData.content + '</p>';
        list += '</div>';
      }
      $postContainer.append(list);
      $loadingContainer.hide(); // 当异步请求成功之后,将 loading 效果隐藏掉
      $postContainer.find("img").lazyload(); // 延迟加载
    }
    pageIndex++;
  });
}
$(function() {
  // 初始化时立即加载第一屏的内容
  loadData();
  // infinite-scroll.js 进行初始化配置
  $postContainer.infiniteScroll({
    path: function() {
      // 根据 pageIndex 自动添加 URL
      return baseUrl + pageIndex;
    },
    append: "#post-container", // 指定数据追加的位置
    history: false,
    button: ".view-more-button", // 自动加载更多的按钮
    loadOnScroll: false,
    status: ".pagination",
    scrollThreshold: 100, // 滚动到底部的距离
    debug: false, 
    prefill: true,
    responseCache: true,
  });
  // 定制下拉刷新
  $postContainer.on("request.infiniteScroll", function(event, path) {
    $loadingContainer.show(); // 加载时显示 loading 效果
  });
});

通过引入 infinite-scroll.js 文件并进行初始化,就可以轻易地实现将数据源以滚动底部的方式自动添加的功能了。此外,可以看到还为外层容器绑定了 request.infiniteScroll 事件,用于实现自定义的 loading 效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jQuery滚动加载图片实现原理 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 如何在jQuery中计算文档中的每个元素,包括头部主体

    在jQuery中,可以使用选择器来选择文档中的元素,并使用each()方法来对每个元素执行操作。以下是如何在jQuery中计算文档中的每个元素(包括头部和主体)的完整攻略: 步骤1:使用选择器选择文档中的所有元素 在jQuery中,可以使用通用选择器*来选择文档中的所有元素。以下是示例代码: var allElements = $("*"…

    jquery 2023年5月12日
    00
  • jQWidgets jqxDropDownList clear()方法

    jQWidgets jqxDropDownList clear()方法详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件和工具包。jqxDropDownList是Widgets组件现下组件。本文将详细介绍jqxDropDownList的clear()方法,包括作用、语法和示例。 clear()方法的基本语法 clear()方法的基…

    jquery 2023年5月10日
    00
  • jQuery选择器源码解读(三):tokenize方法

    让我来详细讲解一下“jQuery选择器源码解读(三):tokenize方法”的完整攻略。 什么是tokenize方法? 在jQuery中,选择器是通过parseTree方法来解析的。而在parseTree方法中,会先调用tokenize方法来将选择器字符串转化为一组tokens,然后再将这些tokens组合成语法树。因此,tokenize方法是解析选择器字符…

    jquery 2023年5月27日
    00
  • 基于jQuery插件jqzoom实现的图片放大镜效果示例

    下面是关于“基于jQuery插件jqzoom实现的图片放大镜效果示例”的完整攻略。 一、前置知识 jqzoom是基于jQuery插件实现的图片放大镜效果插件,因此在使用这个插件之前,我们需要确保已经具备以下知识: 基本的HTML、CSS和JavaScript编程能力 熟悉jQuery库的使用方法和语法规则 如果您还没有学习这些基础知识,建议您先学习相关课程和…

    jquery 2023年5月28日
    00
  • jquery实现进度条状态展示

    当我们需要展示某些任务完成的进度时,进度条便是非常实用的工具之一。使用jQuery实现进度条的状态展示在Web开发中也是很常见的操作,下面详细讲解一下对于这一需求的完整攻略。 第一步:引入jQuery和样式文件 首先,我们需要在HTML代码中引入jQuery和样式文件,可以使用CDN或者本地引入,如下所示。 <link rel="styles…

    jquery 2023年5月29日
    00
  • jQWidgets jqxDropDownList dropDownVerticalAlignment属性

    jQWidgets jqxDropDownList dropDownVerticalAlignment属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件和工具包。jqxDropDownList是Widgets组件的组件。本文将详细介绍jqxDropDownList的dropDownVerticalAlignment属性,包括用…

    jquery 2023年5月10日
    00
  • jQuery Mobile Pagecontainer beforeload事件

    jQuery Mobile是一款基于jQuery的移动端UI框架。在此框架中,页面间的切换非常流畅,同时提供了丰富的事件来给我们开发者使用。其中,Pagecontainer组件提供了一个名叫beforeload的事件,该事件会在页面即将被加载时被触发,开发者可以通过监听该事件来实现一些逻辑处理和跳转控制。 事件绑定 该事件绑定在Pagecontainer组件…

    jquery 2023年5月12日
    00
  • JS实现jQuery的append功能

    实现jQuery的append功能,可以通过原生JavaScript的DOM API实现。以下是具体步骤: 获取要操作的DOM节点 创建要添加的DOM节点 将要添加的DOM节点添加到目标节点的子节点中。 下面是一个示例,实现向一个ul列表中添加一条新的li元素的功能。 // 1. 获取目标节点 const list = document.querySelec…

    jquery 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部