原生Js页面滚动延迟加载图片实现原理及过程


Posted in Javascript onJune 24, 2013

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

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>原生Js页面滚动延迟加载图片</title> 
<style type="text/css"> 
*{margin: 0;padding: 0} 
img.scrollLoading{border: 1px solid #ccc;display: block;margin-top: 10px;} 
</style> 
</head> 
<body> 
<div id="content"></div> 
</body> 
</html> 
<script type="text/javascript"> 
var _CalF = { 
$ : function(object){//选择器 
if(object === undefined ) return; 
var getArr = function(name,tagName,attr){ 
var tagName = tagName || '*', 
eles = document.getElementsByTagName(tagName), 
clas = (typeof document.body.style.maxHeight === "undefined") ? "className" : "class";//ie6 
attr = attr || clas, 
Arr = []; 
for(var i=0;i<eles.length;i++){ 
if(eles[i].getAttribute(attr)==name){ 
Arr.push(eles[i]); 
} 
} 
return Arr; 
}; 
if(object.indexOf('#') === 0){ //#id 
return document.getElementById(object.substring(1)); 
}else if(object.indexOf('.') === 0){ //.class 
return getArr(object.substring(1)); 
}else if(object.match(/=/g)){ //attr=name 
return getArr(object.substring(object.search(/=/g)+1),null,object.substring(0,object.search(/=/g))); 
}else if(object.match(/./g)){ //tagName.className 
return getArr(object.split('.')[1],object.split('.')[0]); 
} 
}, 
getPosition : function(obj) { //获取元素在页面里的位置和宽高 
var top = 0, 
left = 0, 
width = obj.offsetWidth, 
height = obj.offsetHeight; 
while(obj.offsetParent){ 
top += obj.offsetTop; 
left += obj.offsetLeft; 
obj = obj.offsetParent; 
} 
return {"top":top,"left":left,"width":width,"height":height}; 
} 
}; //添加图片list 
var _temp = []; 
for (var i = 1; i < 21; i ++) { 
_temp.push('<img class="scrollLoading" data-src="http://images.cnblogs.com/cnblogs_com/Darren_code/311197/o_' + i + '.jpg" src="http://images.cnitblog.com/blog/150659/201306/23160223-c81dd9aa9a2a4071a47b0ced2c9118bc.gif" /><br />图片' + i); 
} 
_CalF.$("#content").innerHTML = _temp.join(""); 
function scrollLoad(){ 
this.init.apply(this, arguments); 
} 
scrollLoad.prototype ={ 
init : function(className){ 
var className = "img."+className, 
imgs = _CalF.$(className), 
that = this; 
this.imgs = imgs; 
that.loadImg(); 
window.onscroll = function(){ 
that.time = setTimeout(function(){ 
that.loadImg(); 
},400); 
} 
}, 
loadImg : function(){ 
var imgs = this.imgs.reverse(), //获取数组翻转 
len = imgs.length; 
if(imgs.length===0){ 
clearTimeout(this.time); 
return; 
} 
for(var j=len-1;j>=0;j--){ //递减 
var img = imgs[j], 
imgTop = _CalF.getPosition(img).top, 
imgSrc = img.getAttribute("data-src"), 
offsetPage = window.pageYOffset ? window.pageYOffset : window.document.documentElement.scrollTop,//滚动条的top值 
bodyHeight = document.documentElement.clientHeight; //body的高度 
if((offsetPage+bodyHeight/2) > (imgTop-bodyHeight/2)){ 
img.src = imgSrc; 
this.imgs.splice(j,1); 
} 
} 
} 
} 
var img1 = new scrollLoad("scrollLoading"); 
</script>
Javascript 相关文章推荐
解决JS浮点数运算出现Bug的方法
Mar 12 Javascript
Js操作Select大全(取值、设置选中等等)
Oct 29 Javascript
node.js读取文件到字符串的方法
Jun 29 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
Oct 02 Javascript
详解javascript的变量与标识符
Jan 04 Javascript
JS对HTML表格进行增删改操作
Aug 22 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
Sep 09 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
May 24 Javascript
认识less和webstrom的less配置方法
Aug 02 Javascript
JS实现利用两个队列表示一个栈的方法
Dec 13 Javascript
实例讲解JavaScript截取字符串
Nov 30 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
Nov 21 Javascript
jquery可见性过滤选择器使用示例
Jun 24 #Javascript
jquery子元素过滤选择器使用示例
Jun 24 #Javascript
struts2+jquery+json实现异步加载数据(自写)
Jun 24 #Javascript
通过javascript获取iframe里的值示例代码
Jun 24 #Javascript
javascript实现焦点滚动图效果 具体方法
Jun 24 #Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
Jun 24 #Javascript
onbeforeunload与onunload事件异同点总结
Jun 24 #Javascript
You might like
PHP 彩色文字实现代码
2009/06/29 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
JS常见算法详解
2017/02/28 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
安装python及pycharm的教程图解
2019/10/10 Python
如何基于python操作json文件获取内容
2019/12/24 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
简历上的自我评价怎么写
2014/01/28 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
供货协议书
2014/04/22 职场文书
爱心倡议书范文
2014/05/12 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
共青团员自我评价
2015/03/10 职场文书
大专护理专业自荐信
2015/03/25 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书