一文搞懂JavaScript如何实现图片懒加载

一文搞懂JavaScript如何实现图片懒加载

在一个网站中,有大量的图片需要加载。而有些图片是用户可能看不到或者需要滚动到特定位置才能看到的,这时候我们就可以使用图片懒加载的技术,只在需要加载图片的时候进行加载,提高了网站页面的性能。

什么是图片懒加载

图片懒加载是一种技术,就是在用户滑动页面的时候,再去加载需要显示的图片,而不是在用户打开页面的时候全部加载。

实现原理

实现图片懒加载主要基于以下两个原理:

  1. 首先图片需要有一张默认的属性src;
  2. 当图片进入可视区域时,需要将默认的src属性替换成真正的图片地址。

基于这两个原理,我们可以写出如下的图片懒加载代码:

function lazyLoad() {
    const images = document.querySelectorAll('img[data-src]');
    images.forEach((img) => {
        const visibility = img.getBoundingClientRect().top <= window.innerHeight;
        if (visibility) {
            img.setAttribute('src', img.getAttribute('data-src'));
            img.onload = () => {
                img.removeAttribute('data-src');
            }
        }
    });
}
window.addEventListener('scroll', lazyLoad);

上述代码通过getBoundingClientRect()方法,获取每一个需要懒加载的图片相对于视口的位置信息,当图片的位置信息进入可视区域之后,就会将图片的默认data-src属性替换成真实的图片地址,为了确保图片加载完全,还绑定了onload事件,当图片加载完成之后,移除data-src属性。

图片懒加载的优势

  1. 提高了网页性能,减轻了服务器压力;
  2. 加快页面加载速度,提高用户体验;
  3. 减少了不必要的流量消耗。

示例1

<div id="container">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
    <img src="default.jpg" data-src="real.jpg">
</div>
<script>
    function lazyLoad() {
        const images = document.querySelectorAll('img[data-src]');
        images.forEach((img) => {
            const visibility = img.getBoundingClientRect().top <= window.innerHeight;
            if (visibility) {
                img.setAttribute('src', img.getAttribute('data-src'));
                img.onload = () => {
                    img.removeAttribute('data-src');
                }
            }
        });
    }
    window.addEventListener('scroll', lazyLoad);
</script>

以上代码实现了最基础的图片懒加载功能,在图片进入可视区域时才会进行加载,提高了页面性能。

示例2

<div id="container">
    <img src="default.jpg" data-src="real1.jpg">
    <img src="default.jpg" data-src="real2.jpg">
    <img src="default.jpg" data-src="real3.jpg">
    <img src="default.jpg" data-src="real4.jpg">
    <img src="default.jpg" data-src="real5.jpg">
    <img src="default.jpg" data-src="real6.jpg">
    <img src="default.jpg" data-src="real7.jpg">
    <img src="default.jpg" data-src="real8.jpg">
    <img src="default.jpg" data-src="real9.jpg">
</div>
<script>
    function lazyLoad() {
        const images = document.querySelectorAll('img[data-src]');
        images.forEach((img) => {
            const visibility = img.getBoundingClientRect().top <= window.innerHeight;
            if (visibility) {
                img.setAttribute('src', img.getAttribute('data-src'));
                img.onload = () => {
                    img.removeAttribute('data-src');
                }
            }
        });
    }
    window.addEventListener('scroll', lazyLoad, { passive: true });
</script>

在这个示例中,我们给addEventListener函数加了一个{ passive: true }的选项。这个选项表示这个事件处理函数不会调用preventDefault方法,这样可以避免一些不必要的性能问题。

总结

通过上面的示例,我们熟悉了图片懒加载的原理以及实现方法,如果我们在页面中存在大量的图片,使用图片懒加载可以更好的提升页面性能,也可以优化用户体验,提高页面的可用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文搞懂JavaScript如何实现图片懒加载 - Python技术站

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

