JavaScript懒加载与预加载原理与实现详解

目录
  • 1、懒加载
    • 1.1、什么是懒加载
    • 1.2、为什么要使用懒加载
    • 1.3、懒加载的优点
    • 1.4、懒加载的原理
    • 1.5、懒加载的实现步骤
    • 1.6、懒加载的实现方式
  • 2、预加载
    • 2.1、什么是预加载
    • 2.2、为什么要使用预加载
    • 2.3、实现预加载的方法

1、懒加载

1.1、什么是懒加载

懒加载也可以叫做延迟加载,当访问一个页面的时候,先把img元素伙食其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样只需要请求一次,俗称占位图);

只有当图片出现在浏览器的可视区域内时,才这只图片真正的路径,让图片显示出来,这就是图片懒加载。

1.2、为什么要使用懒加载

当页面很多,内容很丰富的时候,页面很长,图片较多,比如各个商城页面,要是页面载入就一次性加载完毕,就需要等很长的时间

1.3、懒加载的优点

按需加载,页面加载速度快,节约流量,用户体验感好,减少服务器压力

1.4、懒加载的原理

页面中的img元素,如果没有src属性, 浏览器就不会发出请求去下载图片,只有通过javascript设置了图片路径,浏览器才会发送请求。

懒加载的原理就是先在页面中把所有的图片统一使用一张占位图进行占位,把真正的路径存在元素的"data-url"(这个名字起个自己认识好记的就行)属性里,要用的时候就取出来放在src里面

1.5、懒加载的实现步骤

  1. 首先,不要将图片地址放到src属性中,而是放到其它属性(data-origina)中。
  2. 页面加载完成后,判断图片是否在用户的视野内,如果在,则将data-original属性中的值取出存放到src属性中

1.6、懒加载的实现方式

<ul>
    <li><img src="../img/loading.gif" alt="" data-src="../img/1.jpg"></li>
    <li><img src="../img/loading.gif" alt="" data-src="../img/2.jpg"></li>
    <li><img src="../img/loading.gif" alt="" data-src="../img/3.jpg"></li>
    <li><img src="../img/loading.gif" alt="" data-src="../img/4.jpg"></li>
    <li><img src="../img/loading.gif" alt="" data-src="../img/5.jpg"></li>
    <li><img src="../img/loading.gif" alt="" data-src="../img/6.jpg"></li>
    <li><img src="../img/loading.gif" alt="" data-src="../img/7.jpg"></li>
    <li><img src="../img/loading.gif" alt="" data-src="../img/8.jpg"></li>
</ul>

方式1:通过 元素距离顶部的高度 - 滚动条滚动的高度 < =窗口可视化区域高度 进行判断;

    /*元素距离顶部的高度-页面被卷去的高度<=浏览器可视区域的高度
    如果条件满足,就可以替换图片的src属性
    */
   //获取图片
    const imgArr = document.querySelectorAll("img");
    //初始化执行
    lazyLoad();
    //监听用户是否滚动滚动条,但是这高触发事件,所以需要结合节流优化
    window.addEventListener("scroll", throttle(lazyLoad, 2000));
    function lazyLoad() {
        imgArr.forEach(item => {
            //1、获取图片距离顶部的高度
            const imgOffsetTop = item.offsetTop;
            //2、获取浏览器的可视区域的高度
            const wHeight = window.innerHeight;
            //3、获取页面被卷去的高度
            const scrollHeight = document.documentElement.scrollTop;
            //判断图片是否将要出现
            if (imgOffsetTop - scrollHeight <= wHeight) {
                item.src = item.getAttribute("data-src");
            }
        })
    }
    //节流
    function throttle(fun, time = 250) {
        let lastTime = 0;//最后一次执行的时间
        return function (...args) {
            const now = new Date().getTime();//获取当前的时间
            if (now - lastTime >= time) {
                fun();
                lastTime = now;
            }
        }
    }

方式2:getBoundingClientRect()

  • 获取元素位置, 这个方法没有参数
  • 用于获得页面中某个元素的左,上, 右和下分别相对浏览器视窗的位置。
  • 是DOM元素到浏览器可视范围的距离(不包含文档卷起的部分)
  • 该函数返回一个0bject对象, 该对象有6个属性: top, lef, right, bottom , width, height;

    const imgArr = document.querySelectorAll("img");
    //初始化执行
    lazyLoad()
    //监听用户是否滚动滚动条,但是这高触发事件,所以需要结合节流优化
   //监听用户是否滚动滚动条,但是这高触发事件,所以需要结合节流优化
    window.addEventListener("scroll", throttle(lazyLoad, 2000));
    function lazyLoad() {
        imgArr.forEach(item => {
            //获取图片和顶部的高度
            const imgTop = item.getBoundingClientRect().top;
            //获取浏览器可视化区域高度
            const wHeight = window.innerHeight;
            //图片和顶部的高度小于浏览器窗口可视化区域的高度
            if (imgTop <= wHeight) {
                //getAttribute获取自定义属性
                // item.src = item.getAttribute("data-src");
                //也可以使用dataset来获取自定义属性的值
                item.src = item.dataset.src;
            }
        })
    }
    //节流
    function throttle(fun, time = 250) {
        let lastTime = 0;//最后一次执行的时间
        return function (...args) {
            const now = new Date().getTime();//获取当前的时间
            if (now - lastTime >= time) {
                fun();
                lastTime = now;
            }
        }
    }

