懒加载和预加载

参考链接:

懒加载和预加载

懒加载的原理及实现

处理图片预加载时设置img的src属性和img的onload事件的位置前后顺序关系

关于图片的预加载,你所不知道的

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

一、懒加载

  1. 介绍

    • 懒加载也就是延迟加载。
    • 当访问一个页面的时候,先把所有img标签的src设为同一张空白图片的路径(占位图,只需请求一次),将其真正的图片地址存储在img标签的自定义属性中(比如data-src)
    • 两种加载情况:
      • 条件加载:符合某些条件,或触发了某些事件,才将自定义属性中的地址存储到src属性中,开始异步加载
      • 可视区加载:仅加载用户可以看到的区域。当js监听到该图片元素进入可视窗口时,将自定义属性中的地址存储到src属性中,开始异步加载。
                        var lazyLoad = (function(){
                            var clock;
        
                            function init(){
                                //监听浏览器滚动事件,持续滚动后停留200ms才会触发checkShow()
                                $(window).on("scroll", function(){
                                    if (clock) {
                                        clearTimeout(clock);
                                    }
                                    clock = setTimeout(function(){
                                        checkShow();
                                    }, 200);
                                })
                                checkShow();
                            }
        
                            function checkShow(){
                                $(".lazyload img").each(function(){
                                    var $cur =$(this);
                                    //若某图片已经显示,则return
                                    if($cur.attr(‘isLoaded‘)){
                                        return;
                                    }
                                    //若某图片应该显示却还未显示,则将其显示出来
                                    if(shouldShow($cur)){
                                        showImg($cur);
                                    }
                                })
                            }
                            //判断图片是否应该显示
                            function shouldShow($node){
                                var scrollH = $(window).scrollTop(), //窗口的垂直滚动条位置
                                    winH = $(window).height(), //窗口高度
                                    top = $node.offset().top;  //图片相对于整个文档的偏移top坐标
                                if(top < winH + scrollH){
                                    return true;
                                }else{
                                    return false;
                                }
                            }
                            //将图片显示出来
                            function showImg($node){
                                $node.attr(‘src‘, $node.attr(‘data-src‘));
                                $node.attr(‘isLoaded‘, true);
                            }
                            return {
                                init: init
                            }
                        })()
                        lazyLoad.init();

  2. 目的
    • 很多页面,内容很丰富,页面很长,图片较多,而且比较大。
    • 懒加载能防止页面一次性向服务器响应大量请求导致服务器响应慢,页面卡顿或崩溃等问题。
    • 减少请求数或延迟请求数,使页面加载速度快,用户体验好

二、预加载

  1. 介绍

    • 提前加载图片,当用户需要查看时可直接从本地缓存中渲染
  2. 目的
    • 图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。
    • 这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验。
  3. 实现
    • 方法一 ×

                  function loadImage(url, callback) {
                      var img = new Image(); //创建一个Image对象,实现图片的预下载
                      img.onload = function () { //图片下载完毕时调用callback函数。
                         callback(img);
                       };
                      img.src = url;
      };
      • 注意:要将img.src放在img.onload后面

        • 否则,若将img.src放在img.onload前面

          • 若没有缓存:没问题

            • 给img.src赋值后开始异步加载图片,加载过程的时间很长,当加载完图片时,onload的赋值语句已经执行,所以加载完图片发生onload事件时就会调用callback函数。
          • 若有缓存,有问题
            • 给img.src赋值后开始异步加载图片,加载过程的时间很短,当加载完图片时,还没有执行到onload的赋值语句,所以加载完图片发生onload事件时不会调用callback函数。
      • 问题:
        • 内存泄漏:img.onload引用的匿名函数形成了闭包,闭包的作用域链中保存着img,创建了循环引用
        • 只考虑了静态图片的加载,忽略了gif等动态图片,可能会多次触发onload
    • 方法二 √:解决方法一的问题
                  function loadImage(url, callback) {
                      var img = new Image(); //创建一个Image对象,实现图片的预下载
                      img.onload = function () { //图片下载完毕时将img.onload设为null,并异步调用callback函数。
                          img.onload = null;
                          callback(img);
                      };
                      img.src = url;
      };
时间: 2024-10-09 05:33:49

懒加载和预加载的相关文章

Javascript图片的懒加载与预加载