相关文章

  • 10分钟理解CSS3 Grid布局

    10分钟理解CSS3 Grid布局 CSS3 Grid布局是一种新的网页布局方式,它能够让你更轻松地创建复杂的多列和多行布局。本文将带你了解CSS3 Grid布局的基础知识,并通过两个示例帮助你更好地理解。 基础概念 下面是一些CSS3 Grid布局的基础概念: 网格容器 (grid container):包含网格项目的父元素。 网格项目 (grid ite…

    css 2023年6月10日
    00
  • Vue中对比scoped css和css module的区别

    请看下面的攻略: Vue中对比scoped css和css module的区别 scoped css Vue的scoped css是一种将css限制在组件内部使用的方法。在Vue组件中,可以给style标签添加scoped属性,它会自动将该样式限制在组件内部使用。 <template> <div class="container&…

    css 2023年6月9日
    00
  • 使用HTML5 Canvas绘制直线或折线等线条的方法讲解

    让我来详细地讲解一下如何使用HTML5 Canvas绘制直线或折线等线条。 首先,我们需要明确Canvas是HTML5提供的一个绘图API,可以用来绘制各种图形。其中绘制直线或折线的方法主要包括以下步骤: 获取canvas对象:我们可以使用HTML的标签创建一个canvas对象,也可以使用JavaScript的document.getElementById(…

    css 2023年6月9日
    00
  • html5配合css3实现带提示文字的输入框(摆脱js)

    下面详细讲解“html5配合css3实现带提示文字的输入框(摆脱js)”的完整攻略。 1.概述 在前端开发中,常出现需要在输入框中提供提示文字的情形,原本的做法是通过 JavaScript 实现。现在,通过 HTML5 和 CSS3,我们也可以轻松地实现这个效果,不用依赖 JavaScript。 2.技术原理 实现带提示文字的输入框,需要使用以下 HTML5…

    css 2023年6月10日
    00
  • css中filter属性和backdrop-filter的应用与区别详解

    CSS中filter属性和backdrop-filter的应用与区别详解 介绍 CSS中的filter属性和backdrop-filter属性可以用来修改元素的视觉效果。filter属性可以用于元素本身,而backdrop-filter属性用于元素背景。本文将详细介绍它们的使用方法。 filter属性 filter属性是CSS3中的一个属性,它能让你对元素的…

    css 2023年6月10日
    00
  • CSS中的一些百分比相关调试经验分享

    下面是关于“CSS中的一些百分比相关调试经验分享”的完整攻略,希望能对你有所帮助。 1. 百分比相关单位 在CSS中,常用的百分比单位有以下几种: %:表示以父元素的宽度为基准进行计算; vh:表示视口高度的百分比,可用于垂直方向的布局; vw:表示视口宽度的百分比,可用于水平方向的布局; vmin:表示视口宽度和高度中较小的那个的百分比; vmax:表示视…

    css 2023年6月10日
    00
  • css3动画效果抖动解决方法

    下面是“css3动画效果抖动解决方法”的完整攻略: 问题描述 在网页设计中,常常使用CSS3动画效果来增强页面的交互性和可视化效果。但是在某些情况下,CSS3动画可能会出现抖动现象,影响页面的美观度和用户体验。那么,如何解决CSS3动画抖动问题呢? 解决方法 使用GPU加速 使用GPU加速可以提高浏览器性能和流畅度,并且可以有效地减少CSS3动画的抖动现象。…

    css 2023年6月10日
    00
  • Varlet组件实现一个丝滑的点击水波效果详解

    下面我将详细讲解如何通过Varlet组件实现一个丝滑的点击水波效果,并提供两个示例说明。 简介 Varlet是一套基于Vue3的移动端UI组件库,其设计初衷是为了提供更好的用户体验和提高前端开发效率。其中,点击水波效果是其组件非常常见且受欢迎的效果之一。 实现方法 Varlet提供了一个名为ripple的指令来实现点击水波效果。使用该指令,我们可以在任何元素…

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