当页面图片比较多的时候,我们通常会做一个延迟加载,避免页面打开时一下子的请求数太多,加载过慢影响用户体验。

如果项目用了jquery框架,则可以直接用 jquery.lazyload.可在jquery官网下载到。

如果项目是基于原生js的,可以参考以下:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>lazyload class</title>
<style>
img{width:auto; height:300px;}
</style>
</head>
<body>
<h1>测试图片延迟加载效果</h1>
<p><img data-url="images/p1.jpg" src="data:images/grey.gif" alt="p1"></p>
<p><img data-url="images/p2.jpg" src="data:images/grey.gif" alt="p2"></p>
<p><img data-url="images/p3.jpg" src="data:images/grey.gif" alt="p3"></p>
<p><img data-url="images/p4.jpg" src="data:images/grey.gif" alt="p4"></p>
<p><img data-url="images/p5.jpg" src="data:images/grey.gif" alt="p5"></p>
<p><img data-url="images/p6.jpg" src="data:images/grey.gif" alt="p6"></p>
<script>
var API = {
on : function(ele, ev, handler){
ele.addEventListener ? ele.addEventListener(ev, handler) : ele.attachEvent('on' + ev, handler);
return ele;
},
bind: function(obj, handler){
return function(){ handler.apply(obj,arguments); }
},
pageX: function(ele){
var left = 0;
do{
left += ele.offsetLeft;
}while(ele.offsetParent && (ele = ele.offsetParent).className.toLowerCase() !=='body');
return left;
},
pageY: function(ele){
var top = 0;
do{
top += ele.offsetTop;
}while(ele.offsetParent && (ele = ele.offsetParent).className.toLowerCase() !=='body');
return top;
},
hasClass: function(ele,cls){
return new RegExp('^|\\s' + cls + '\\s|$').test(ele.className);
},
attr: function(ele,attr,val){
if(val===undefined){
return ele.getAttribute(attr);
}else{
return ele.setAttribute(attr, val);
}
}
}; function Lazyload(id, diff, attr){
this.container = typeof id === 'string' ? document.getElementById(id) : document.body;
this.imgs = [].slice.call(this.container.getElementsByTagName('img'));
this.diff = diff || 0;
this.attr = attr || "data-url";
this.load();//尝试加载正处在视窗中的图片
this.spyScroll();
} Lazyload.prototype = {
constructor: Lazyload,
spyScroll: function(){
API.on(window, 'scroll', API.bind(this, this.load) );
},
load: function(){
if(!this.imgs.length) return; //all image loaded
var pos,url,imgs = this.imgs.slice();//copy the array
var c=0;
for(var i = 0, len = imgs.length; i < len; i++){
pos = this.pos2viewport(imgs[i]);
if(pos === 'above' || pos === 'in'){ //console.log(imgs[i],pos,i,' imgs.length=',len);
url = API.attr(imgs[i], this.attr);
API.attr(imgs[i], 'src',url);
API.on(imgs[i], 'load', function(){
this.style.width='auto';//图片加载后 采用图片真实尺寸
this.style.height = 'auto';
});
this.imgs.splice(i-c,1); c++;//保持两数组元素的对应关系
}
}
},
pos2viewport:function(img){//img's position relative to viewport. above, in , below
var imgScrollTop = API.pageY(img), diff = this.diff,
rangeT = imgScrollTop - diff,
rangeB = imgScrollTop + img.clientHeight + diff,
viewportT = document.documentElement.scrollTop || document.body.scrollTop,
viewportB = viewportT + document.documentElement.clientHeight;
var pos = '';
viewportT >= rangeB && (pos = 'above');
viewportB <= rangeT && (pos = 'below');
!pos && (pos = 'in');
return pos;
}
}; var lazy = new Lazyload(document.body, 50);
</script>
</body>
</html>

