原生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 相关文章推荐
JavaScript 学习笔记(十一)
Jan 19 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
Feb 13 Javascript
javascript 3d 逐侦产品展示(核心精简)
Mar 26 Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 Javascript
JS DOM实现鼠标滑动图片效果
Sep 17 Javascript
js点击返回跳转到指定页面实现过程
Aug 20 Javascript
javascript之IE版本检测超简单方法
Aug 20 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
Apr 25 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
JS中的Replace()传入函数时的用法详解
Sep 11 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
Feb 23 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 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
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
用javascript控制iframe滚动的代码
2007/04/10 Javascript
JS location几个方法小姐
2008/07/09 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
2016/02/19 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python函数返回值实例分析
2015/06/08 Python
python win32 简单操作方法
2017/05/25 Python
利用Python破解斗地主残局详解
2017/06/30 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
体育教师工作总结的自我评价
2013/10/10 职场文书
客服工作职责
2013/12/11 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
道路施工安全责任书
2014/07/24 职场文书
五年级下册复习计划
2015/01/19 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
成人成长感言如何写?
2019/08/16 职场文书