懒加载和预加载

作者: xiaolizhenzhen | 来源:发表于2016-12-28 11:24 被阅读29924次

    1、懒加载

    1.什么是懒加载?

    懒加载也就是延迟加载。
    当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。这就是图片懒加载。

    2.为什么要使用懒加载?

    很多页面,内容很丰富,页面很长,图片较多。比如说各种商城页面。这些页面图片数量多,而且比较大,少说百来K,多则上兆。要是页面载入就一次性加载完毕。估计大家都会等到黄花变成黄花菜了。

    3.懒加载的原理是什么?

    页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片,只有通过javascript设置了图片路径,浏览器才会发送请求。
    懒加载的原理就是先在页面中把所有的图片统一使用一张占位图进行占位,把正真的路径存在元素的“data-url”(这个名字起个自己认识好记的就行)属性里,要用的时候就取出来,再设置;

    4.懒加载的实现步骤?

    1)首先,不要将图片地址放到src属性中,而是放到其它属性(data-original)中。
    2)页面加载完成后,根据scrollTop判断图片是否在用户的视野内,如果在,则将data-original属性中的值取出存放到src属性中。
    3)在滚动事件中重复判断图片是否进入视野,如果进入,则将data-original属性中的值取出存放到src属性中。

    5.懒加载的优点是什么?

    页面加载速度快、可以减轻服务器的压力、节约了流量,用户体验好

    2、预加载

    1.什么是预加载?

    提前加载图片,当用户需要查看时可直接从本地缓存中渲染

    2.为什么要使用预加载?

    图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验。

    3.实现预加载的方法有哪些?

    方法一:用CSS和JavaScript实现预加载
    方法二:仅使用JavaScript实现预加载
    方法三:使用Ajax实现预加载

    详见:http://web.jobbole.com/86785/

    3、懒加载和预加载的对比

    1)概念:
    懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。
    预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染。

    2)区别:
    两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载。懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。

    3)懒加载的意义及实现方式有:
    意义:
    懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。
    实现方式:
    1.第一种是纯粹的延迟加载,使用setTimeOut或setInterval进行加载延迟.
    2.第二种是条件加载,符合某些条件,或触发了某些事件才开始异步下载。
    3.第三种是可视区加载,即仅加载用户可以看到的区域,这个主要由监控滚动条来实现,一般会在距用户看到某图片前一定距离遍开始加载,这样能保证用户拉下时正好能看到图片。

    4)预加载的意义及实现方式有:
    意义:
    预加载可以说是牺牲服务器前端性能,换取更好的用户体验,这样可以使用户的操作得到最快的反映。
    实现方式:
    实现预载的方法非常多,比如:用CSS和JavaScript实现预加载;仅使用JavaScript实现预加载;使用Ajax实现预加载。
    常用的是new Image();设置其src来实现预载,再使用onload方法回调预载完成事件。只要浏览器把图片下载到本地,同样的src就会使用缓存,这是最基本也是最实用的预载方法。当Image下载完图片头后,会得到宽和高,因此可以在预载前得到图片的大小(方法是用记时器轮循宽高变化)。

    4、补充知识

    1. 屏幕可视窗口大小
            **原生方法**:
                window.innerHeight 标准浏览器及IE9+ ||
                document.documentElement.clientHeight 标准浏览器及低版本IE标准模式 ||
                document.body.clientHeight  低版本混杂模式
            **jQuery方法**: 
                $(window).height();
    
    1. 浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离:
            **原生方法**:
                  window.pagYoffset 标准浏览器及IE9+ ||
                  document.documentElement.scrollTop 兼容ie低版本的标准模式 ||
                  document.body.scrollTop 兼容混杂模式;
            **jQuery方法**:
                  $(document).scrollTop();
    
    1. 获取元素的尺寸
    $(o).width() = o.style.width;
    $(o).innerWidth() = o.style.width+o.style.padding;
    $(o).outerWidth() = o.offsetWidth = o.style.width+o.style.padding+o.style.border;
    $(o).outerWidth(true) = o.style.width+o.style.padding+o.style.border+o.style.margin;
    
    **注意**
    要使用原生的style.xxx方法获取属性,这个元素必须已经有内嵌的样式,如`<div style="...."></div>`;
    
    如果原先是通过外部或内部样式表定义css样式,必须使用`o.currentStyle[xxx] || document.defaultView.getComputedStyle(0)[xxx]`来获取样式值。
    
    1. 获取元素的位置信息
      jQuery
      $(o).offset().top元素距离文档顶的距离
      $(o).offset().left元素距离文档左边缘的距离。
      原生getoffsetTop();
      顺便提一下返回元素相对于第一个以定位的父元素的偏移距离,注意与上面偏移距的区别;
      jQuery:position()返回一个对象
      $(o).position().left = o.style.left;
      $(o).position().top = o.style.top;

    相关文章

      网友评论

      • chasing_dream:原生:getoffsetTop();
        顺便提一下返回元素相对于第一个以定位的父元素的偏移距离,注意与上面偏移距的区别;
        getoffsetTop(); 原生有这个方法吗?
      • 3c93ba25c6df:我想用懒加载 但是这些方法不知道应用到哪 有实例的话会更加完美
      • strugglexiang:学习了
      • togor:答主写的不错,不过有两个地方貌似不太准确:
        1,懒加载部分:占位符不应该加的。因为加不加占位符对于真正要显示的图片没有影响,当你把真正的图片地址放在src上时,浏览器都回去请求图片资源。而加了占位符又要多去请求一次占位符,可谓多此一举。
        2,预加载貌似使用css并不能实现,因为css样式最多只能够设置背景或者边框背景,而这种样式设置引用图片资源的优先级是很低的,倒不如直接在页面中添加一个img标签来的快些。
        若末lan:虽然很久了,但还是想说一下,css是可以实现预加载的
        togor:@饥人谷_luoxin 嗯,这种场景下是有必要加的。
        饥人谷_luoxin:占位符,我觉得还是需要的,假如,用户下拉的很快导致你请求的图片很多的时候,占位符体验更优。
      • 6bae58faf599:大佬.写的不错.但是为什么没有贴出懒加载的代码或者是链接呢
      • NekoSakura:pjax 和 懒加载(我更喜欢叫延迟加载0w0) 与预加载能不能结合使用呢?
      • 2c45a6d04b27:不错,学习了。
        BTW,纠错,补充知识第二点, window.pagYoffset ,应该是window.pageYOffset
        xiaolizhenzhen: @hpugongying 嗯嗯,写的时候疏忽了,谢喽
      • _LG_:赞!!
      • b21aa0468ba4:棒~看懂原理了,再去试着写一下,多谢分享
      • 谦龙:赞 对理解懒加载和预加载挺有作用
      • db38accb7698:写的很好哦
        xiaolizhenzhen: @db38accb7698 谢谢~

      本文标题:懒加载和预加载

      本文链接:https://www.haomeiwen.com/subject/bslyvttx.html