JavaScript实现页面滚动图片加载(仿lazyload效果)

JavaScript实现页面滚动图片加载(仿lazyload效果)

概述

在网站中,经常会有长页式的页面,滚动页面时会不断加载图片,但是如果在页面的初次加载时一次性加载所有的图片,会给用户带来不必要的流量浪费,同时也会影响页面加载速度。因此,我们可以通过JavaScript实现页面滚动图片加载,去实现对用户体验的优化。

本攻略将介绍一种基于lazyload思路的实现方法,让图片在页面滚动时才进行加载,并且只加载当前可视区域内的图片,这样就可以避免因网页中大量的图片导致的性能问题。

实现方式

  1. 为图片设置占位符
  2. 获取浏览器窗口的高度,计算当前可视区域内的图片
  3. 监听window的scroll事件,滚动时计算出当前可视区域内的图片,等待图片完成加载
  4. 加载完成后将其插入页面,用占位符替换掉

示例说明

示例1:使用jQuery实现

HTML代码:

<div class="container">
  <div class="image">
    <img src="placeholder.png" data-src="image1.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image2.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image3.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image4.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image5.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image6.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image7.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image8.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image9.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image10.jpg" alt="">
  </div>
</div>

JavaScript代码:

$(function() {
  $(window).on('scroll', function() {
    $('.image').each(function(index) {
      if(!$(this).data('loaded') && inViewport(this)) {
        var $img = $(this).find('img');
        $img.attr('src', $img.data('src'))
            .on('load', function() {
              $(this).parent().removeClass('loading');
            });
        $(this).data('loaded', true);
        $(this).addClass('loading');
      }
    });
  });

  function inViewport(element) {
    var rect = element.getBoundingClientRect();
    return (
      rect.bottom >= 0 &&
      rect.right >= 0 &&
      rect.top <= (window.innerHeight || document.documentElement.clientHeight) &&
      rect.left <= (window.innerWidth || document.documentElement.clientWidth)
    );
  }
});

在这个示例中,我们为每个图片设置了一个占位符,使用data-src属性来存储真实图片的地址。当滚动到图片所在的可视区域内时,将占位符替换成真实的图片,并为其添加一个loading的class。

示例2:使用原生JavaScript实现

HTML代码:

<div class="container">
  <div class="image">
    <img src="placeholder.png" data-src="image1.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image2.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image3.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image4.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image5.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image6.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image7.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image8.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image9.jpg" alt="">
  </div>
  <div class="image">
    <img src="placeholder.png" data-src="image10.jpg" alt="">
  </div>
</div>

JavaScript代码:

window.addEventListener('scroll', function() {
  document.querySelectorAll('.image:not(.loading)').forEach(function(element) {
    if(inViewport(element)) {
      var img = element.querySelector('img');
      img.src = img.dataset.src;
      element.classList.add('loading');
      img.addEventListener('load', function() {
        element.classList.remove('loading');
      });
    }
  });
});

function inViewport(element) {
  var rect = element.getBoundingClientRect();
  return (
    rect.bottom >= 0 &&
    rect.right >= 0 &&
    rect.top <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.left <= (window.innerWidth || document.documentElement.clientWidth)
  );
}

在这个示例中,我们也为每个图片设置了一个占位符,使用data-src属性来存储真实图片的地址。当滚动到图片所在的可视区域内时,将占位符替换成真实的图片,并为其添加一个loading的class。

总结

通过本攻略的实现方式,我们可以方便地实现页面的滚动图片加载,不仅能够提升用户体验,同时也能够减少页面加载时间和流量消耗。以上就是基于lazyload思路的图片懒加载方案,相信对于想要实现此功能的读者能够有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现页面滚动图片加载(仿lazyload效果) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • HTML5 canvas实现雪花飘落特效

    关于“HTML5 canvas实现雪花飘落特效”的完整攻略,这里我提供以下步骤: 1. HTML结构 首先需要在网页中设置一个canvas标签,并设置它的宽度和高度,如下: <canvas id="canvas" width="800" height="600"></canvas&…

    JavaScript 2023年6月11日
    00
  • javascript里模拟sleep(两种实现方式)

    下面是“JavaScript里模拟sleep(两种实现方式)”的详细攻略: 什么是sleep 在其他编程语言中,sleep函数可以让程序暂停一段时间,以模拟等待某个操作的完成。但在JavaScript中并没有原生的sleep函数,因为JavaScript是单线程的,执行代码时不会阻塞线程。 但在实际开发中,有时需要让程序暂停一段时间,不让后续代码立刻执行。因…

    JavaScript 2023年6月11日
    00
  • JavaScript console的使用方法实例分析

    JavaScript console的使用方法实例分析 什么是JavaScript console? JavaScript console是浏览器提供的调试工具,可以用来输出JavaScript代码的执行结果、调试错误、监测性能等功能。 如何打开JavaScript console? 不同浏览器打开JavaScript console的方法不尽相同,以下是常…

    JavaScript 2023年5月28日
    00
  • 完美解决AJAX跨域问题

    下面是完美解决AJAX跨域问题的完整攻略。 背景介绍 在进行AJAX请求时,如果请求的URL地址跟当前页面的域不同,就会遇到跨域问题。因为浏览器会默认启用同源策略(Same Origin Policy),防止网站被其他域名下的脚本攻击。但是,有时候我们需要访问其他域名下的API,就需要解决跨域问题。 解决方案 1. JSONP JSONP是一种跨域请求数据的…

    JavaScript 2023年6月11日
    00
  • 使用Python解析JSON的实现示例

    下面我将为您详细讲解“使用Python解析JSON的实现示例”的完整攻略。 一、JSON简介 JSON全称为JavaScript Object Notation,它是一种轻量级的数据交换格式。在现代的Web应用开发中,JSON作为一种简单、易于理解的数据格式而备受推崇,常常使用在前后端数据交互、API接口等场景中。 一个JSON对象由一些键值对组成,键值对之…

    JavaScript 2023年6月11日
    00
  • JavaScript实现字符雨效果

    JavaScript实现字符雨效果 在网页上实现字符雨效果,可以通过在HTML的body元素中添加一个全屏的canvas元素,然后使用JavaScript编写一个动画效果,不断更新canvas中的字符颜色和位置,从而实现字符雨效果。 准备工作 在HTML中添加一个全屏的canvas元素 <canvas id="matrix-canvas&qu…

    JavaScript 2023年5月28日
    00
  • js报$ is not a function 的问题的解决方法

    问题描述: 当你在使用 jQuery 时,可能会遇到类似于” $ is not a function ” 的报错信息,这意味着代码尝试调用一个名为 $ 的函数,但是这个函数并未定义或者没有被正确加载。 解决方法: 引入 jQuery 库 请确保你已经在 HTML 文件中引入了 jQuery 库,可以通过以下方式引入: <script src=&quot…

    JavaScript 2023年5月18日
    00
  • JS实现秒杀倒计时特效

    让我来为你详细讲解一下JS实现秒杀倒计时特效的完整攻略。 1. 前置知识 在实现秒杀倒计时特效之前,需要先了解以下几个知识点: JavaScript基础知识 HTML和CSS基本操作 DOM操作(document对象、节点的增删改查操作等) 时间日期对象(Date对象等) 2. 实现过程 2.1 创建HTML结构 首先,在HTML中创建一个div,并定义一个…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部