1. 缓载.预载的概念 这些技术不仅限于图片加载,但我们首先讨论最常用的图片加载. 缓载:延迟加载图片或符合某些条件时才加载某些图片. 预载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载.缓载对服务器前端有一定的缓解压力作用,预载则会增加服务器前端压力. 2. 缓载的意义与实现 缓载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 主要体现在三种模式上: 第一种是纯粹的延迟加载,使用setTimeOut

懒加载和预加载---性能优化

懒加载 认识 懒加载是一种按需延迟资源的方式.在加载显示页面时,并不一次性加载所有该页面所需要的图像,对于在可视区域之外的图像,可以等到用户scroll到该区域的时候,再进行加载 实现方式 1.目前已经有很多库实现了懒加载,例如lazysizes,可以考虑使用 2.使用库这样的操作,相当于增加一个需要请求的js文件,增加一次http请求.所以如果能够实现原生的懒加载,能够更好的优化性能: 原生js实现图片懒加载 原理: 页面上图片的src属性设置为空字符串:(也可以设置为一个占位位图) 将真实路

基于jQuery的图片异步加载和预加载实例

如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时,其他图片才会加载,改插件很好地实现了图片异步加载功能. 在线预览   源码下载 html代码部分: <div id="content"> <div id="button"> <ul> <li>小图</li>

【转】前端懒加载以及预加载

懒加载(延迟加载):延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载.懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力. 1.懒加载: 意义: 懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数. 实现方式: 1.第一种是纯粹的延迟加载,使用setTimeOut或setInterval进行加载延迟. 2.第二种是条件加载,符合某些条

懒加载与预加载

前端性能优化中图片资源的优化. 1.懒加载(延迟加载) 1.图片进入可视区域之后请求图片资源: 2.对于电商等图片较多,页面很长的业务场景很适用: 3.可以减少无效资源的加载: 4.并发加载的资源过多会阻塞js的加载,影响网站的正常使用: 懒加载的要点就是img标签src属性为空(占位图),给一个data属性,里面存放图片真实地址,在需要的时候,js动态的将这个地址赋予图片src属性. 如下所示: <img src="" class="image-item"

图片懒加载和预加载

懒加载实际上就是通过计算图片的到可视区窗口的距离,如果图片的顶部到可视区窗口的底部的距离小于等于0的话,就生成一个image并设置image.src的属性值,放置到相应的图片位置 从而实现懒加载,即动态的创建image和添加image元素到页面. 预加载:要实现已进入页面就将图片下载,直接在script中创建imgae数组,循环的将图片的地址信息传递给各个image元素的src特性即可 懒加载实现: <!DOCTYPE html> <html lang="en">

前端性能优化 懒加载和预加载

懒加载 图片进入可视区域之后请求图片资源.对于电商等图片很多,页面很长的业务场景适用.减少无效资源的加载.并发加载的资源过多会阻塞 js 的加载,影响网站的正常使用. 浏览器解析的过程中,遇到image里面有src,他就会去请求 src 里面的资源,在真实场景中,我们希望图片进入可视区域之后,src 才会被设置进去,而不是一开始可视区域之外的 img 就设置了 src ,如果已经设置了,显然没在可是区域就去加载了.所以一开始不在可视区域的图片只是一个占位符,他真正的 url 存放在 data-u

基于用户行为的图片等资源预加载

一.图片的懒加载和预加载 懒加载和本文要提到的预加载实际是不同的概念. 典型的懒加载,例如本博文章的图片,当用户滚动图片进入窗体的时候,才去加载:或者用户点击选项卡,原本隐藏的图片此时再去加载,这个也称之为懒加载. 而预加载则是,用户还没有行为发生,资源已经加载完毕,从这一定义来讲,我们传统图片啪啪啪全部加载完毕,本质上也是预加载,好处就在于,体验好啊,没有泛白或者菊花的出现.不足也很明显,那就是资源可能白白加载了,尤其视频之类的,小明打开bilibili就是来围观广告的,结果,百兆视频巴拉拉魔

JS代理模式实现图片预加载

---恢复内容开始--- 刚刚说了懒加载,现在我们来搞搞预加载吧 预加载的核心: 图片等静态资源在使用前提前请求. 资源后续使用可以直接从缓存中加载,提升用户体验. 几个误区: 预加载不是为了减少页面加载时间 预加载只是提前加载除去首轮加载的图片以后要用到的图片,比如通过点击等事件才会用到的 上一份代码给大家理解理解,大家可以跟着注释理解理解,一个很简单的小栗子,别忘了改图片路径 <!DOCTYPE html> <html lang="en"> <head