原生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 相关文章推荐
把input初始值不写value的具体实现方法
Jul 04 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
Sep 26 Javascript
nodeType属性返回被选节点的节点类型介绍
Nov 22 Javascript
jquery移动节点实例
Jan 14 Javascript
JavaScript采用递归算法计算阶乘实例
Aug 04 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
Feb 19 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
微信小程序之蓝牙的链接
Sep 26 Javascript
vue实现文章内容过长点击阅读全文功能的实例
Dec 28 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
vue绑定事件后获取绑定事件中的this方法
Sep 15 Javascript
jQuery实现移动端笔触canvas电子签名
May 21 jQuery
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+Html+缓存
2006/12/20 PHP
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
php实现购物车功能(下)
2016/01/05 PHP
PHP asXML()函数讲解
2019/02/03 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
python matplotlib中的subplot函数使用详解
2020/01/19 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python实现读取并写入Excel文件过程解析
2020/05/27 Python
浅谈Python中的继承
2020/06/19 Python
python中selenium库的基本使用详解
2020/07/31 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
有个性的自我评价范文
2013/11/15 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
会计人员岗位职责
2014/03/19 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
单位婚育证明范本
2014/11/21 职场文书
Django操作cookie的实现
2021/05/26 Python
mysql主从复制的实现步骤
2021/10/24 MySQL