方式3:IntersectionObserver(callback)构造函数

callback回调触发两次,看见了触发,看不见也触发。

实例有两个方法:

  • observe给元素添加观察
  • unobserve取消对元素观察

    const callback = (res) => {
        //res是一个数组,所以还需要遍历
        console.log(res);
        res.forEach(item => {
            //isIntersecting是否在可视区域展示
            if (item.isIntersecting) {
                //获取图片的自定义属性并赋值给src
                item.target.src = item.target.dataset.src;
                //替换为真是src地址后取消对它的观察
                observe.unobserve(item.target);
            }
        })
    }
    //1、实例化构造函数
    const observe = new IntersectionObserver(callback);
    const imgArr = document.querySelectorAll("img");
    //遍历所有的图片,给每个图片添加观察
    imgArr.forEach(item => {
        //观察图片
        observe.observe(item)
    })

2、预加载

2.1、什么是预加载

资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到。预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。

2.2、为什么要使用预加载

在网页全部加载之前,对一些主要内容进行加载,以提供给用户更好的体验,减少等待的时间。否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,直到所有内容加载完毕。

2.3、实现预加载的方法

<div>
    <p></p>
    <img src="../img/1.jpg" alt="">
</div>
<script type="text/javascript">
    const imgArr = ["../img/2.jpg", "../img/3.jpg", "../img/4.jpg", "../img/5.jpg", "../img/6.jpg", "../img/7.jpg"]
    const img = document.querySelector("img");
    const p = document.querySelector("p");
    //定义默认的index的值
    let index = 0;
    p.innerHTML = `实现预加载的效果,我是第${index + 1}张图片`;
    img.addEventListener("click", (e) => {
        if (index < imgArr.length) {
            img.src = imgArr[index];
            index++;
            p.innerHTML = `实现预加载的效果,我是第${index + 1}张图片`;
            if (index < imgArr.length) {
                //切换图片后,同时让浏览器提前加载下一张图片
                preLoad(imgArr[index])
            }
        } else {
            confirm("没有图片了")
        }
    }, false)
    //调用预加载函数,页面一开始就加载数组的第一个元素
    preLoad(imgArr[0])
    //定义预加载函数
    function preLoad(src) {
        //当图片失去焦点后
        img.addEventListener("load", () => {
            //创建一个新的img标签
            const imgNew = document.createElement("img");
            //给img标签添加src属性为我们传进来的src
            imgNew.src = src;
        })
    }
</script>

