预加载和懒加载(延迟加载)

一、预加载

前面做了个招聘页面,里面有大量的图片需要加载。

一开始都是全部写在页面中,在测试环境还看不出很慢,一放到正式环境就不对了。

微信浏览器本来就觉得慢,现在一下子要加载这么多图片,一下子就把屏幕弄白了,过了几十秒后才会完整的出现Loading图片。

这显然是无法忍受的,马上就加了预加载的功能,我只是简单的使用了一下。

预加载就是通过Image对象,给这个对象添加“src”属性,并可以将此对象缓存起来,以后再使用。

<img src="blank.png" data-src="img/p2/1.png" class="img1">

我先给img赋个空白图,然后通过JS来给src赋data-src中的值,预加载的逻辑从网上找到了相关代码。

复制代码
function loadImage(url, callback) {
    var img = new Image();
    img.src = url;
    if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数 防止IE6不执行onload BUG
        callback.call(img);
        return;
    }
    img.onload = function () {
        callback.call(img);//将回调函数的this替换为Image对象
    };
};
复制代码

GTmetrix网上做了下性能测试,这个网站会提出改进的建议,并会说明这个改进的具体说明。

还配备了YSlow和PageSpeed性能工具。

在Waterfall中有资源加载记录,加了data-src属性的图片会在JS脚本之后再载入,这样的话就不会影响Loading效果显示了。

 

二、懒加载

一般懒加载就是当你做滚动到页面某个位置,然后再显示当前位置的图片,这样做可以减少页面请求。

参考了两个比较火的开源库,jquery_lazyloadlayzr.js,两者的人气都很足,不过前者是需要引入jQuery库的,后者不需要。

当页面过长的时候就会出现滚动条,而当年滚动到下面的时候,上面的页面就会看不到,下图中绿色部分就是那隐藏的页面。

通过计算,可以获取图片的两个距离值,图中标注了,然后判断是否在当前可视区域的顶部和底部的范围内,如果是就加载图,不是就不加载。

假设滚动条是在body中,那么当前可视区域的范围是:

viewTop = window.scrollY || window.pageYOffset;
viewBottom = window.innerHeight + viewTop;

而图片的top和height是:

nodeTop = node.getBoundingClientRect().top + viewTop;
nodeBottom = nodeTop + node.offsetHeight;

在上面出现了几个尺寸的概念。

Window.scrollYWindow.pageYOffset意思差不多,指的是滚动条顶部到网页顶部的距离。

Window.innerHeight 表示该容器中页面视图区的高度(减去边框宽度)。

Element.getBoundingClientRect() 方法返回元素的大小及其相对于视口的位置。

HTMLElement.offsetHeight = height+padding+border。

更多的尺寸属性可以参考《JavaScript中尺寸、坐标

最后在给某个容器绑定“scroll”事件,上面的话是给“window”绑定。

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/

懒加载和预加载的对比

1)概念:

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

2)区别:

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

3)懒加载的意义及实现方式有:

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

4)预加载的意义及实现方式有:

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

  **原生方法**:
        window.innerHeight 标准浏览器及IE9+ ||
        document.documentElement.clientHeight 标准浏览器及低版本IE标准模式 ||
        document.body.clientHeight  低版本混杂模式
    **jQuery方法**: 
        $(window).height();

浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离:

 **原生方法**:
          window.pageYOffset 标准浏览器及IE9+ ||
          document.documentElement.scrollTop 兼容ie低版本的标准模式 ||
          document.body.scrollTop 兼容混杂模式;
    **jQuery方法**:
          $(document).scrollTop();

获取元素的尺寸

$(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]来获取样式值。

获取元素的位置信息
jQuery:
$(o).offset().top元素距离文档顶的距离
$(o).offset().left元素距离文档左边缘的距离。
原生:offsetTop();
顺便提一下返回元素相对于第一个以定位的父元素的偏移距离,注意与上面偏移距的区别;

jQuery:position()返回一个对象

$(o).position().left = o.style.left;
$(o).position().top = o.style.top
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值