原生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 相关文章推荐
jQuery Ajax之load()方法
Oct 12 Javascript
通过js动态操作table(新增,删除相关列信息)
May 23 Javascript
JS日期格式化之javascript Date format
Oct 01 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
Oct 29 Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 Javascript
JavaScript中清空数组的方法总结
Dec 02 Javascript
vue.js学习之递归组件
Dec 13 Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 Javascript
vue 中directive功能的简单实现
Jan 05 Javascript
在vue 中使用 less的教程详解
Sep 26 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
Feb 13 Javascript
Vue3.x源码调试的实现方法
Oct 13 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网站提速三大“软”招
2006/10/09 PHP
PHP静态类
2006/11/25 PHP
DISCUZ 分页代码
2007/01/02 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
js全选按钮的实现方法
2015/11/17 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
js复制内容到剪贴板代码,js复制代码的简单实例
2016/10/27 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python 自动化表单提交实例代码
2017/06/08 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
python利用tkinter实现屏保
2019/07/30 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
python代码如何注释
2020/06/01 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
实习生个人找工作的自我评价
2013/10/30 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
浅谈python中的多态
2021/06/15 Python
python 常用的异步框架汇总整理
2021/06/18 Python
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
在python中读取和写入CSV文件详情
2022/06/28 Python