到此这篇关于JavaScript懒加载与预加载原理与实现详解的文章就介绍到这了,更多相关JS懒加载与预加载内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解析javascript图片懒加载与预加载的分析总结

    本篇文章主要介绍了懒加载和预加载两种技术的解析,废话不多说,一起来看吧. 懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载.懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力. 懒加载的意义及实现方式有: 意义: 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 实现方式:

  • vue前端性能优化之预加载和懒加载示例详解

    目录 预加载 图片预加载 JS预加载 js的加载方式 preload prefetch Preload & Prefetch 的区别 不同资源加载的优先级规则 懒加载 图片懒加载 路由懒加载 组件懒加载 最后 预加载 预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源:我们使用该技术预先告知浏览器,等下某些资源可能要被使用,先把资源下载下来,不要等使用的时候再下载,可以看出这样的加载技术会增加服务器的压力,但是用户的体验会比较好,因为可以较快的看到后面的

  • javascript实现图片预加载和懒加载

    本文实例为大家分享了javascript实现图片预加载和懒加载的具体代码,供大家参考,具体内容如下 预加载 预加载是预先加载好后面需要用到的资源, 后面使用的时候直接去缓存里取.举个栗子, 比如一个网站的开场动画, 这些动画是由很多图片组成的, 假如不预先加载好, 那就会造成动画不流畅产生闪动白屏.图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,保证了图片快速.无缝地发布,使用户在浏览你网站内容时获得更好的用户体验. //这里我把图片数量写死了,而且对图片名也有要求必须是阿拉伯数字后缀

  • webpack的懒加载和预加载详解

    目录 正常加载 懒加载 预加载 没有使用预加载 使用预加载 总结 正常加载 为了看的方便,index.js中的代码非常简单 console.log('index.js执行了') import { test } from './test.js' document.getElementById('btn-wrap').onclick = function () { test() } test.js console.log('test.js执行了') export function test() {

  • SpringBoot预加载与懒加载实现方法超详细讲解

    目录 预加载 getMergedLocalBeanDefinition 循环创建bean 懒加载 @Lazy 全局懒加载 为什么需要全局懒加载 全局懒加载的好处与问题 预加载 bean在springBoot启动过程中就完成创建加载 在AbstractApplicationContext的refresh方法中 // Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons()

  • JavaScript懒加载与预加载原理与实现详解

    目录 1.懒加载 1.1.什么是懒加载 1.2.为什么要使用懒加载 1.3.懒加载的优点 1.4.懒加载的原理 1.5.懒加载的实现步骤 1.6.懒加载的实现方式 2.预加载 2.1.什么是预加载 2.2.为什么要使用预加载 2.3.实现预加载的方法 1.懒加载 1.1.什么是懒加载 懒加载也可以叫做延迟加载,当访问一个页面的时候,先把img元素伙食其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样只需要请求一次,俗称占位图): 只有当图片出现在浏览器的可视区域内时,才这只图片真正

  • 利用CSS、JavaScript及Ajax实现图片预加载的三大方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS.JavaScript及两者的各种组合.这些技术可根据不同设计场景设计出相应的解决方案,十分高效.

  • 利用CSS、JavaScript及Ajax实现图片预加载的方法

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 实现图片预加载可以使用css.JavaScript.Ajax三种方法.下面分别介绍这些方法的实现. 使用CSS 单纯的使用css可以将图片加载到页面元素的背景上,这种方法简单.高效: #d

  • JavaScript 文件加载与阻塞问题之性能优化案例详解

    上来先给一个问题:在书写html页面时,当你要从外部引入js文件时,script标签会放置在哪个位置呢,放置位置不同对页面加载有影响吗? 默认情况下,浏览器是同步加载 JavaScript 脚本:即渲染引擎遇到 script 标签就会停下来,等到执行完脚本,再继续向下渲染.如果是外部脚本,还必须加入脚本下载的时间. 如果脚本体积很大,下载和执行的时间就会很长,因此造成浏览器堵塞,用户会感觉到浏览器"卡死",出现短暂的空白,没有任何响应.这会造成很不好的用户体验,解决这个问题有两种方案:

  • Spring加载properties文件的两种方式实例详解

    在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修改源代码,这样更加方便.在Spring中也可以这么做,而且Spring有两种加载properties文件的方式:基于xml方式和基于注解方式.下面分别讨论下这两种方式. 1. 通过xml方式加载properties文件 我们以Spring实例化dataSource为例,我们一般会在beans

  • C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

    在加载DLL时,出现了如下的异常:未能加载文件或程序集"DMC3000, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"或它的某一个依赖项. 试图加载格式不正确的程序. 经上网查询后,其原因是x64和x86不兼容的问题.即DLL是x64的,但是VS默认生成的目标平台是x86的,因此,两者的不一致导致异常的出现. 其解决办法如下: 项目->属性->生成->目标平台->x64(与dll平台一致) 以上这篇

  • Linux 中(加、减、乘、除)实例详解

     Linux 中(加.减.乘.除)实例详解 实现代码: #!/bin/bash num1=10 num2=2 #两个数相加 add=$[$num1+$num2] echo $num1 + $num2 '=' $add #两个数相减 sub=$[$num1-$num2] echo $num1 - $num2 '=' $sub #两个数相乘 mut=$[$num1*$num2] echo $num1 '*' $num2 '=' $mut #两个数相除 div=$[$num1/$num2] echo

  • JavaScript注入漏洞的原理及防范(详解)

    初次接触: 初次接触JavaScript注入漏洞后,如果不对这种漏洞的作用机理仔细分析并提取出其发生的某种模式,你就不能做到快速的发现项目中可能存在的所有注入风险并在代码中防范. 发生模式: JavaScript注入漏洞能发生作用主要依赖两个关键的动作,一个是用户要能从界面中注入JavaScript到系统的内存或者后台存储系统中:二是系统中存在一些UI会展示用户注入的数据. 比如注入漏洞最常见的就是发生在各种类型的名字中,比如系统中的人名等等,因为名字往往会在各种系统上显示,如果在某个用户输入名

随机推荐