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日

相关文章

  • JQueryEasyUI框架下的combobox的取值和绑定的方法

    JQuery EasyUI是一个基于jQuery的UI插件集合,提供了丰富的ui组件,其中包含了Combobox组件。Combobox可以用于数据选择,下拉框选择等场景。在JQueryEasyUI框架下,Combobox的取值和绑定方法如下所示: Combobox的绑定 使用以下代码可以将Combobox和一个本地数组进行绑定: <input clas…

    jquery 2023年5月18日
    00
  • BootStrap下拉菜单和滚动监听插件实现代码

    下面来详细讲解一下“Bootstrap下拉菜单和滚动监听插件实现代码”的完整攻略。 BootStrap下拉菜单实现代码 HTML部分 首先,在需要添加下拉菜单的HTML代码中,我们需要添加一个包裹dropdown组件的父元素div,并且为其添加相应的类名,具体代码如下: <div class="dropdown"> <b…

    jquery 2023年5月27日
    00
  • 快速学习jQuery插件 Form表单插件使用方法

    快速学习jQuery插件 Form表单插件使用方法 什么是jQuery插件Form表单插件 Form表单插件是一款基于jQuery框架封装的表单模块,它可以帮助我们快速便捷地开发各种表单验证和提交功能,包括但不限于表单验证规则、异步提交等功能。 Form表单插件的安装 安装jQuery插件Form表单插件的方法很简单,你可以通过官方网站 https://jq…

    jquery 2023年5月28日
    00
  • 如何检查事件命名空间是否在jQuery中被使用

    当在jQuery中使用事件命名空间时,有时需要检查该命名空间是否已经被使用。以下是如何检查事件命名空间是否在jQuery中被使用的详细攻略: 使用$._data()方法 要检事件命名空间是否在jQuery中被使用,可以使用$._data()方法。该方法可以获取元素上绑定的所有事件及其相关数据。以下是一个示例: // 绑定一个事件处理程序到文档素上 $(doc…

    jquery 2023年5月9日
    00
  • jQWidgets jqxTreeGrid pageSizeMode属性

    以下是关于 jQWidgets jqxTreeGrid 组件中 pageSizeMode 属性的详细攻略。 jQWidgets jqxTreeGrid pageSizeMode 属性 jQWidgets jqxTreeGrid 的 pageSizeMode 属性用于设置 TreeGrid 控件分页器的行数模式。可以使用此属性来控制分页器的行数模式。 语法 $…

    jquery 2023年5月12日
    00
  • jQWidgets jqxGrid groupable属性

    以下是关于“jQWidgets jqxGrid groupable属性”的完整攻略,包含两个示例说明: 属性简介 jqxGrid件的 groupable 属性用于指定是否允许对 jqxGrid 控件进行分组。该属性的默认值为 false,表示允许分组。当该属性设置为 true 时,jqxGrid 控件将允许对数据进行分组。属性的语法如: $("#j…

    jquery 2023年5月10日
    00
  • JQuery调用绑定click事件的3种写法

    JQuery是一种非常常用的JavaScript框架,它可以快速简便地开发JS功能,提高开发效率。其中,绑定click事件是JQuery使用最广泛的功能之一。JQuery调用绑定click事件的3种写法包括:直接写法、.on写法和.click写法。接下来就详细讲解这3种写法的具体实现方式及其优缺点。 直接写法 直接写法就是直接在选择器后面跟上click事件的…

    jquery 2023年5月28日
    00
  • 用jQuery中的ajax分页实现代码

    下面是关于使用 jQuery 中的 ajax 分页实现的完整攻略。 主要思路 jQuery 中的 ajax 分页实现其实是通过 ajax 请求获取分页数据,然后将获取到的数据动态插入到页面当中,从而达到了分页的效果。 在实现过程中,我们首先要进行的是对分页数据进行获取。获取到数据以后,我们需要进行一些处理,比如拼接数据、渲染数据等,并将其实现在前端页面上。 …

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