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

yizhihongxing

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日

相关文章

  • 用户名、密码等15个常用的js正则表达式

    下面我就为大家详细讲解一下”用户名、密码等15个常用的js正则表达式”的攻略。 1. 用户名的正则表达式 用户名通常由大小写字母、数字、下划线和连字符组成,长度一般为4-16个字符。可以用如下正则表达式进行匹配: var reg = /^[a-zA-Z0-9_-]{4,16}$/; 其中,^表示字符串的开头,$表示字符串的结尾。[a-zA-Z0-9_-]表示…

    JavaScript 2023年6月10日
    00
  • JavaScript统计网站访问次数的实现代码

    下面是详细讲解: JavaScript统计网站访问次数的实现代码 在网站开发中,常常需要统计网站的访问次数。本文将介绍一种通过JavaScript实现统计网站访问次数的方法。 方法一:使用localStorage 在本地存储中使用localStorage可以轻松地实现统计网站访问次数。代码如下: if (localStorage.pageviews) { l…

    JavaScript 2023年6月11日
    00
  • 深入剖析Java中的各种异常处理方式

    深入剖析Java中的各种异常处理方式 在Java中,异常处理是一项非常重要的任务。Java内置了许多不同的异常类型,以及许多不同的异常处理方式。在本文中,我们将深入剖析Java中的各种异常处理方式,向你展示如何优雅地处理程序可能出现的异常情况。 异常的产生原因 在Java中,异常是代码运行时可能遇到的问题或错误的一种表示。通常情况下,异常会导致程序终止或崩溃…

    JavaScript 2023年5月28日
    00
  • JS前向后瞻正则表达式定义与用法示例

    下面是JS前向后瞻正则表达式定义与用法示例的完整攻略: 定义 正则表达式是指一些用来匹配和处理文本的模式,前向后瞻正则表达式(Lookahead)是其中的一种类型。它是一种零宽度断言模式,它用于匹配紧接着某个子表达式(即“前提条件”)的位置,而不匹配该子表达式本身。 前向后瞻正则表达式由(?=或(?<=开头,后面跟着一个子表达式和一个右圆括号),这个子…

    JavaScript 2023年5月28日
    00
  • JS document文档的简单操作完整示例

    JS document 文档是操作网页元素的核心接口。它可以通过 js 代码来获取、修改和新增 HTML 元素,以实现网页动态变化。接下来将通过两个示例介绍基本的 JS document 操作。 示例1:获取元素 在 HTML 文档中,标签是最基本的元素,通过 JS document 可以获取 HTML 中指定标签的元素。获取标签元素需要使用 getElem…

    JavaScript 2023年6月10日
    00
  • 关于二级域名下使用一级域名下的COOKIE的问题

    关于二级域名下使用一级域名下的COOKIE的问题,涉及到跨域问题和COOKIE同源策略问题,需要进行一定的设置来保证正常的COOKIE使用。 解决方案 一种通用的解决方案是通过在一级域名下设置COOKIE的domain为一级域名的方式来解决跨域问题。具体步骤如下: 在一级域名下设置COOKIE时,需要设置domain为一级域名: document.cooki…

    JavaScript 2023年6月11日
    00
  • JavaScript动态数量的文件上传控件

    下面我将详细讲解JavaScript动态数量的文件上传控件的完整攻略。 什么是JavaScript动态数量的文件上传控件? JavaScript动态数量的文件上传控件是一个可以动态添加多个文件上传组件的控件。与传统的文件上传控件不同之处在于它支持增加上传文件的数量,而且使用JavaScript实现,不需要在服务器端进行特别的配置和编写。 如何实现JavaSc…

    JavaScript 2023年5月27日
    00
  • Javascript中获取出错代码所在文件及行数的代码

    在Javascript代码中,有时候我们需要知道出错的代码所在的文件和行数。这个问题可以通过在代码中添加一些特定的指令来实现。下面是实现此功能的完整攻略: 步骤1: 这个功能需要运行在浏览器环境下。打开浏览器的控制台,找到“Console”面板,在里面输入以下代码: console.log(‘出错了’); throw new Error(‘错误信息’); 这…

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