原生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自定义方法通过隐藏iframe实现文件下载
Feb 21 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
Apr 30 Javascript
window.location.reload 刷新使用分析(去对话框)
Nov 11 Javascript
微信小程序 video组件详解
Oct 25 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
Dec 23 Javascript
WebView启动支付宝客户端支付失败的问题小结
Jan 11 Javascript
vue.js的提示组件
Mar 02 Javascript
vue-cli webpack 开发环境跨域详解
May 18 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 Javascript
浏览器JavaScript调试功能无法使用解决方案
Sep 18 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实现文件下载代码分享
2014/08/19 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
[02:14]DOTA2英雄基础教程 修补匠
2013/12/23 DOTA
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
替换python字典中的key值方法
2018/07/06 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Python实现的线性回归算法示例【附csv文件下载】
2018/12/29 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
深入分析python 排序
2020/08/24 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
Linux开机引导的步骤是什么
2015/10/19 面试题
小班秋游活动方案
2014/02/22 职场文书
地震捐款倡议书
2014/08/29 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
雨花台导游词
2015/02/06 职场文书
2015年财政局工作总结
2015/05/21 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python
mysql创建存储过程及函数详解
2021/12/04 MySQL