基于原生js的图片延迟加载的更多相关文章

  1. 原生Js页面滚动延迟加载图片

    原理和过程1.页面滚动加载事件2.获取元素在页面里的top值 根据滚动条的位置 判断何时显示图片3.获取元素集合 加载过的图片从集合里删除 效果预览:http://jsfiddle.net/dtdxr ...

  2. 用jQuery基于原生js封装的轮播

    我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址 ...

  3. 基于原生js的返回顶部组件,兼容主流浏览器

    基于原生js的返回顶部插件,兼容IE8及以上.FF.chrome等主流浏览器. js文件中封装了getScrollTop()和changeScrollTop()函数分别用于获取滚动条滚动的高度和修改滚 ...

  4. 原生JS—实现图片循环切换的两种方法

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们先简单介绍一下所用的一些知识点. ...

  5. 原生JS—实现图片循环切换及监测鼠标滚动切换图片

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法以及如何检测鼠标滚动循环切换图片.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们 ...

  6. 页面性能优化-原生JS实现图片懒加载

    在项目开发中,我们往往会遇到一个页面需要加载很多图片的情况.我们可以一次性加载全部的图片,但是考虑到用户有可能只浏览部分图片.所以我们需要对图片加载进行优化,只加载浏览器窗口内的图片,当用户滚动时,再 ...

  7. 基于原生JS的jsonp方法的实现

    基于原生JS的jsonp方法的实现 jsonp,相信大家并不陌生,是在js异步请求中解决跨域的方法之一,原理很简单,有不清楚的同学可以google下,这里就补详细解释了.在Jquery库中,jQuer ...

  8. 基于原生JS封装数组原型上的sort方法

    基于原生JS封装数组原型上的sort方法 最近学习了数组的原型上内置方法的封装,加强了用原生JS封装方法的能力,也进一步理解数组方法封装的过程,实现的功能.虽然没有深入底层,了解源码.以下解法都是基于 ...

  9. 原生js实现图片轮播思路分析

    一.复习原生js实现图片轮播 1.要点 自动轮播 点击小圆圈按钮,显示相应图片 点击左右箭头,实现向前向后轮播图片 2.实现思路 <div id="container"> ...

随机推荐

  1. 【转载】Android Studio jar、so、library项目依赖,原文链接http://zhengxiaopeng.com/2014/12/13/Android-Studio-jar、so、library项目依赖/

    前言 Android Studio(以下简称AS)在13年I/O大会后放出预览版到现在放出的正式版1.0(PS.今天又更新到1.0.1了)历时一年多了,虽然Google官方推出的Android开发者的 ...

  2. ArrayList和LinkedList的各项操作性能比较

          如果用java编写程序,我们通常存储易变的数据集合时用到的数据结构往往是ArrayList,不过,在JDK中还存在另一个结构--LinkedList,只不过我们通常不用,原因在于性能问题, ...

  3. [置顶] 【GBT28181开发:SIP协议实践】之设备远程启动

    下面学习的是设备远程控制的流程,和设备信息.设备目录.设备状态的流程差不多,主要是描述的协议字段不同,模拟SPVMN系统向源设备发送远程启动控制指令,记录下交互的消息,详细研究了下: 转载请注明出处: ...

  4. HDU 1051 Wooden Sticks (贪心)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  5. 关于TableViewCell高度自适应问题的整理

    TableViewCell高度自适应在网上有很多资料,我只想找出最最最简单的一种方法. 首先梳理一下思路.说到TableViewCell我们第一个想到的问题或许就是cell的复用问题. 1.  [se ...

  6. Queue(队列)

    队列是一种后进后出的数据结构,下面介绍一下队列中常见的函数: 一.queue 中的 empty 函数 queue<int> q ; q.empty() ;  // 若队列中无元素,返回tr ...

  7. C++重载赋值运算符

    这是一道C++的面试题,下面在这篇博客中分析一下这个问题.先上题目: //题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: ...

  8. comparable与comparator比较

    两种比较接口分析 前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用. 一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的.如果用数学 ...

  9. codeforces 609E. Minimum spanning tree for each edge 树链剖分

    题目链接 给一个n个节点m条边的树, 每条边有权值, 输出m个数, 每个数代表包含这条边的最小生成树的值. 先将最小生成树求出来, 把树边都标记. 然后对标记的边的两个端点, 我们add(u, v), ...

  10. 0603 python 基础02

    作业1:ANSI和utf8的区别? ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits). 可以表示的最大字符数是256,一般只用前128个(最高位为0),其中包括 ...